【问题标题】:Need help solving a problem with Genetic Algorithm需要帮助解决遗传算法的问题
【发布时间】:2011-01-10 16:46:08
【问题描述】:

我有这个程序可以模拟两队之间的足球点球大战。

-目标是 24 x 8,左下角坐标为 (0,0)。

-每队有5名踢球手和1名守门员(为了方便,我将2队称为A队和B队)

-A 队 - 踢球者有 5 种策略(每人一个),守门员有 5 种策略(因为他需要 B 队的每个踢球者的策略)

-B 队 - 踢球手有 5 种策略(每人一个),守门员有 5 种策略(因为他需要 A 队的每个踢球手的策略)

  • 踢球者的策略是坐标 (x,y) 和功率值。坐标是踢的位置,力量是踢的强度。 (稍后我将详细解释 Power 属性)。例如,每个 kicker 输入策略如下:(1,2) 100 或 (24,7) 25

  • 守门员的策略是一个坐标和一个 +Width 和 +Height 值。这 守门员覆盖区域是一个矩形,其左下角为 (x,y) 位置,右上角为 (x+width, y+height)。比如 (3,4) 5 5 他的左下角坐标在 (3,4) 并且 (3+5,4+5) 是他的矩形右上角(覆盖区域)。

    李>
  • 覆盖区域的最大范围是目标区域的 25%(程序会检查这一点)

  • 功率:0-24; kick 不会出错;踢击守门员覆盖区域 100% 扑救 力量:24-49踢会有10%的错误(-/+10%宽的coor);节省 90% 力量:50-75踢会有20%的误差;节省 80% 力量:76-100踢会有30%的误差;节省 50%

示例输入:幂必须为 0-100,所有其他值必须为 0-(2^7-1) 的正整数 A队 踢球者:(14,3) 25 守门员:(2,3) 4 4 (3,5) 50 门将:(1,1) 5,5 等等……

B队: 踢球手:(9,3) 75 守门员:(1,2) 5 5 (3,13) 100 守门员:(2,3) 6 6(假设这不会超过球门面积的 25% 等等....

好的,这就是模拟器程序

现在我需要创建一个 GA,为模拟器提供最佳团队策略。

让问题简单化,让每个人都能将其概念化:

输入: -population(随机创建n支球队,例如,如果n=5,则随机创建5支球队,每支球队的属性包括5个踢球手,5个守门员)

输出: - 最佳球队策略(每支球队将互相比赛,并为下一次迭代选择最佳球队,记住每支球队有 5 个踢球者的战术,5 个守门员的战术)

所以我毕竟在 n 个人口的领域中寻找一种解决方案

我的问题是如何开始对解决方案进行编码。我应该将解决方案编码为团队还是球员/守门员对?

例如,将其编码为团队: 染色体:= [球员1,球员2,球员3,球员4,球员5,守门员1,守门员2,守门员3,守门员4,守门员5]

class Player {
 int
 int
 int
}

class Goalkeeper {
 int
 int
 int
 int
}

或将其编码为球员/守门员对:

 Chromosome:= [player, goalkeeper] = [x,y,power,x,y,weight,height]

这样编码的问题是我必须在最后得到 5 个最佳球员/守门员组合才能组成一个团队。

另一个问题是二进制和值编码。假设我要与球员/守门员配对,像[x,y,power,x,y,weight,height] = [2,3,100,3,3,4,5] 这样的值编码是否比二进制表示更有意义[0010, 0011, 1100100, 0011, 0011, 0100, 0101] = [0010 0011 1100100 0011 0011 0100 0101]. 我认为交叉和变异将其表示为二进制更容易,不是吗?

我只是想收集一些想法,所以我可以从某个地方开始。

提前致谢

【问题讨论】:

  • 您找到问题了吗。我正在使用 Drupal 6 在 PHP 中实现分配问题,以根据学生的位置和学生的实习偏好将学生分配到实习基地。我喜欢你程序的一部分可以分析非常受欢迎。之后,我也分享我的代码......

标签: java genetic-algorithm genetic-programming


【解决方案1】:

我是否正确地认为这是一个学术项目?在那种情况下,我会同时做,将整个团队编码在一个染色体中,并在每个球员/守门员的基础上进行编码。这样你就可以检查这两种方法,看看哪一种会产生更好的结果。由于整个团队编码最终会出现在一系列不同(获胜)的球员/守门员中,您还可以将他们与每个球员编码产生的个人进行比较。

至于值的表示,我喜欢按照您的建议以二进制格式对它们进行编码,因为这种方式更直接一些。当然,如果您使用实数而不是 0 和 1,您也可以使用随机变异方法。同样,如果这是针对学术项目,您可以同时使用这两种方法并在分析中进行比较。

希望有帮助!

【讨论】:

  • 请问为什么将值表示为整数在突变中并不直接。难道你不能用随机整数值切换整数值(就像你只是滑位的位串一样)?我的印象是,将数据表示为整数更容易,染色体不会那么长,而且您不必解码和编码。例如,[x,y,power, x,y,power, x,y,power, x,y,power, x,x,power, x,y,w,h, x,y,w,h, x,y,w,h, x,y,w,h, x,y,w,h] 我没听懂?请帮我提供更多详细信息。
  • 二进制编码有利有弊。一个优点是您不需要任何随机函数,您可以简单地从 0 翻转到 1,反之亦然。另一方面,在使用二进制编码时,您可能会得到无效值。这通常只是个人选择的问题。也许这有帮助:anziamj.austms.org.au/ojs/index.php/ANZIAMJ/article/viewFile/…
【解决方案2】:

我没有给你完整的答复,但它可能是什么...

我同意将所有内容编码为二进制。如果您实际上并未将其存储为位字符串,则应确保将其轻松转换为位字符串。正如您所指出的,如果您的数据被编码为位串,则交叉和变异是微不足道的。

至于你的染色体结构,我认为如果你选择球员/守门员对,你可能会进入毛茸茸的领域。只有将团队视为一个整体,健身才有意义。即使你找到了一对好搭档,如果你所有的球员都表现得一样,你的球队也会很差。您的适应度函数需要考虑玩家动态。

希望对您有所帮助...

【讨论】:

  • 明确地说,我认为您作为一个团队的编码不太正确 - 它应该是 {player1, player2, player3, player4, player5, keeper1} 而不是 5 名球员和 5 名守门员.
  • 技术上你是对的,应该只有 5 名球员和 1 名守门员。但请记住,该解决方案需要 5 名守门员的策略,所以从某种意义上说,这与拥有 5 名守门员相同。
  • 由于解决方案中的数据量很大,将其编码为大字符串您不觉得吗?例如,[2,3,100, player2 ... player5, 1,2,3,3, keeper2 ... player5] = [0000010, 0000011, 1100100, player2 ... player5, 0000001, 0000010, 0000011, 0000011 keeper2 ... keeper5]。每个染色体的位串会很长。除非您提出不同的方法。
  • 你说的很对。在我回答之前,我应该多考虑一下。至于染色体……守门员/球员配对的方法对我来说是错误的。团队多样性很重要...如果你有 5 名最好的球员,但他们都非常相似。你会被一个学过五次相同技巧的守门员困住。我会考虑一下这个,明天再来看看。
【解决方案3】:

首先,您在寻找什么?踢球者或守门员的好策略?

如果两者兼而有之,这听起来是共同进化的理想场景。

可以将所有内容编码为二进制文件,如果您找不到这样做的充分理由,请不要让您的生活复杂化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 2012-01-14
    • 1970-01-01
    相关资源
    最近更新 更多