BIG版后的问题:
我需要使用遗传算法建立排名,我有类似这样的数据:
P(a>b)=0.9
P(b>c)=0.7
P(c>d)=0.8
P(b>d)=0.3
现在,让我们将
a,b,c,d
解释为足球队的名称,而P(x>y)
是x
以y
获胜的概率。我们要建立球队排名,我们缺少一些观察结果,P(a>d)
,P(a>c)
由于缺少vs和d之间的比赛而丢失了。目标是找到球队名称的顺序,以最能描述该四支球队联赛的现状。
如果我们只有4个团队,而解决方案是简单明了的,那么首先我们计算四个团队的所有
4!=24
排序的概率,同时忽略缺失值,我们有:P(abcd)=P(a>b)P(b>c)P(c>d)P(b>d)
P(abdc)=P(a>b)P(b>c)(1-P(c>d))P(b>d)
...
P(dcba)=(1-P(a>b))(1-P(b>c))(1-P(c>d))(1-P(b>d))
然后选择概率最高的排名。我不想使用任何其他健身功能。
我的问题 :
由于n个元素的排列数是
n!
所有概率的计算对于大n(我的n约为40),不可能进行排序。我想用遗传算法解决这个问题。
变异算子是两个(或多个)排名元素的位置的简单切换。
但是如何使两个顺序交叉呢?
在不对称的TSP问题中,能否将
P(abcd)
解释为路径“ abcd”的成本函数,但从x到y的旅行成本与从y到x的旅行成本不同,P(x>y)=1-P(y<x)
? TSP问题有很多交叉运算符,但是我认为我必须设计自己的交叉运算符,因为我的问题与TSP略有不同。您对解决方案或概念分析框架有任何想法吗?在概念和实现级别上,最简单的方法是使用交叉运算符,该运算符可以在两个解决方案之间交换子顺序:
CrossOver(ABcD,AcDB) = AcBD
对于元素的随机子集(在本例中为大写字母“ a,b,d”),我们复制并粘贴第一个子顺序-元素“ a,b,d”的顺序为第二个顺序。
版本:不对称的TSP可以转变为对称的TSP,但是带有禁止的子顺序,这使得GA方法不合适。
最佳答案
这绝对是一个有趣的问题,似乎大多数答案和评论都集中在问题的语义方面(即适应度函数的含义等)。
我将介绍一些有关语法元素的信息-如何以有意义的方式进行交叉和/或变异。显然,正如您在与TSP的并行处理中所指出的那样,您遇到了置换问题。因此,如果您要使用GA,则候选解决方案的自然表示形式只是您的点的有序列表,请小心避免重新排列-即排列。
TSP就是这样一种置换问题,您可以从TSP算法中获取许多交叉运算符(例如Edge Assembly Crossover)并直接使用。但是,我认为您会遇到这种方法的问题。基本上,问题是这样的:在TSP中,解决方案的重要质量是邻接。也就是说,abcd与cdab具有相同的适用性,因为它是相同的游览,只是在不同的城市开始和结束。在您的示例中,绝对位置比这个相对位置概念重要得多。 abcd在某种意义上意味着a是最佳点-重要的是,它在列表中排在第一位。
要获得有效的交叉算子,您要做的关键事情是要考虑使父级属性变得良好的属性,并尝试准确地提取和合并这些属性。 Nick Radcliffe called this "respectful recombination"(请注意,纸张已经很老了,现在对该理论的理解有所不同,但是原理很合理)。采取由TSP设计的运算符并将其应用于您的问题将最终产生后代,这些后代试图保留来自父母的无关信息。
理想情况下,您需要一个尝试保留字符串中绝对位置的运算符。我所知道的最好的一种称为循环交叉(CX)。我想念的只是一个很好的参考,但我可以将您指向some code where I implemented it as part of my graduate work。 CX的基本概念描述起来相当复杂,并且在操作中更容易看清。请注意以下两点:
abcdefgh
cfhgedba
随机选择父级1中的起点。为简单起见,我将从“ 0”开始于位置0。
现在直接放到父级2中,并观察那里的值(在本例中为“ c”)。
现在在父级1中搜索“ c”。我们在位置2找到它。
现在再次笔直下降,并观察父级2,位置2中的“ h”。
再次在位置7的父级1中搜索此“ h”。
直接放下并观察父级2中的“ a”。
此时,请注意,如果我们在父对象中搜索“ a”,则会到达一个已经存在的位置。继续过去只会循环。实际上,我们将访问过的位置序列(0、2、7)称为“周期”。请注意,我们可以简单地以组为单位在父母之间交换这些位置上的值,并且父母双方都将保留置换属性,因为我们在循环中每个位置上对于父母双方都具有相同的三个值,只是顺序不同。
交换周期中包括的头寸。
请注意,这只是一个周期。然后,您每次从一个新的(未访问的)职位开始重复此过程,直到所有职位都包含在一个循环中。完成上述步骤中的一次迭代后,您将获得以下字符串(其中“ X”表示循环中的值在父级之间交换的位置)。
cbhdefga
afcgedbh
X X X
只要继续查找和交换周期,直到完成。
我从github帐户链接的代码将紧密绑定到我自己的元启发式框架,但是我认为从代码中提取基本算法并使其适合您自己的系统是一项相当容易的任务。
请注意,通过针对您的特定域进行更多自定义的操作,您可能会收获很多。我认为像CX之类的东西比基于TSP运算符的东西能提供更好的黑盒算法,但是黑盒通常是最后的选择。别人的建议可能会使您获得更好的总体算法。
关于optimization - 利用遗传算法建立排名,,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10152002/