【问题标题】:implementing stochastic ACO algorithm实现随机 ACO 算法
【发布时间】:2015-10-09 04:54:30
【问题描述】:

我正在尝试实现一个随机蚁群优化算法,但我无法确定如何根据概率实现移动选择。

到目前为止,我实现的标准(贪婪)版本是,蚂蚁m 在图G = (V,E) 上的顶点i,其中E 是边集(i, j),将选择下一个顶点j 基于以下标准:

j = argmax(<fitness function for j>) 
such that j is connected to i

我遇到的问题是尝试实现它的随机版本,因此现在选择新顶点j 的标准是:

P(j) = <fitness function for j>/sum(<fitness function for J>)
where P(j) is the probability of choosing vertex j,
such j is connected to i,
and J is the set of all vertices connected to i

我了解它背后的数学原理,但我只是在弄清楚我应该如何实际实现它时遇到了麻烦。

如果说,我有 3 个顶点连接到 i,每个顶点的概率分别为 0.2、0.3、0.5 - 进行选择的最佳方法是什么?我应该只是随机选择一个顶点j,然后在(0,1)范围内生成一个随机数r,如果r &gt;= P(j),选择顶点j?还是有更好的方法?

【问题讨论】:

  • 如果我理解得很好,你必须选择一个 j,因为 sum(pij) = 1。每个 j 都有它的概率。为了实现它,在您给出的示例中,从 [0,1] 中统一选择 r:如果 r
  • 如果您同意这个想法,如果您有兴趣,我可以为一般情况编写一些 C 伪代码:)
  • 这是有道理的。我最初想到了类似的东西,但后来认为它行不通,但进一步思考,因为概率必须加起来为 1,它会......我在想一个例子,我们有 0.8 和 0.9,所以 0.9只会选择 0.2 次。但这当然是违法的!感谢您的澄清..

标签: algorithm probability stochastic ant-colony


【解决方案1】:

看问题陈述,我认为你不是试图访问所有节点(连接到i(说)),而是基于一些概率分布的一些节点。举个例子:

你有一个节点i,连接到它的是5个节点a1...a5,概率为p1...p5,即sum(p_i) = 1。不,假设您考虑的概率精度是小数点后 2 位。此外,您不想访问所有 5 个节点,而只想访问其中的 k。比方说,在这个例子中,k = 2。因此,由于小数点后 2 位是您的概率精度,因此添加 3 以增加随机函数中概率分布的normality。 (就性能而言,您可以将这个 3 更改为您选择的任意数字)(由于您没有标记任何语言,我将以 java 的 nextInt() 函数来生成随机数为例。)

让我们给出一些值:

p1...p5 = {0.17, 0.11, 0.45, 0.03, 0.24}

现在,在从 1 到 k 的循环中,从 (0...10^5) 生成一个随机数。 {5 = 2 + 3,即。精度 + 3}。如果生成的数字是从 0 到 16999,则使用节点 a1,17000 到 27999,使用 a2,28000 到 72999,使用 a3……等等。你明白了。

【讨论】:

    【解决方案2】:

    您尝试实施的是加权随机选择,具体取决于解决方案组件的概率,或者是基于 ACO 项的随机比例选择规则。这是the implementation of this rule on the Isula Framework的sn-p:

    double value = random.nextDouble();
    while (componentWithProbabilitiesIterator.hasNext()) {
        Map.Entry<C, Double> componentWithProbability = componentWithProbabilitiesIterator
                .next();
    
        Double probability = componentWithProbability.getValue();  
        total += probability;
    
        if (total >= value) {
            nextNode = componentWithProbability.getKey();
            getAnt().visitNode(nextNode);
            return true;
        }
    }
    

    您只需要生成一个介于 0 和 1 之间的随机值(存储在 value 中),并开始累积分量的概率(在 total 变量上)。当total 超过value 中定义的阈值时,我们已找到要添加到解决方案中的组件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 2020-09-19
      • 1970-01-01
      • 2014-07-15
      相关资源
      最近更新 更多