JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 程式分享區 » 數獨、猜數字  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 [猜數字系列]DeepGreen v1.2 深綠 vs DeepCafe
Yoshi

塵世中一個迷途小書僮

版主

發文: 874
積分: 22
於 2004-03-01 09:23 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
DeepCafe 0.1 Information:
http://www.javaworld.com.tw/jute/post/view?bid=35&id=35721&tpg=1&ppg=1&sty=1&age=0#35721

深咖啡(DeepCafe 0.1)向DeepGreen 1.0下了挑戰書,並且以5.5529761904761905,表示比DeepGreen 1.0快了約0.0074次猜到答案。
所以昨天我特地重新打造DeepGreen 1.0,在花了我二小時的睡眠時間,將DeepGreen重新打造,以下面的數據與DeepCafe 0.1做個比較。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DeepCafe 1.0
0 => 0
1 => 1
2 => 9
3 => 89
4 => 556
5 => 1746
6 => 1839
7 => 692
8 => 103
9 => 5
10 => 0
11 => 0
12 => 0
13 => 0
14 => 0
 Average : 27987 / 5040 = 5.5529761904761905


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DeepGreen 1.2
0->0
1->1
2->13
3->108
4->582
5->1633
6->1881
7->722
8->99
9->1
10->0
11->0
12->0
13->0
14->0
15->0
16->0
17->0
18->0
19->0
Average=27985/5040= 5.552579365079365
Time costs: 14500060 Milli Seconds


大家可以看到,DeepGreen 1.2以"2"次小勝DeepCafe 1.0(還真的夠少了)
以39次超越舊版的DeepGreen 1.0
如果把DeepCafe在3A時的特殊處理方法學習過來,DeepGreen將會有更出色的表現
而且注意到這裡,DeepGreen要猜九次的情況,只有一個數字而已

-->DeepGreen 1.2 Wins Out! <--

Source Code暫時沒辦法Po出來,因為是凌晨臨時寫的,我需要點時間來調整程式碼
目前暫時研究到這裡,因為十點要上課我得快點出門了...

PS:此份測試資料,已排除亂數問題。


caterpillar edited on 2005-12-26 00:35
reply to postreply to post
YOSHI!
作者 Re:DeepGreen v1.2 深綠 vs DeepCafe [Re:Yoshi]
sdargon





發文: 109
積分: 0
於 2004-03-01 10:23 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
突然想問一個問題
如果是"人"在跟"人"玩時..
會不會出現得猜九次才猜得出來的數字?


reply to postreply to post
作者 Re:DeepGreen v1.2 深綠 vs DeepCafe [Re:sdargon]
Yoshi

塵世中一個迷途小書僮

版主

發文: 874
積分: 22
於 2004-03-01 12:59 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
sdargon wrote:
突然想問一個問題
如果是"人"在跟"人"玩時..
會不會出現得猜九次才猜得出來的數字?


人跟人玩? 要出現幾次都有可能吧....

現在討論的就是, 用什麼樣的方法可以讓猜的次數最少
目前為止, DeepGreen 1.2的做法, 可以讓要猜9次的情況, 只有一組數字會產生

人類當然也可以用和DeepGreen 1.2一樣的做法去猜啊
只是看人類有沒有那麼大的計算能力而已....


reply to postreply to post
YOSHI!
作者 Re:DeepGreen v1.2 深綠 vs DeepCafe [Re:Yoshi]
Yoshi

塵世中一個迷途小書僮

版主

發文: 874
積分: 22
於 2004-03-01 23:48 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
http://www.javaworld.com.tw/jute/post/view?bid=35&id=35572&sty=1&tpg=1&age=0
這個話題已經燒成這樣了,而且裡面討論的東西越來越困難...
之前寫這個猜數字數字程式只是為了好玩,然後DeepCafe來挑戰,我也覺得很好玩
現在也只是為了好玩寫出改版的DeepGreen~

我的做法是統計answerSet裡目前可能的解,0~9出現的所有次數
然後試圖根據出現最多次的4個數字來猜,比如3579出現最多次
那我就先找answerSet有沒有3579, 5379, 5397...等
如果沒有的話,則再找最像的,比如3570, 5790...等
這個程式的做法大致上就是這樣,暫時沒有把DeepCafe在處裡3A時的做法學來
這個程式效率很差,原本我晚上要改寫它的,不過真的沒心情了...

最近有點忙,加上一些事情心情弄得很不好...大概暫時不會再去玩這個東西了
剛剛我女朋友和我說,八點的時候他在路上被搶劫了(就jini公司不遠處),
我送他的皮包,還有一些證件,都被這位機車搶劫的人搶走了....唉...
心情有夠差的...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
import java.io.*;
public class DeepGreen2 {
 
  private int[] answerSet = new int[10*9*8*7];
  private int[] toGuessSet = new int[10*9*8*7];
  private int guessingPivot=0;
  private int count;
  public DeepGreen2() {
    int index=0;
    for (int n1=0; n1<10; n1++) {
      for (int n2=0; n2<10; n2++) {
        if ( n2 == n1) continue;
        for (int n3=0; n3<10; n3++) {
          if (n3 == n2 || n3 == n1 ) continue;
          for (int n4=0; n4<10; n4++) {
            if ( n4==n1 || n4==n2 || n4==n3) continue;
            toGuessSet[index] = n1*1000+n2*100+n3*10+n4;
            answerSet[index++] = n1*1000+n2*100+n3*10+n4;
          }
        }
      }
    }
  }
  private void generateSet() {
    int index=0;
    for (int n1=0; n1<10; n1++) {
      for (int n2=0; n2<10; n2++) {
        if ( n2 == n1) continue;
        for (int n3=0; n3<10; n3++) {
          if (n3 == n2 || n3 == n1 ) continue;
          for (int n4=0; n4<10; n4++) {
            if ( n4==n1 || n4==n2 || n4==n3) continue;
            answerSet[index++] = n1*1000+n2*100+n3*10+n4;
          }
        }
      }
    }
  }
  private boolean input(int number) {
    /*
    System.out.print( transform(number) + ", ?A?B = ");
    int a=0,b=0;
    try {
      BufferedReader br = new BufferedReader (new InputStreamReader (System.in));
      String str  = br.readLine();
      while ( str.length() != 4 ) {
        System.out.println("輸入錯誤, 格式為 ?A?B ");
        System.out.print( transform(number) + ", ?A?B = ");
        str = br.readLine();
      }
      a = str.charAt(0) - '0';
      b = str.charAt(2) - '0';
    }
    catch (IOException e) {
      System.out.println("輸入時發生不可預期的錯誤...");
      System.exit(0);
    }
    */
    int a=getA(number, toGuessSet[guessingPivot]);
    int b=getB(number, toGuessSet[guessingPivot]);
    if (a == 4) {
      System.out.println("The answer is " + transform(number) + ", " + count + " times.");
      //System.exit(0);
      return true;
    }
    reduce(number,a,b);
    return false;
  }
  private int generateN() {
    int[] seq = new int[10];
    for (int i=0; i< answerSet.length; i++) {
      if ( answerSet[i] == -1 ) continue;
      for(int k=0; k<4; k++) {
        int p=transform(answerSet[i]).charAt(k)-'0';
        seq[p]++;
      }
    }
    int[] maxFour = new int[4];
    int max=-1, pivot=-1;
    for(int j=0; j<4; j++) {
      for(int i=0; i<10; i++) {
        if(seq[i]>max) {
          max=seq[i];
          pivot=i;
        }
      }
      seq[pivot]=-1;
      maxFour[j]=pivot;
      pivot=-1;
      max=-1;
    }
    int n=Integer.parseInt(""+maxFour[0]+maxFour[1]+maxFour[2]+maxFour[3]);
    //4b
    for(int i=0; i<answerSet.length; i++) {
      if(answerSet[i]==-1) continue;
      int b= getB(n,answerSet[i]);
      if(b==4) {
        return answerSet[i];
      }
    }
    //3b
    for(int i=0; i<answerSet.length; i++) {
      if(answerSet[i]==-1) continue;
      int b= getB(n,answerSet[i]);
      if(b==3) {
        return answerSet[i];
      }
    }
    //2b
    for(int i=0; i<answerSet.length; i++) {
      if(answerSet[i]==-1) continue;
      int b= getB(n,answerSet[i]);
      if(b==2) {
        return answerSet[i];
      }
    }
    //none
    for(int i=0; i<answerSet.length; i++) {
      if( answerSet[i]!=-1) {
        return answerSet[i];
      }
    }
    return -1; //wrong
  }
  private void guess() {
    int i=0;
    boolean flag=false;
    while(!flag) {
      int n= generateN();
      if(i>5040) {
        System.out.println("你騙人!! 根本沒這數字, ***!");
        System.exit(0);
      }
      if(answerSet[i]!=-1) {
        count++;
        flag=input(n);
        i=0;
        continue;
      }
      else {
        i++;
      }
    }
  }
  private void reduce(int number, int a, int b) {
    for (int i=0; i< answerSet.length;  i++) {
      if ( answerSet[i] == -1) continue;
      if (getA(number,answerSet[i]) != a || getB(number,answerSet[i]) != b )
        answerSet[i] = -1;
    }
    for (int i=0; i < answerSet.length; i++) {
      if ( answerSet[i] == -1) continue;
      //System.out.print( transform(answerSet[i]) + " ");
    }
    //System.out.println();
  }
 
  private int getA(int n1, int n2) {
    int a=0;
    String str1 = transform(n1);
    String str2 = transform(n2);
    for (int i=0; i<4; i++) {
      if (str1.charAt(i) == str2.charAt(i) )
        a++;
    }
    return a;
  }
  private String transform (int n) {
    if ( n < 1000 )
      return "0" + n;
    else
      return ""+n;
  }
  private int getB(int n1, int n2) {
    int b = 0;
    String str1 = transform(n1);
    String str2 = transform(n2);
    for (int i=0; i < 4; i++) {
      for (int j=0; j<4 ; j++) {
        if ( i == j) continue;
        if ( str1.charAt(i) == str2.charAt(j) )
          b++;
      }
    }
    return b;
  }
 
  public static void main (String [] args) {
    DeepGreen2 app = new DeepGreen2();
    int[] times=new int[20];
    int total=0;
    long t1=System.currentTimeMillis();
    for(int i=0; i<app.toGuessSet.length; i++) {
      app.guessingPivot=i;
      app.guess();
      app.generateSet();
      times[app.count]++;
      total+=app.count;
      System.out.println("Total is " + total + " now.");
      app.count=0;
    }
    long t2=System.currentTimeMillis();
    for(int i=0; i<times.length; i++) {
      System.out.println(i + "->" + times[i]);
    }
    System.out.println("Average=" + total + "/5040= " + (total/5040d));
    System.out.println("Time costs: " + (t2-t1) + " Milli Seconds");
  }
}


reply to postreply to post
YOSHI!
作者 Re:DeepGreen v1.2 深綠 vs DeepCafe [Re:Yoshi]
T55555

Java, Ruby, Haskell

版主

發文: 1026
積分: 24
於 2004-03-02 04:04 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Yoshi wrote:

最近有點忙,加上一些事情心情弄得很不好...大概暫時不會再去玩這個東西了
剛剛我女朋友和我說,八點的時候他在路上被搶劫了(就jini公司不遠處),
我送他的皮包,還有一些證件,都被這位機車搶劫的人搶走了....唉...
心情有夠差的...

同情...
會不會你女友想要另一個新的皮包?
就算不是, 現在也是送新的皮包大好時機. 塞翁失馬,焉知非福.


reply to postreply to post
作者 Re:DeepGreen v1.2 深綠 vs DeepCafe [Re:T55555]
sungo

瘋狂口罩大盜



發文: 822
積分: 17
於 2004-03-02 04:13 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
T55555 wrote:
同情...
會不會你女友想要另一個新的皮包?
就算不是, 現在也是送新的皮包大好時機. 塞翁失馬,焉知非福.

T loop five 你還有閒情逸致在這裡搞笑...擂臺賽開始了!!
快去準備準備∼∼

To 耀西:
別難過嘿!快把心情調整好,獎金比賽已經開始囉∼
你也要加油∼∼


reply to postreply to post
» JWorld@TW »  Java 程式分享區 » 數獨、猜數字

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8