用遗传算法建立排名,

时间:2012-04-14 07:52:42

标签: optimization genetic-algorithm ranking mathematical-optimization traveling-salesman

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和vs c之间的匹配而缺失。 目标是找到球队名称的顺序,最能描述四支球队联赛中的现状。

如果我们只有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)。我想用遗传算法来解决这个问题。

变异操作符是简单地切换两个(或更多)排名元素的位置。

但是如何进行两个排序的交叉?

可以将P(abcd)解释为不对称TSP问题中路径'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方法不合适。

3 个答案:

答案 0 :(得分:3)

这绝对是一个有趣的问题,似乎大多数答案和评论都集中在问题的语义方面(即健身功能的含义等)。

我将提供有关句法元素的一些信息 - 如何以有意义的方式进行交叉和/或变异。显然,正如您在TSP上所指出的那样,您会遇到排列问题。因此,如果您想使用GA,候选解决方案的自然表示只是您的点的有序列表,小心避免重复 - 即排列。

TSP是一个这样的排列问题,并且有许多交叉运算符(例如,Edge Assembly Crossover)可以从TSP算法中获取并直接使用。但是,我认为你会遇到这种方法的问题。基本上,问题是:在TSP中,解决方案的重要质量是邻接。也就是说, abcd cdab 具有相同的适应性,因为它是同一个游览,只是在不同的城市开始和结束。在您的示例中,绝对位置比 relative 位置的概念更重要。 abcd 意味着 a 是最好的一点 - 重要的是它首先出现在列表中。

要获得有效的交叉运算符,您必须做的关键是考虑父类中哪些属性使它们变好,并尝试提取和组合这些属性。 Nick Radcliffe called this "respectful recombination"(请注意,论文已经很老了,现在理解的理论有点不同,但原则是合理的)。采用TSP设计的操作员并将其应用于您的问题将最终产生后代,试图保护父母无关的信息。

理想情况下,您需要一个尝试在字符串中保留绝对位置的运算符。我所知道的最好的一种叫做Cycle Crossover(CX)。我错过了一个很好的参考,但我可以指向some code where I implemented it as part of my graduate work。 CX的基本思想描述起来相当复杂,而且更容易看到。请注意以下两点:

abcdefgh
cfhgedba
  1. 随机选择父1中的起点。为简单起见,我将从位置0开始使用“a”。

  2. 现在直接进入父2,并观察那里的值(在这种情况下,“c”)。

  3. 现在在父母1中搜索“c”。我们在第2位找到它。

  4. 现在再次直接下降,并观察父2中位置2的“h”。

  5. 再次在父母1中搜索此“h”,在第7位找到。

  6. 直接放下并观察父母2中的“a”。

  7. 此时请注意,如果我们在父母一方中搜索“a”,我们就会到达我们已经去过的位置。继续过去只会循环。实际上,我们将访问过的位置序列(0,2,7)称为“循环”。请注意,我们可以简单地将父母之间的这些位置的值作为一组进行交换,并且父母双方将保留排列属性,因为我们在父母的周期中的每个位置都有相同的三个值,只是在不同的顺序中。

  8. 交换周期中包含的位置。

  9. 请注意,这只是一个周期。然后,每次从一个新的(未访问的)位置开始重复此过程,直到所有位置都包含在一个循环中。在上述步骤中描述的一次迭代之后,您将获得以下字符串(其中“X”表示在父项之间交换值的循环中的位置。

    cbhdefga
    afcgedbh
    X X    X
    

    继续查找和交换周期,直到完成为止。

    我从我的github帐户链接的代码将与我自己的元启发式框架紧密绑定,但我认为将基本算法从代码中拉出并将其适用于您自己的系统是一项相当容易的任务。

    请注意,通过针对特定域执行更多自定义操作,您可能会获得相当多的收益。我认为像CX这样的东西会比基于TSP算子的东西做出更好的黑盒算法,但黑盒通常是最后的选择。其他人的建议可能会引导您获得更好的整体算法。

答案 1 :(得分:2)

我已经处理了一个类似的排名问题,并采用了类似于我在下面描述的技术。这对你有用吗?

假设物体的未知value通过某种分布(例如正态分布)与您的估计值不同。将您的排名声明(例如a > b, 0.9)解释为“值a位于以b为中心的分布的90%百分位”。

对于每个陈述:

def realArrival = calculate a's location on a distribution centered on b
def arrivalGap = | realArrival - expectedArrival | 
def fitness = Σ arrivalGap

健身功能为MIN(fitness)

FWIW,我的问题实际上是一个bin-packing问题,相当于你的“rank”语句是用户提供的排名(1,2,3等)。所以不是TSP,而是NP-Hard。 OTOH,bin-packing有一个与接受误差成比例的伪多项式解,这是我最终使用的。我不太确定这会与您的概率排名声明一起使用。

答案 2 :(得分:2)

多么有趣的问题!如果我明白了,你真正要问的是:

“给定加权有向图,图中的每个边权重表示以正确方向绘制弧的概率,返回完整的节点序列,最大概率为图的拓扑排序。 “

因此,如果您的图形具有N个边缘,则存在具有不同可能性的2 ^ N个图形,其中一些排序出现在多个图形中。

我不知道这是否会有所帮助(非常简短的谷歌搜索没有启发我,但也许你会有更多的成功和更多的坚持)但我的想法是寻找“拓扑排序”与任何一个“概率”,“随机”,“噪声”或“错误”(因为边缘权重可被视为可靠性因素)可能会有所帮助。

我强烈质疑你的断言,在你的例子中,不需要P(a> c)。你最了解你的应用程序空间,但在我看来,指定P(a> c)= 0.99会给f(abc)提供不同的适应度,而不是指定P(a> c)= 0.01。

您可能也想投入“贝叶斯”,因为您可以根据您的条件和假设解决方案开始推断(在您的示例中)P(a&gt; c)的值。问题是,“拓扑排序”和“贝叶斯”会给你一大堆与马尔可夫链和马尔可夫决策问题相关的命中,这可能会有所帮助,也可能没有帮助。