遗传编程 Grid War
嗯,有了进化的程序之后,可以用一个小游戏来进行测试
书里给的是一个叫做Grid War的东西
说起来很简单,就是在一个矩阵里有两个玩家,当A跑到B的所在位置时,就可以赢得比赛。每人一局只能移动一步,不能超出边界,也不能与上一次移动方向相同,否则判定输。竞赛的程序很简单:
def gridgame(p):
# Area
area=(3,3)
maxmove = 50
# Last Move
lastmove=[-1,-1]
# Location of player 1
location=[[randint(0,area[0]),randint(0,area[1])]]
# Location of player 2
location.append([(location[0][0]+area[0]-1) % area[0]+1,
(location[0][1]+area[1]-1) % area[1]+1])
# Begin game
for o in range(maxmove):
for i in range(2):
locs = location[i][:] + location[1-i][:]
locs.append(lastmove[i])
thismove = p[i].evaluate(locs)%4# the rule
if thismove==lastmove[i]: return 1-i
lastmove[i] = thismove
# 0:left,1:right,2:up,3:down
if thismove==0:
location[i][0]-=1
# limit in the border by hard code
if location[i][0]<0: location[i][0]=0
elif thismove==1:
location[i][0]+=1
if location[i][0]>area[0]: location[i][0]=area[0]
elif thismove==2:
location[i][1]-=1
if location[i][1]<0: location[i][1]=area[1]
elif thismove==3:
location[i][1]+=1
if location[i][1]>area[1]: location[i][1]=area[1]
if location[i]==location[1-i]: return i
return -1
如果A赢了,返回0,B赢了,返回1,平局的话,返回-1
运行了一下:
p1 = gp.randomtree(5)
p2 = gp.randomtree(5)
gp.gridgame([p1,p2])
基本上很弱……
看p1和p2的函数就知道,没什么道理嘛……
>>> p1.display()
p1
>>> p2.display()
subtract
isgreater
p4
3
p1
不过接下来的才是重点,要使用循环赛来进行竞赛了
遗传编程
《集体智慧编程》挺好玩的,特别是第11章的智能进化,代码很有趣
不需要额外安装太多东西,只要有个python环境,比如在windows上用idle就行了,然后按照书上的代码一点点的来构建这个小程序,就能看到一点点进化的东西出现。
基本的树和表现构成之后,可以开始构建初始的种群,用python来实现的方法确实很简单,只要几步就可以,不过也是写书的人很厉害,把不需要的东西都剥离出去,余下的都是最核心的功能。代码很简洁
变异的函数很有趣,不过变化的过程还真的很随意。
还有杂交和变异的过程,也都很有趣
没想到竟然真的可以把这个模拟出来:
x^2+3x+2y+5
不过很复杂……:
add
add
add
add
isgreater
7
isgreater
multiply
isgreater
6
p0
multiply
3
p0
subtract
multiply
10
p1
isgreater
4
p1
p0
p0
4
if
8
add
multiply
p0
p0
add
add
p0
p1
p1
if
isgreater
subtract
7
if
p0
if
subtract
p0
subtract
8
6
p1
p0
multiply
3
multiply
subtract
p0
p1
add
3
p0
7
p0
p1
嗯……我自己也搞不懂,不过据说通过剪枝,可以让这个函数很简单的非常接近原函数。不剪了……太长,应该是要依靠剪枝算法来完成这个工作,手工的受不了。
告一段落
总是没完没了的……拖啊拖的,心情也跟着一起低落
不过总算是有个结局了,而且不算很糟糕,虽然来得很晚
还有很多的事情要做,心里有些放不下,但是还能怎么样呢
以前总觉得自己能做这个做那个的,到现在才发现自己其实能做的东西不多
设计了一个又一个的项目,却没有一个能够从设计走向实现
自己越来越急躁了,却在不断地告诉自己要放下一些,慢一些
不止是给别人这么说,对自己也是如此
别着急,但也别荒废,抓紧时间
遇到的新问题都会被解决,只是自己的内心,一定要清楚
已经付出了那么多,不知道下来会怎么样……
祝福自己。
Zoundry Raven Test
话说……这个东西还是很方便的嘛
能想到的东西都有人写好了,真方便~
嗯,比起ScribeFire,这个更像是个Thunderbird客户端……nb~
