|

楼主 |
发表于 2007-5-19 10:09:00
|
显示全部楼层
Re: 四国军旗的人工智能思考
解决了宏观问题和微观问题,我觉得现在可以涉及到具体的案例了。
首先我们还是从简单的1V1的情况谈起。
军旗总的来看,它的食物链还是非常清楚的,为了更好的分析,我想先排除一些例外,对军旗的食物链进行修改和简化,大家都听过一种斗兽棋,棒打老虎,老虎吃鸡,鸡啄虫子,虫子啃棒子,这是一种环形单一食物链。军旗的食物链并不是简单的环形。我先将其改为单一的非封闭链。
炸--司--军--师--旅--团--营--连--排--工--雷
这样一来,就可以对其每个链上的值进行标记
炸 -- 11
司 -- 10
军 -- 9
师 -- 8
旅 -- 7
团 -- 6
营 -- 5
连 -- 4
排 -- 3
工 -- 2
雷 -- 1
同时,我需要一个数组集合VS{v1,v2,...vn}来存放对方(机器人电脑的敌方)棋子的值,由于正常情况下,电脑不应该知道对方的棋子的值(暗棋),注意该集合是按棋盘位置排列的,v1表示棋盘上1号点位的敌方棋子的值,如果不是敌方的棋子或者无棋子则标记为其他,这里如果是非敌方标M,无棋子标N。最开始,地方的棋子都应该标记为0,表示不知道该位置的具体棋子。
同时用另外一个集合AS{a1,a2,..,an}来标记敌方各食物链上的棋子情况,比如初始情况下a11=2,a10=3,a9=4,..表示和炸弹级别一样高的有2个,和司令级别一样高的有3个(包括炸弹),和军长一样的有4个(包括2炸1司)。这个集合可以用来辅助电脑判断威胁程度(与人脑一样,我们总是在计算对方是否有炸弹,是否有司令等等)。
首先开局时,机器人对地方的棋子一无所知,敌方的棋子标记都是0,机器人必须借助外部输入(棋库)来行走,我们可以制定一些固定的行棋的方式,加上随机要素,让电脑下第一步棋。
然后发生的事情有2种情况:
1、经过N个回合,双方并无棋子碰撞。VS集合的数值依然都是0。这个问题就比较复杂了,在这N个回合之中,电脑无法通过我们上面讨论的公式来计算,因为,电脑本身感觉不到威胁,也无法通过棋子来感知获利。有点像下围棋,电脑必须通过另外一种方式来计算获利和威胁,那就是棋盘位置,比如敌方有一个棋子占据了己方的中营,虽然没有碰子威胁却非常大,这一点我想以后专门探讨。
第二种情况是我今天重点探讨的。
2、第二种情况就是电脑和地方的棋子发生了碰撞。碰撞以后电脑就可以对棋盘上的敌方棋子进行标记。如果敌方的棋子被吃掉,则该位置标记为M或N,如果己方的棋子被吃掉,则标记为己方棋子的食物链值。比如在3号位置,自己的旅长和对方的棋子碰撞被吃,则v3=7。
有了集合VS值,就可以针对敌方棋子的链值来计算权重了。
假设电脑自己有m个棋子M,每个棋子i有n(i)个移动位置
For i = 0 To m
For j = 0 To n(i)
For k = 0 To m
g(i, j, k) = g(i, j, k) + v(t) - M(k)
Next k
Next j
Next i
上面的公式有点稀奇古怪。如果要用文字来描述的话就是
对电脑自己的每个棋子i循环,看看每个棋子i能够移动到什么位置,假设棋子i移动到了位置j,看看剩下的电脑自己的棋子k受到的威胁值。比如t处有一个敌方的棋子v(t),v(t)的链值假设为7(表示吃过自己的旅长比旅长大),如果电脑自己的棋子比旅长大,假设是军长,那么g(i, j, k)就应该是9-7=2,如果电脑自己的棋子是个连长,g(i, j, k)=4-7=-3,表示军长获利为2,连长威胁为3。意味着连长不能碰那个棋子,军长可以碰那个棋子。这只是电脑自己的一个棋子移动一步时的状态,不能单单看这一个权重,要纵观全局,计算出每个棋子的每步。
另外,这只是针对单一食物链的情况,我们要解决复杂事物链的情况,就不能用一个单一的数字来标记食物链上的值了,需要用多个值和多个标记,建立一个食物链结构。
同时,除了食物链以外还有别的获利或者威胁,比如棋盘位置,往往我们不需要通过碰撞,只要占据了棋盘上的某个点,就会消除一些威胁,或者获得最大的利益,这一点,我还在考虑之中,下次再探讨。 |
|