【问题标题】:Building ranking with genetic algorithm,用遗传算法建立排名,
【发布时间】:2012-04-26 11:26:58
【问题描述】:

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)xy 获胜的概率。我们想要建立团队排名,我们缺少一些观察 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)。我想使用遗传算法来解决这个问题。

变异算子是两个(或更多)排名元素位置的简单切换。

但是如何使两个排序交叉?

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方法不适合。

【问题讨论】:

  • 遗传算法优化参数以最大化或最小化适应值。你能写一个包含所有数据的适应度函数吗?在 TSP 中,它将是总距离的计算。
  • 在我看来,如果你以b,c,d,a 为例,总的概率应该最大化。您可以计算适应度f(b,c,d,a) = p(b>c) * p(c>d) * p(d>a).. 但是p(d>a) 是什么?如果你计算出来,剩下的就很容易了。
  • 我知道如何计算适应度函数,例如对于给定的数据:a>b, 0.9b>c, 0.7f(abc)=p(a>b)*p(b>c)f(acb)=p(a>b)*(1-p(b>c)) 它非常直,p(a>c) 的概率不是需要。
  • 你的方法不正确。你不计算ac的排名。在您的公式中,您正在计算 p(a>b)p(c>b),但这并不意味着 p(a>c)。如果知道a大于bc大于b,则不知道a是否大于、小于或等于c

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


【解决方案1】:

这绝对是一个有趣的问题,而且似乎大多数答案和 cmets 都集中在问题的语义方面(即适应度函数的含义等)。

我将提供一些关于句法元素的信息——你如何以有意义的方式进行交叉和/或突变。显然,正如您在与 TSP 平行时所指出的那样,您有一个排列问题。因此,如果您想使用 GA,候选解的自然表示只是您的点的有序列表,注意避免重复——即排列。

TSP 就是这样一个置换问题,您可以从 TSP 算法中获取并直接使用许多交叉运算符(例如,Edge Assembly Crossover)。但是,我认为您会遇到这种方法的问题。基本上,问题是这样的:在 TSP 中,解决方案的重要质量是邻接。也就是说,abcdcdab 具有相同的适应度,因为它是相同的游览,只是在不同的城市开始和结束。在您的示例中,absolute 位置比 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. 进行循环中包含的位置的交换。

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

cbhdefga
afcgedbh
X X    X

继续寻找和交换周期,直到你完成。

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

请注意,您可能会从针对您的特定域进行更多定制的事情中获得很多好处。我认为像 CX 这样的东西会比基于 TSP 运算符的东西更好的黑盒算法,但黑盒通常是最后的手段。其他人的建议可能会引导您获得更好的整体算法。

【讨论】:

  • 如果我们只看一个“父母”,就可以直观地理解循环交叉。它只是从相同位置的其他父母那里获取元素,直到我们匹配解决方案的约束。例如,如果我们看第二个父母——我们在“c”的位置上取“a”,而不是我们有两个打破约束的“a”,所以我们用“h”代替第二个,而不是两个“h” , 并用 'c' 代替第二个。更改的顺序不一样,但结果是一样的。感谢有趣的回答。
【解决方案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,我的问题实际上是一个装箱问题,其中相当于您的“排名”语句是用户提供的排名(1、2、3 等)。所以不是TSP,而是NP-Hard。 OTOH,装箱有一个与接受的错误成比例的伪多项式解决方案,这是我最终使用的。我不太确定这是否适用于您的概率排名陈述。

【讨论】:

  • 是的,你的问题和我的很相似。但我不知道您和我的数据中缺失的观察是否具有相同的解释。您的问题的解决方案是什么,您能提供任何线索吗?
  • 我使用了我提到的伪多项式背包算法,如 Vazirani 的“逼近算法”amazon.com/Approximation-Algorithms-Vijay-V-Vazirani/dp/… 中所述,但老实说,领域专家反对使用排名作为隐藏值的代理,因为他们故意操纵排名以试图博弈现有算法。所以我从来没有把它投入生产:-((哦,我们没有丢失数据......)
【解决方案3】:

多么有趣的问题!如果我理解了,您真正要问的是:

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

因此,如果您的图表有 N 条边,则有 2^N 个不同可能性的图表,其中一些排序出现在不止一个图表中。

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

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

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

【讨论】:

  • tkanks 回答,但拓扑排序仅限于图没有有向循环的情况
  • 是的,我想知道一组数据的解释,例如,P(a>b) = P(b>c) = P(c>a) = .5 .显然,在我提出的形式中,该图有一个循环,并且没有拓扑排序,因为这些条件不可能都为真。但是 P(a>b) = P(b>c) = P(a>c) = .5 是完全相同的问题,对吧?该图确实具有顶级排序。所以,就像我说的那样,它可能没有用,但这是我首先想到的。
猜你喜欢
  • 2012-11-19
  • 2021-04-27
  • 1970-01-01
  • 2011-01-11
  • 2019-06-25
  • 1970-01-01
  • 2012-07-07
  • 2011-07-22
  • 1970-01-01
相关资源
最近更新 更多