??xml version="1.0" encoding="utf-8" standalone="yes"?>av成人毛片,国产一区二区在线电影,国产一区日韩http://www.aygfsteel.com/shiliqiang/category/40762.htmlI'm on my way!zh-cnSat, 22 Aug 2009 22:05:51 GMTSat, 22 Aug 2009 22:05:51 GMT60java中关于优先队列的实?/title><link>http://www.aygfsteel.com/shiliqiang/articles/291276.html</link><dc:creator>矛_@</dc:creator><author>矛_@</author><pubDate>Sat, 15 Aug 2009 09:25:00 GMT</pubDate><guid>http://www.aygfsteel.com/shiliqiang/articles/291276.html</guid><wfw:comment>http://www.aygfsteel.com/shiliqiang/comments/291276.html</wfw:comment><comments>http://www.aygfsteel.com/shiliqiang/articles/291276.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/shiliqiang/comments/commentRss/291276.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/shiliqiang/services/trackbacks/291276.html</trackback:ping><description><![CDATA[<div>        q几天一直在搞关于优先队列的实?因ؓ要考虑到线E的安全,所以PriorityQueue׃适用了。一个非常简单的实现? 法,那就是把优先U比较好的插入一个队列,优先U低的插入另一个队列,取数的时候先在优先高的队列上取数。这有个~点是如果优先U别多的话Q队列就 多?/div> <div>        因ؓ要线E安全,队列采用ConcurrentLinkedQueueq个U程安全的,而api文上说ConcurrentLinkedQueue采用了有效的“无等?(wait-free)”法Q所以它的吞吐量是很不错的!</div> <div>    单代码如下:</div> <ol class="highlighter-j"> <li><span id="wmqeeuq" class="keyword">package</span><span> test;</span><br /> </li> <li id="wmqeeuq" class="alt"><br /> </li> <li><span id="wmqeeuq" class="keyword">import</span><span> java.util.concurrent.ConcurrentLinkedQueue;</span></li> <li id="wmqeeuq" class="alt"><br /> </li> <li><span id="wmqeeuq" class="keyword">public</span><span> </span><span id="wmqeeuq" class="keyword">class</span><span> PriorityQueueTest {</span></li> <li id="wmqeeuq" class="alt"><br /> </li> <li><span>    </span><span id="wmqeeuq" class="keyword">public</span><span> </span><span id="wmqeeuq" class="keyword">static</span><span> </span><span id="wmqeeuq" class="keyword">void</span><span> main(String[] args) {</span></li> <li id="wmqeeuq" class="alt"><span>        ConcurrentLinkedQueue<String> highPriority = </span><span id="wmqeeuq" class="keyword">new</span><span> ConcurrentLinkedQueue<String>(); </span><span id="wmqeeuq" class="comment">//高优先</span></li> <li><span>        ConcurrentLinkedQueue<String> lowPriority = </span><span id="wmqeeuq" class="keyword">new</span><span> ConcurrentLinkedQueue<String>();  </span><span id="wmqeeuq" class="comment">//低优先</span></li> <li id="wmqeeuq" class="alt"><span>        </span></li> <li><span>        highPriority.add(</span><span id="wmqeeuq" class="string">"aaa"</span><span>);</span></li> <li id="wmqeeuq" class="alt"><span>        highPriority.add(</span><span id="wmqeeuq" class="string">"bbb"</span><span>);</span></li> <li><span>        highPriority.add(</span><span id="wmqeeuq" class="string">"111"</span><span>);</span></li> <li id="wmqeeuq" class="alt"><span>        </span></li> <li><span>        lowPriority.add(</span><span id="wmqeeuq" class="string">"ccc"</span><span>);</span></li> <li id="wmqeeuq" class="alt"><span>        lowPriority.add(</span><span id="wmqeeuq" class="string">"ddd"</span><span>);</span></li> <li><span>        lowPriority.add(</span><span id="wmqeeuq" class="string">"222"</span><span>);</span></li> <li id="wmqeeuq" class="alt"><span>        </span></li> <li><span>        </span><span id="wmqeeuq" class="keyword">int</span><span> i = </span><span id="wmqeeuq" class="number">0</span><span> ,j = </span><span id="wmqeeuq" class="number">0</span><span>, k=</span><span id="wmqeeuq" class="number">0</span><span>;</span></li> <li id="wmqeeuq" class="alt"><span>        </span><span id="wmqeeuq" class="keyword">while</span><span>(</span><span id="wmqeeuq" class="keyword">true</span><span>){</span></li> <li><span>            </span><span id="wmqeeuq" class="keyword">while</span><span>(</span><span id="wmqeeuq" class="keyword">true</span><span>){</span></li> <li id="wmqeeuq" class="alt"><span>                </span><span id="wmqeeuq" class="keyword">if</span><span>(!highPriority.isEmpty()){</span></li> <li><span>                    System.out.print(highPriority.remove());</span></li> <li id="wmqeeuq" class="alt"><span>                    i++;</span></li> <li><span>                    k++;</span></li> <li id="wmqeeuq" class="alt"><span>                    System.out.println(</span><span id="wmqeeuq" class="string">", i = "</span><span>+i+</span><span id="wmqeeuq" class="string">", k="</span><span>+k);</span></li> <li><span>                    </span><span id="wmqeeuq" class="keyword">break</span><span>;</span></li> <li id="wmqeeuq" class="alt"><span>                }</span></li> <li><span>                </span><span id="wmqeeuq" class="keyword">if</span><span>(!lowPriority.isEmpty()){</span></li> <li id="wmqeeuq" class="alt"><span>                    System.out.print(lowPriority.remove());</span></li> <li><span>                    j++;</span></li> <li id="wmqeeuq" class="alt"><span>                    k++;</span></li> <li><span>                    System.out.println(</span><span id="wmqeeuq" class="string">", j = "</span><span>+j+</span><span id="wmqeeuq" class="string">", k="</span><span>+k);</span></li> <li id="wmqeeuq" class="alt"><span>                    </span><span id="wmqeeuq" class="keyword">break</span><span>;</span></li> <li><span>                }</span></li> <li id="wmqeeuq" class="alt"><span>                </span><span id="wmqeeuq" class="keyword">break</span><span>;</span></li> <li><span>            }</span></li> <li id="wmqeeuq" class="alt"><span>            </span><span id="wmqeeuq" class="keyword">try</span><span> {</span></li> <li><span>                Thread.sleep(</span><span id="wmqeeuq" class="number">100</span><span>);</span></li> <li id="wmqeeuq" class="alt"><span>            } </span><span id="wmqeeuq" class="keyword">catch</span><span> (InterruptedException e) {</span></li> <li><span>                e.printStackTrace();</span></li> <li id="wmqeeuq" class="alt"><span>            }</span></li> <li><span>        }</span></li> <li id="wmqeeuq" class="alt"><span>    }</span></li> <li><span>}</span></li> </ol> <div><span id="wmqeeuq" class="Apple-style-span" style="color: #000000; line-height: 14px;"><br /> </span></div> <div><span id="wmqeeuq" class="Apple-style-span" style="color: #000000; line-height: 14px;">    <br /> </span></div> <div><span id="wmqeeuq" class="Apple-style-span" style="color: #000000; line-height: 14px;"> <br /> </span></div> <div><span id="wmqeeuq" class="Apple-style-span" style="color: #000000; line-height: 14px;">        </span></div> <div><span id="wmqeeuq" class="Apple-style-span" style="color: #000000; line-height: 14px;">      q有一U是Q通过l承<span id="wmqeeuq" class="Apple-style-span" style="color: #333333; line-height: normal;"><span id="wmqeeuq" class="Apple-style-span" style="color: #000000; line-height: 14px;">PriorityQueue</span><span id="wmqeeuq" class="Apple-style-span" style="color: #000000; line-height: 14px;">q实?span class="Apple-style-span" style="color: #333333; line-height: normal;">Comparable接口Q然后自已重写过compareToҎp实现很强大的优先U队列了Q不q缺ҎU程不安全的Q?/span></span></span></span></div> <div>      代码如下Q?/div> <div id="wmqeeuq" class="highlighter"> <ol class="highlighter-j"> <li><span id="wmqeeuq" class="keyword">package</span><span> test;</span></li> <li id="wmqeeuq" class="alt"><br /> </li> <li><span id="wmqeeuq" class="keyword">import</span><span> java.util.PriorityQueue;</span></li> <li id="wmqeeuq" class="alt"><br /> </li> <li><span id="wmqeeuq" class="keyword">public</span><span> </span><span id="wmqeeuq" class="keyword">class</span><span> PriorityTest </span><span id="wmqeeuq" class="keyword">extends</span><span> PriorityQueue<PriorityTest.Test>{</span></li> <li id="wmqeeuq" class="alt"><span>    </span><span id="wmqeeuq" class="keyword">static</span><span> </span><span id="wmqeeuq" class="keyword">class</span><span> Test </span><span id="wmqeeuq" class="keyword">implements</span><span> Comparable<Test>{</span></li> <li><span>        String packet;</span></li> <li id="wmqeeuq" class="alt"><span>        </span><span id="wmqeeuq" class="keyword">int</span><span> priotity;</span></li> <li><span>        </span></li> <li id="wmqeeuq" class="alt"><span>        </span><span id="wmqeeuq" class="keyword">public</span><span> Test(String packet, </span><span id="wmqeeuq" class="keyword">int</span><span> priotity) {</span></li> <li><span>            </span><span id="wmqeeuq" class="keyword">this</span><span>.packet = packet;</span></li> <li id="wmqeeuq" class="alt"><span>            </span><span id="wmqeeuq" class="keyword">this</span><span>.priotity = priotity;</span></li> <li><span>        }</span></li> <li id="wmqeeuq" class="alt"><span>        </span></li> <li><span>        </span><span id="wmqeeuq" class="keyword">public</span><span> </span><span id="wmqeeuq" class="keyword">int</span><span> compareTo(Test arg) { </span></li> <li id="wmqeeuq" class="alt"><span>            </span><span id="wmqeeuq" class="keyword">if</span><span>(priotity < arg.priotity)</span></li> <li><span>                </span><span id="wmqeeuq" class="keyword">return</span><span> </span><span id="wmqeeuq" class="number">1</span><span>;</span></li> <li id="wmqeeuq" class="alt"><span>            </span><span id="wmqeeuq" class="keyword">else</span><span> </span><span id="wmqeeuq" class="keyword">if</span><span>(priotity > arg.priotity)</span></li> <li><span>                </span><span id="wmqeeuq" class="keyword">return</span><span> -</span><span id="wmqeeuq" class="number">1</span><span>;</span></li> <li id="wmqeeuq" class="alt"><span>            </span><span id="wmqeeuq" class="keyword">else</span></li> <li><span>                </span><span id="wmqeeuq" class="keyword">return</span><span> </span><span id="wmqeeuq" class="number">0</span><span>;</span></li> <li id="wmqeeuq" class="alt"><span>        } </span></li> <li><span>        </span></li> <li id="wmqeeuq" class="alt"><span>        </span><span id="wmqeeuq" class="keyword">public</span><span> String toString(){</span></li> <li><span>            </span><span id="wmqeeuq" class="keyword">return</span><span> packet; </span></li> <li id="wmqeeuq" class="alt"><span>        }</span></li> <li><span>    }</span></li> <li id="wmqeeuq" class="alt"><span>    </span></li> <li><span>    </span><span id="wmqeeuq" class="keyword">public</span><span> </span><span id="wmqeeuq" class="keyword">void</span><span> add(String str, </span><span id="wmqeeuq" class="keyword">int</span><span> priority){</span></li> <li id="wmqeeuq" class="alt"><span>        </span><span id="wmqeeuq" class="keyword">super</span><span>.add(</span><span id="wmqeeuq" class="keyword">new</span><span> Test(str,priority));</span></li> <li><span>    }</span></li> <li id="wmqeeuq" class="alt"><span>    </span></li> <li><span>    </span><span id="wmqeeuq" class="keyword">public</span><span> </span><span id="wmqeeuq" class="keyword">static</span><span> </span><span id="wmqeeuq" class="keyword">void</span><span> main(String args[]){</span></li> <li id="wmqeeuq" class="alt"><span>        PriorityTest pTest = </span><span id="wmqeeuq" class="keyword">new</span><span> PriorityTest();</span></li> <li><span>        pTest.add(</span><span id="wmqeeuq" class="string">"aaa"</span><span>,</span><span id="wmqeeuq" class="number">3</span><span>);  <span id="wmqeeuq" class="Apple-style-span" style="color: #008200;">//优先U最?/span></span></li> <li id="wmqeeuq" class="alt"><span>        pTest.add(</span><span id="wmqeeuq" class="string">"bbb"</span><span>,</span><span id="wmqeeuq" class="number">2</span><span>);</span></li> <li><span>        pTest.add(</span><span id="wmqeeuq" class="string">"ccc"</span><span>,</span><span id="wmqeeuq" class="number">1</span><span>);</span></li> <li id="wmqeeuq" class="alt"><span>        </span></li> <li><span>        </span><span id="wmqeeuq" class="keyword">while</span><span>(!pTest.isEmpty()){</span></li> <li id="wmqeeuq" class="alt"><span>            System.out.println(pTest.remove());</span></li> <li><span>        }</span></li> <li id="wmqeeuq" class="alt"><span>    }</span></li> <li><span>}</span></li> <li id="wmqeeuq" class="alt"><br /> </li> </ol> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> 摘自Qhttp://blog.csdn.net/liuzhengkang/archive/2009/01/05/3714047.aspx<br /> </div> <img src ="http://www.aygfsteel.com/shiliqiang/aggbug/291276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/shiliqiang/" target="_blank">矛_@</a> 2009-08-15 17:25 <a href="http://www.aygfsteel.com/shiliqiang/articles/291276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>蛇阵法http://www.aygfsteel.com/shiliqiang/articles/288421.html矛_@矛_@Sun, 26 Jul 2009 01:39:00 GMThttp://www.aygfsteel.com/shiliqiang/articles/288421.htmlhttp://www.aygfsteel.com/shiliqiang/comments/288421.htmlhttp://www.aygfsteel.com/shiliqiang/articles/288421.html#Feedback0http://www.aygfsteel.com/shiliqiang/comments/commentRss/288421.htmlhttp://www.aygfsteel.com/shiliqiang/services/trackbacks/288421.html
   在描q算法之前,先看看下面的5*5的表|

 1  3  4  10  11
 2  5  9  12
 19
 6  8  13  18  20
 7  14  17  21  24
 15  16  22  23  25

    上面的表格很Ҏ看出规律。就是从左上角第一个格开始(起始?Q,然后延右上角到左下角的斜Uѝ先从下CQ再从上C。开始按数字递增排列。也是说每一个斜U上分别有如下几l数字:

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

    ׃是先从上CQ?可以看做是从上到下)Q再从下CQ很象一条蛇Q因此,该数字表g可称形矩c现在要与一个方法(或函敎ͼQ方法的参数是一个intcdQ表CnQ方法返回一个二l数l,表示要获得的往q接力数字表根{?br />     实际上,q个法q不复杂Q只需要从分别获得1至n^2中每个数字对应的二维数组的坐标就可以了。先拿这??列的表格来说Q求Z面每l数l对应的坐标Qv始位|ؓ0Q?br />
W?l?br /> W?l?br /> W?l?br /> W?l?br /> W?l?br /> W?l?br /> W?l?br /> W?l?br /> W?l?br /> 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
(0,0)
(1,0)   (0,1)
(0,2)   (1,1)   (2,0)
(3,0)   (2,1)   (1,2)   (0,3)
(0,4)   (1,3)   (2,2)   (3,1)   (4,0)
(4,1)   (3,2)   (2,3)   (1,4)
(2,4)   (3,3)   (4,2)
(4,3)   (3,4)
(4,4)
                                
    从上面的从标可以看出一个规律?nbsp; 左上角的半个表格Q以对角U分界)的横坐标和纵坐标?开始,每一l增1Q直到增臌格的边界Qn - 1Q,而且是交替的Q也是_偶数行是列增Q行减小Q行+?l的索引。而右下角?l数字虽然行、列也是交替增长的,但递减的行或列L?n - 1)开始(对于本例Q是?开始)Q而递增的行或列L从index - n + 1开始,其中index表示l的索引。这可以得Z个算法。实C码如下:
public static int[][] getGrid(int n)
{
    
int[][] array = new int[n][n];
    
int row = 0, col = 0, m = 1;
    
//  用于控制奇偶l,false表示偶组Qtrue表示奇组
    boolean isRow = false;
    
//  i表示当前l的索引Q从0开?/span>
    for (int i = 0; i < (2 * n - 1); i++)
    {
        row 
= i;
        
while (row >= ((i < n) ? 0 : i - n + 1))
        {
            
//  如果处理的是右下角表g的数字,行或列最大不能超qn-1
            if (row > (n - 1))
                row 
= n - 1;
            col 
= i - row;
            
if (isRow)
                array[row][col] 
= m;
            
else  //  row变成列,col变成?/span>
                array[col][row] = m;
            m
++;
            row
--;
        }
        
//  切换奇偶l?/span>
        isRow = !isRow;
    }
    
return array;
}

   改进法

   上面实现的算法需要@环N*Nơ才可以生成蛇Ş矩阵。但仔细分析一下,q可以l简化算法,使@环次数减至N*N/2Q也是_效率可以提高一倍。我 们上学时曑֭q用高斯的方法计?+2+3+...+100Q?  1 + 100 = 101Q? + 99 = 101Q?..Q?0+51 = 101Q因此,l果?01 * 50 = 5050。很方便。我们这个算法也可采用类似的Ҏ。仔l观察上?*5的数字表格发玎ͼ出左上角的矩阵中每一个数字后Q都可以直接获得右下角度某个? |的数字。例如在(0,0)位置?Q可以向?4,4)位置?5Q?1,2)位置?可以得到(3,2)位置?7。我们发玎ͼ每一Ҏ之和都ؓ 26。而且它们坐标的关pL(row,col)Q?n - row - 1, n - col - 1)。因此,只要得到左上角的半个矩阵Q就可以得出右下角的另外半个矩阵。如果n为奇敎ͼ对角U中间的一个数Q在5*5的矩阵中?3Q与之对应的数是? 自n。好Q我们看看改q的法的实玎ͼ

public static int[][] getGrid1(int n)
{
    
int[][] array = new int[n][n];
    
int row = 0, col = 0, m = 1;
    
int number1 =  (n * n / 2 + n * n % 2);
    
int number2 = n * n + 1;        
    
boolean isRow = false;
    
//  number1表示要计的蛇Ş矩阵中最大的数字Q对?*5矩阵来说该数?3
    for (int i = 0; m < number1; i++)
    {
        row 
= i;
        
while (row >= 0)
        {
            col 
= i - row;
            
if (isRow)
            {
                array[row][col] 
= m;
                
//  填充与m对应的另外一个数
                array[n - row - 1][n - col - 1= number2 - m;
            }
            
else
            {
                array[col][row] 
= m;
                
//  填充与m对应的另外一个数
                array[n - col - 1][n - row - 1= number2 - m;

            }
            m
++;
            if(m >= number1) break;
            row--;
        }
        isRow 
= !isRow;
    }
    
return array;
}

   如果惌出n=10的数字表|可以使用int[][] grid = getGrid(10)或int[][] grid1 = getGrid1(10)Q会得到同样的结果。输出grid和grid1Q看看是不是下面的结果:


1 3 4 10 11 21 22 36 37 55
2 5 9 12 20 23 35 38 54 56
6 8 13 19 24 34 39 53 57 72
7 14 18 25 33 40 52 58 71 73
15 17 26 32 41 51 59 70 74 85
16 27 31 42 50 60 69 75 84 86
28 30 43 49 61 68 76 83 87 94
29 44 48 62 67 77 82 88 93 95
45 47 63 66 78 81 89 92 96 99
46 64 65 79 80 90 91 97 98 100


矛_@ 2009-07-26 09:39 发表评论
]]>
五子AI法http://www.aygfsteel.com/shiliqiang/articles/286605.html矛_@矛_@Mon, 13 Jul 2009 10:46:00 GMThttp://www.aygfsteel.com/shiliqiang/articles/286605.htmlhttp://www.aygfsteel.com/shiliqiang/comments/286605.htmlhttp://www.aygfsteel.com/shiliqiang/articles/286605.html#Feedback0http://www.aygfsteel.com/shiliqiang/comments/commentRss/286605.htmlhttp://www.aygfsteel.com/shiliqiang/services/trackbacks/286605.html五子的核心法
2009q?4?2?星期?17:55
五子是一U受大众q泛喜爱的游戏,其规则简单,变化多端Q非常富有趣x和消遣性。这里设计和实现了一个h机对下的五子程序,采用了博弈树的方法,应用了剪枝和最大最树原理q行搜烦发现最好的下子位置。介l五子棋E序的数据结构、评分规则、胜负判断方法和搜烦法q程?

 

 

一、相关的数据l构
    关于盘面情况的表C,以链表Ş式表C当前盘面的情况Q目的是可以允许用户q行悔棋、回退{操作?
    CList StepList;
    其中Stepl构的表CZؓQ?/p>

    struct Step
    {
      int m; //m,n表示两个坐标?
      int n;
      char side; //side表示下子?
    };
以数lŞ式保存当前盘面的情况Q?
目的是ؓ了在昄当前盘面情况时用:
char FiveArea[FIVE_MAX_LINE][FIVE_MAX_LINE];

    其中FIVE_MAX_LINE表示盘面最大的行数?/p>

    同时׃需要在递归搜烦的过E中考虑旉和空间有效性,只找出就当前情况来说相对比较好的几个盘面Q而不是对所有的可下子的位置都进行搜索,q里用变量CountList来表C当前搜索中可以选择的所有新的盘面情况对象的集合Q?/p>

CList CountList;
    其中cCBoardSituiton?
class CBoardSituation
{
CList StepList; //每一步的列表
char FiveArea[FIVE_MAX_LINE][FIVE_MAX_LINE];
struct Step machineStep;    //机器所下的那一?
double value; //该种盘面状态所得到的分?
}

二、评分规?
    对于下子的重要性评分,需要从六个位置来考虑当前局的情况,分别为:-,&brvbar;,/,,//,\


    实际上需要考虑在这六个位置上某一Ҏ形成的子的布局的情况,对于在还没有子的地方落子以后的当前局面的评分Q主要是Z说明在这个地方下子的重要性程度,讑֮了一个简单的规则来表C当前棋面对机器方的分数?/p>

    基本的规则如下:

判断是否能成5, 如果是机器方的话l予100000分,如果是h方的话给予-100000 分;
判断是否能成z?或者是双死4或者是?z?Q如果是机器方的话给?0000分,如果是h方的话给予-10000分;
判断是否已成双活3Q如果是机器方的话给?000分,如果是h方的话给予-5000 分;
判断是否成死3z?Q如果是机器方的话给?000分,如果是h方的话给予-1000 分;
判断是否能成?Q如果是机器方的话给?00分,如果是h方的话给予-500分;
判断是否能成单活3Q如果是机器方的话给?00分,如果是h方的话给予-200分;
判断是否已成双活2Q如果是机器方的话给?00分,如果是h方的话给予-100分;
判断是否能成?Q如果是机器方的话给?0分,如果是h方的话给予-50分;
判断是否能成双活2Q如果是机器方的话给?0分,如果是h方的话给予-10分;
判断是否能成z?Q如果是机器方的话给?分,如果是h方的话给予-5分;
判断是否能成?Q如果是机器方的话给?分,如果是h方的话给予-3分?/p>

    实际上对当前的局面按照上面的规则的顺序进行比较,如果满某一条规则的话,q该局面打分ƈ保存Q然后退则的匚w。注意这里的规则是根据一般的下棋规律的一个ȝQ在实际q行的时候,用户可以d规则和对评分机制加以修正?/p>

三、胜负判?
    实际上,是根据当前最后一个落子的情况来判断胜负的。实际上需要从四个位置判断Q以该子为出发点的水qI竖直和两条分别ؓ 45度角?35度角的线Q目的是看在q四个方向是否最后落子的一Ҏ成连l五个的子Q如果是的话Q就表示该盘局已经分出胜负。具体见下面的图C:


四、搜索算法实现描q?
    注意下面的核心的法中的变量currentBoardSituationQ表C当前机器最新的盘面情况, CountList表示W一层子节点可以选择的较好的盘面的集合。核心的法如下Q?
void MainDealFunction()
{
value=QMAXINT; //对初始根节点的value赋?
CalSeveralGoodPlace(currentBoardSituation,CountList);
//该函数是Ҏ当前的盘面情冉|比较得到比较好的可以考虑的几个盘面的情况Q可以根据实际的得分情况选取分数比较高的几个盘面Q也是说在W一层节炚w择的时候采用贪婪算法,直接扑և相对分数比较高的几个形成W一层节点,目的是ؓ了提高搜索速度和防止堆栈溢出?
pos=CountList.GetHeadPosition();
CBoardSituationQ?pBoard;
for(i=0;ivalue=Search(pBoard,min,value,0);
Value=Select(value,pBoardQ?gt;value,max);
//取value和pBoardQ?gt;value中大的赋l根节点
}
for(i=0;ivalue)
//扑և那一个得到最高分的盘?
{
    currentBoardSituation=pBoard;
    PlayerMode=min; //当前下子ҎZh
    Break;
}
}

    其中对于Search函数的表C如下:实际上核心的法是一个剪枝过E,其中在这个搜索过E中相关的四个参CؓQ(1Q当前棋局情况Q(2Q当前的下子方,可以是机?max)或者是?min)Q(3Q父节点的值oldValueQ(4Q当前的搜烦深度depth?/p>

double Search(CBoardSituationQ?
board,int mode,double oldvalue,int depth)
{
CList m_DeepList;
if(deptholdvalue))==    TRUE)
      {
          if(mode==max)
            value=select(value,search(successor
          Board,min,value,depthQ?),max);
          else
            value=select(value,search(successor
            Board,max,value,depthQ?),min);
      }
      return value;
}
else
{
if ( goal(board)<>0)
//q里goal(board)<>0表示已经可以分出胜负
return goal(board);
else
return evlation(board);
        }
    }

    注意q里的goal(board)函数是用来判断当前盘面是否可以分负,而evlation(board)是对当前的盘面从机器的角度进行打分?/p>

    下面是Select函数的介l,q个函数的主要目的是Ҏ PlayerMode情况Q即是机器还是用hq回节点的应有的倹{?/p>

double Select(double a,double b,int mode)
{
if(a>b Q& mode==max)&brvbar;&brvbar; (a< b Q& mode==min)
return a;
else
return b;
}

五、小l?
    在Windows操作pȝ下,用VCQ+实现了这个h机对战的五子程序。和国内许多只是采用规则或者只是采用简单递归而没有剪枝的那些E序相比Q在智力上和旉有效性上都要好于q些E序。同时所讨论的方法和设计q程为用戯计其他的游戏Q如象棋和围等Q提供了一个参?/p>



矛_@ 2009-07-13 18:46 发表评论
]]>
վ֩ģ壺 | Ϫ| | ɯ| | ƽ| Ȫ| ͡| | | | | | | | | | ͼ| | | ߮| ¸| ʯ| ͼ| | | «| մ| ̶| | | | | ϵ| | ƽ| ī| | ƽ| | |