Java 需要帮助用遗传算法解决问题吗

Java 需要帮助用遗传算法解决问题吗,java,genetic-algorithm,genetic-programming,Java,Genetic Algorithm,Genetic Programming,我有一个模拟两队之间足球点球的程序 -目标是24 x 8,坐标0,0位于左下角 -每支球队有5名踢球者和1名守门员。为了方便起见,我会叫2支球队A队和B队 -A队-踢球者有5种策略,每个人一种,守门员有5种策略,因为他需要B队的每个踢球者一种策略 -B队-踢球者有5种策略,每个策略一种,守门员有5种策略,因为他需要a队中每个踢球者的策略 踢球者的策略是坐标x、y和功率值。坐标是踢的位置,力量是踢的强度。稍后我将详细解释Power属性。例如,每个踢球者输入策略如下:1,2 100或24,7 25

我有一个模拟两队之间足球点球的程序

-目标是24 x 8,坐标0,0位于左下角

-每支球队有5名踢球者和1名守门员。为了方便起见,我会叫2支球队A队和B队

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

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

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

守门员的策略是坐标和a+宽度+高度值。这个 守门员覆盖区域是一个矩形,其左下角为x,y位置,右上角为x+宽度,y+高度。例如,3,4 5 5他的左下角坐标位于3,4,3+5,4+5是矩形覆盖区域的右上角

覆盖区域的最大范围为目标区域的25%,计划将对此进行检查

功率:0-24;踢将没有错误;踢中守门员覆盖区100%扑救 力量:24-49踢将有10%的误差-/+10%的库尔宽度;节省90% 功率:50-75踢将有20%的误差;节省80% 功率:76-100踢将有30%的误差;节省50%

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

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

好的,那是模拟程序 现在我需要创建一个GA,为模拟器提供最佳的团队策略

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

投入: -人口随机创建n个队,例如,如果n=5,则创建5个随机队,每个队的属性包括5个踢球者和5个守门员

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

所以我在一个人口为n的区域里寻找1个解

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

例如,将其编码为团队: 染色体:=[player1,player2,player3,player4,player5,守门员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,3100,3,3,4,5]比二进制表示[001001110010000110010100111000101]=[00100111001000010101]更有意义。我想交叉和变异更容易用二进制表示,不是吗

我只是想收集一些想法,这样我就有地方可以开始了


提前谢谢

我没有完整的回复,但可能是

我同意把所有东西都编码成二进制。如果您实际上没有将其存储为位字符串,那么应该确保它很容易转换为位字符串。正如您所指出的,如果您的数据被编码为位字符串,那么交叉和变异是微不足道的

至于你的染色体结构,我认为如果你选择球员/守门员配对,你可能会进入毛茸茸的领域。只有当你把球队作为一个整体来看待时,健身才有意义。即使你找到了一对很好的搭档,如果你所有的球员表现都一样,你的球队也会很糟糕。你的健身功能需要考虑球员的动态


希望这有帮助……

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

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


希望有帮助

首先,你在找什么?对踢球者或守门员来说,好的策略是什么

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


是的,如果你找不到一个很好的理由,那么把所有东西都编码成二进制,不要让你的生活复杂化。

说清楚,我认为你作为一个团队的编码不是很正确——应该是{player1,player2,player3,player4,player5,keeper1},而不是有5名球员和5名守门员。技术上你是对的,只有5名球员和1名守门员。但是请记住,这个解决方案需要5个管理员的策略,所以从某种意义上讲,这与拥有5个管理员是一样的。因为解决方案中的数据量很大,所以将其编码为大字符串相当长,你不觉得吗?例如,[2,3100,player2…player5,1,2,3,3,keeper2…player5]=[0000010,0000011,1100100,player2…player5,0000001,0000010,0000011,0000011 keeper2…keeper5]。每个染色体的位字符串都很长。除非你提出不同的方法,你是对的。在我回答之前,我应该仔细考虑一下。至于染色体。。。守门员/球员组合的方法让我觉得不对。团队多样性很重要。。。如果你有5个最好的球员,但他们都非常相似呢。你会被一个已经学了五次同样把戏的守门员困住。我会考虑这一点,明天再来看看。我可以问一下,为什么用整数表示值在变异中不是直截了当的。你就不能用一个随机的整数值来切换整数值吗,就像用位串一样,你只需要滑动位?我的印象是,将数据表示为整数更容易,染色体不会那么长,而且不需要解码和编码。例如,[x,y,power,x,y,power,x,y,power,x,x,x,power,x,y,w,h,x,y,w,h,x,y,w,h,x,y,w,w,w,w,h,h]我不明白吗?请帮助我了解更多细节。二进制编码有优缺点。一个优点是您不需要任何随机函数,您可以简单地从0翻转到1,反之亦然。另一方面,当使用二进制编码时,可能会导致无效值。这通常只是个人选择的问题。也许这有帮助:你发现问题了吗。我正在用Drupal 6实现PHP中的分配问题,根据学生的位置和实习偏好将学生分配到实习岗位。我喜欢你的节目中的一部分,我非常欢迎。之后,我也分享我的代码。。。