随笔分类 -  3. 人工智能机器博弈

摘要:人机大战,我的点格棋1.0程序开始挑战女儿,2:1。C#编写,生成贪婪着法和让格着法,6层alphabeta剪枝搜索,下一个版本估计能打败绝大多数的人类棋手! 阅读全文
posted @ 2015-11-01 15:39 申龙斌的程序人生 阅读(1265) 评论(0) 推荐(0) 编辑
摘要:以前写的中国象棋引擎的C#源程序,可在VS2010中编译运行,由于个人精力有限,难以完成后续的开发工作,如果谁感兴趣,请给我发邮件(slofslb at qq.com)。 阅读全文
posted @ 2014-09-18 17:19 申龙斌的程序人生 阅读(6872) 评论(0) 推荐(0) 编辑
摘要:听说LISP历史很是悠久,看了《梦断代码》之后,想着看看LISP到底如何强大的,节日期间抽空装上LISP环境小试一下。 看一些LISP介绍时,听说了这样几条关于语言的格言: Perl的格言:做事情永远都有不止一种方法 Python的格言:做事情只有一种方法 Lisp的格言:可编程的编程语言 先装了GNU Common Lisp,简称GCL,在Windows7中安装时有个del的脚本运行... 阅读全文
posted @ 2012-10-06 13:59 申龙斌的程序人生 阅读(1189) 评论(0) 推荐(1) 编辑
摘要:用Haskell解八皇后问题,Haskell才是最精练的程序:main = print $ queens 8boardSize = 8queens 0 = [[]]queens n = [ x : y | y <- queens (n-1), x <- [1..boardSize], safe x y 1] where safe x [] n = True safe x (c:y) n = and [ x /= c , x /= c + n , x /= c - n , safe x y (n+1)]运行结果:[[4,2,7,3,6,8,5,1],[... 阅读全文
posted @ 2012-10-06 11:16 申龙斌的程序人生 阅读(2197) 评论(0) 推荐(1) 编辑
摘要:关于AlphaBeta剪枝的文章太多,这个方法是所有其它搜索方法的基础,得多花些时间认真地理解。先把基本概念再回顾一遍:节点:在中国象棋中就是一个棋盘的当前局面Board,当然该轮到谁走棋也是确定的。这里的圆形节点表示终止节点,在中国象棋里就是一方被将死的情况(或者到达了搜索的最大深度),后续不会再有着法产生,游戏如果走到这里就会结束。在引擎里通常给红方一个很大的评估值,如+30000,给黑方一个很小的评估值,如-30000,来方便地判断这种结束局面。(胜利局面有稍微不同的表示法,用-30000+层数ply来表示)连线:表示一步着法Move,通过这步着法后,局面发生变化,先后手也要交换。层:通 阅读全文
posted @ 2012-09-20 14:26 申龙斌的程序人生 阅读(69011) 评论(7) 推荐(1) 编辑
摘要:在人工智能的机器博弈中首先学习的就是极小极大值搜索Minimax,有人翻译成Minmax,少写了中间的字母i,感觉意思不够准确。Minimax的含义就是极小化对手的最大利益。维基百科中给出的伪代码如下:http://www.cnblogs.com/pangxiaodong/archive/2011/05/26/2058864.html 加上了中文翻译。function minimax(node, depth) // 指定当前节点和搜索深度 // 如果能得到确定的结果或者深度为零,使用评估函数返回局面得分 if node is a terminal node or depth = 0... 阅读全文
posted @ 2012-09-17 20:14 申龙斌的程序人生 阅读(1678) 评论(0) 推荐(0) 编辑
摘要:这里没有采用Magic Bitboard技术,采用了4个方向扫描最高1位或最低1位的办法,效率虽然比magic bitboard低一点,但代码还是比较容易理解的。occupiedattacks = PRESET_RAY_NORTH[fromPos];blockers = attacks & occupied;9876543210000000000001000000001100100000000000001001000000000000000000000010010110000000000001000000ABCDEFGHI00100000000100000000100000000100 阅读全文
posted @ 2012-09-14 17:19 申龙斌的程序人生 阅读(1302) 评论(0) 推荐(0) 编辑
摘要:国际象棋引擎中有一个著名的perft程序,可以根据某一个盘面,递归分析可生成的着法个数,统计出其中吃子、将军、将死的个数,用这些数据来验证着法生成的正确性。perft的代码很简单,就是一个递归调用:U64 Perft(int depth) { Move move_list[256]; int n_moves, i; U64 nodes = 0; if (depth == 0) return 1; n_moves = MoveGenerator::GenerateAllMoveList(*this, move_list); for (i = 0; ... 阅读全文
posted @ 2012-09-03 09:34 申龙斌的程序人生 阅读(1697) 评论(4) 推荐(0) 编辑
摘要:2012年8月18日至20日,2012年全国大学生计算机博弈大赛暨全国锦标赛在东北大学召开,棋种增加为13种,100多人参加。 阅读全文
posted @ 2012-08-23 17:02 申龙斌的程序人生 阅读(1800) 评论(1) 推荐(0) 编辑