如何表示遗传算法的路径?

时间:2009-04-13 17:41:34

标签: language-agnostic artificial-intelligence genetic-algorithm

我想使用GA来确定从A到B的最佳路径,满足某些条件(长度,转数等)。

路径的一个例子是: Up 4,Left 8,Down 3,Right 3,Down 1,Left 10,Up 4,Left 1,Up 3

问题是,我真的不知道如何以一种很好的方式在GA中表示这样的信息,特别是因为路径的长度可变。

有没有人知道如何做这样的事情?

5 个答案:

答案 0 :(得分:2)

我不确定你的代表问题到底是什么,所以我怀疑你对GA的染色体串的误解有这个问题。从理论上讲,如果您采取额外的步骤划分您的个体基因,染色体串不必在整数边界上明确重组,这将允许您在逐个基因的基础上重组。这解决了可变长度基因的问题,例如你的“路径”。重组可变长度基因只是在突变方法中添加另一个变体,特别是“使用此元素或核心这个元素”,除了标准的“使用来自A的元素或来自B的元素”,如果你的基因易碎到离散的话元素,就像你的道路一样。

答案 1 :(得分:2)

听起来你真的想要使用像A* optimisation algorithm这样的东西,这是常用的(效果很好)路径寻找。您可以指定任何您喜欢的启发式函数,以获得适当的解决方案。

答案 2 :(得分:1)

我会使用U,D,L,R ....

所以“Up 4,Left 8,Down 3,Right 3,Down 1,Left 10,Up 4,Left 1,Up 3”将是:

<强> UUUULLLLLLLLDDDRRRDLLLLLLLLLLUUUULUUU

如此繁殖字符串要容易得多。

对于A(15个字符)和B(3个字符),我在A&amp; A之间的繁殖功能。 B将是:

  • 选择1到MAX之间的随机所需长度(len)(LEN(A),LEN(B)){1到15之间}
  • 选择1和len之间的随机分割点。
  • 选择是否要先随机选择A或B.
  • 从第一个中取出第一个s字符,然后从另一个中取出最后一个(len-s)字符。

答案 3 :(得分:1)

GA可以处理长度可变的染色体。实际个人可能非常复杂。例如,它可以包含一定数量的固定长度位,字符串(没有固定长度),也可能包含一些共轭复数对。另外,共轭复数对必须始终保留一些条件。它可以做到,但是更复杂的个体得到,更复杂的遗传操作得到(例如交叉,突变)。可能健身功能需要更多代码。但它仍有可能。

根据建议,您可以选择数字编码路径表示,但仍可以将您的示例编码为Osama ALASSIRY建议: UUUULLLLLLLLDDDRRRDLLLLLLLLLLUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUULU  对于交叉:

  • 让变异操作员读取给定个体的当前lenght1,
  • 生成两个随机数x1,y1,x1,y1 =&lt; lenght1和x1!= y1(这是个人1的切割点),
  • 为个人2做同样的事情,现在你有两对(x1,y1)和(x2,y2),
  • 从个体1复制x1和y1之间的内容,并将其插入值x2和y2之间的个体2中。个别2的新版本可能会改变其长度,因为x1y1和x2y2之间的基因数量可能不同,但这没关系,
  • 在x2y2之间的个人2的原始版本应该插入x1y1之间的个人1的新版本(其长度也会改变),

说清楚:
父A:UUUULLLLLLLLDDDRRRDLLLLLLLLLLUUUULUUUUU 父母B:DRRRRLULUDDDR
你生成随机对pairA(4,18),pairB(0,5) 假设您从0开始计算基因,则交换以下字符串:
UUUU的 LLLLLLLLDDDRRRD LLLLLLLLLLUUUULUUU
DRRRRL ULUDDDR
所以在交叉后你得到了 UUUU的 DRRRRL LLLLLLLLLLUUUULUUU
LLLLLLLLDDDRRRD ULUDDDR
现在你刚刚交叉了。你也可以使用一个切割点或乘法点。

至于突变:

  • 生成介于0和个人长度之间的数字
  • 生成1-4之间的数字并更新该基因。 (如果生成1则将其更改为U,2-D,3-L,4-R)

你刚刚做了突变。你也可以改变一个以上的基因。

但正如我所说,还有其他可能性。

答案 4 :(得分:0)

对我而言,这听起来与Travelling salesman problem非常相似,该页面是否包含一些有用的信息?