我该如何编写这种遗传算法?

时间:2011-08-12 15:16:59

标签: c# neural-network genetic-algorithm

我想编写一种遗传算法来学习玩类似俄罗斯方块的游戏。 游戏本身相对简单;我在下面写了完整的行为。

比赛:

  • 基于网格,12x16。
  • 您必须从网格中清除块。
  • 每隔5个刻度添加一行新块,到底部,向上推动块。
  • 您只能清除相同类型块的群集。
  • 随着游戏的进行,街区类型的数量会增加。
  • 您只能清除3个或更高的群集。
  • 对于清除的每个群集,(CLUSTER_SIZE - 3)^2都会添加到BLOCK_SCORE。
  • 从网格中移除一个簇后,上面的块向下滑动以填充间隙,如果此后有任何水平间隙(在底行),则间隙的左侧移动以填充它。
  • 这场比赛的目标是尽可能长久地生存。时间以刻度或您所做的移动次数来衡量。
  • 您的分数(或健身)由(TIME_ALIVE * BLOCK_SCORE)
  • 决定
  • 一旦一个街区到达网格顶部,游戏就结束了。

这款游戏的得分包括长寿和效率。您清除的群集越大,适合度越高。

我现在编写了一些GAs,但它们基于本地竞争,收集目标之类的东西,VS其他个人。 我的问题是我不知道如何解决这个问题。这个新GA的每个不同的个体应该只有当前网格作为输入。 (至少,这是我认为需要的)

我如何开始为此编码GA?我不能为我的生活而努力。

全心全意,

Steffan'Ruirize'James

2 个答案:

答案 0 :(得分:2)

您的人口中的每个人都将代表一场完成的游戏。每个人的属性将是定义用于放置块的给定策略所必需的参数。我假设您有一些不同的启发式方法来放置块。策略的一个示例是从可用策略中随机选择启发式,因此您的属性将是选择给定启发式的一组概率。您能否提供有关块k放置启发式的更多信息?

答案 1 :(得分:1)

替代编码可能涉及:

for each possible move
  set phenotypeBehavior to 0
  calculate the post-move position 
  foreach block cleared add a perBlockClearedEmphasis value to phenotypeBehavior
  foreach column add a perColumnHeightEmphasis value to your phenotypeBehavior
  foreach cluster of size x, add a clusterSizeXEmphasis value to your phenotypeBehavior
choose the move that produces the highest phenotypeBehavior

通过遗传方式对各种_foo_Emphasis值进行编码并对其进行演化。据推测,例如,perBlockClearedEmphasis将推向高值,而你的启发式“高度差”将驱动perColumnHeightEmphasis为负,而clusterSizeXEmphasis对小X为负,对较大X为正。

在最一般意义上,这表明您的遗传结构描述了一个声明性但高度参数化的程序。