首先,这不是一个关于如何让一个程序在一行中播放5的问题。去过那里,干过那事。
介绍性解释
我制作了一款五人制游戏,作为一个框架来试验基因改良的人工智能(哎哟,听起来太自命不凡了)。与大多数基于回合的游戏一样,最好的移动是通过给每一个可能的移动分配一个分数,然后以最高的分数进行移动。将分数分配给移动(正方形)的函数如下所示:
- A row with four friendly tokens should have infinite score, because if you place a token there you win the game.
- The score for a row with four _enemy_ tokens should be very high, since if you _don't_ put a token there, the opponent will win on his next turn.
- A row with both friendly and enemy tokens will score 0, since this row can never be part of a winning row.
考虑到这个算法,我声明了一个名为TBrain的类型:
type
TBrain = array[cFriendly..cEnemy , 0..4] of integer; 数组中的值表示N个友好令牌和0个敌人令牌或0友好令牌和N个敌人令牌的一行的得分。如果一行中有5个标记,则没有得分,因为行已经满了。
实际上,很容易决定哪些值应该在数组中。大脑0,4应该是“无限的”,让我们称之为1.000.000。vBrain1,4 1,4应该非常高,但不要太高,以至于大脑宁愿阻止几场敌人的胜利,也不愿战胜自己。
接待员以下(不太可能)板:
0123456789
+----------
0|1...1...12
1|.1..1..1.2
2|..1.1.1..2
3|...111...2
4|1111.1111.
5|...111....
6|..1.1.1...
7|.1..1..1..
8|1...1...1.玩家2应该将他的令牌放置在(9,4)中,而不是在(4,4)中,即使他会阻止8位潜在获胜的第1位球员。因此,vBrain0,4 1,4应该是(vBrain0,4/8)-1。像这样工作,我们可以为“大脑”找到最佳值,但这不是我感兴趣的。我想要一个算法来找到最好的值。
我已经实现了这个框架,所以它完全是确定性的。分数不加随机值,如果几个方块有相同的分数,左上角将被选中。
实际问题
这就是介绍,现在是有趣的部分(至少对我来说)
我有两个“大脑”,vBrain1和vBrain2。我应该如何迭代地使这些更好呢?我想是这样的:
这看起来不管用。大脑不会变得更聪明。为什么?
分数法是否应该在结果中添加一些小的随机值,这样两个相同的大脑之间的两场游戏就会不同了?每个迭代的值应该有多大的变化?如何初始化“大脑”?用恒定的值?随机值?
此外,这与人工智能或遗传算法有任何关系吗?
PS:这个问题与一排中的五人无关。这只是我选择的东西,因为我可以宣布一个非常简单的“大脑”来进行实验。
发布于 2009-09-24 12:05:22
发布于 2009-09-24 12:51:10
如果你想像遗传算法一样处理这个问题,你就需要一个完整的“大脑”群体。然后评估他们之间的相互,要么每一个组合或使用一种比赛风格。然后选择种群中最高的X%作为下一代的父母,后代是通过突变(你拥有的)或遗传交叉(例如,在两个“大脑”之间交换行或列)而产生的。
此外,如果你没有看到任何进化的进展,你可能需要的不仅仅是得失,而是想出某种分数系统,这样你就可以更有效地对整个种群进行排名,这使得选择变得更加容易。
发布于 2009-10-12 21:05:10
看一看增强组织的神经进化 (整洁)。一个奇特的缩略词,它基本上意味着神经网络的发展--它们的结构(拓扑)和连接权重。我编写了一个名为.Net的SharpNEAT实现,您可能想看看这个实现。SharpNEAT V1也有一个Tic-Tac-脚趾实验.
https://stackoverflow.com/questions/1471171
复制相似问题