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)
由于a vs d 和a 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)。我想用遗传算法来解决这个问题。
变异运算符是两个(或更多)排名元素位置的简单交换。
但是如何使两个排序交叉呢?
Could 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”的序列复制并粘贴到第二个排序。
Edition:非对称 TSP 可以转化为对称 TSP,但具有禁止的子排序,这使得 GA 方法不适合。