萤火虫算法:如何理解运动公式

时间:2015-06-28 20:49:05

标签: algorithm optimization

firefly算法的标准移动公式如this

x_i^{t+1} = x_i^t + \beta_0 e^{-\gamma {r_{i,j}^2}}(x_j^t - x_i^t) + \alpha \epsilon_i^t

虽然我理解算法的概念以及公式的单个组件应该做什么,但我无法将公式转换为工作实现。

具体来说:

1)beta0应该是“源头上的吸引力”,所以当将firefly i移向firefly j时,更高的beta0意味着将ffi向ffj移动更远。 但是当执行最小化时,较高的适应度值表示更差的解决方案,因此ffi应该更少地向ffj移动。 所以我想,beta0应该是从0到1的值,更接近于1以获得更好的解决方案。那么如何将最小化适应度值(包括负适应度值)映射到0-1比例?

2)每只萤火虫是否会朝向其他萤火虫移动,或者每只萤火虫是否只朝着它看到的最亮的萤火虫移动?大多数论文都提出了对所有人口成员的两个嵌套循环,但这也意味着走向更糟糕的解决方案(当然,beta0可以最大限度地减少向这种不良解决方案的转移)

3)如果你将每个萤火虫移向其他每个萤火虫,你是每次都添加随机值,还是每个萤火虫和迭代只添加一次?

基本上,我想要以下代码段进行移动:

void MoveFireFlies(double alpha, double gamma, double*** rand, double** NewPopulation, double** Population, double* Fitness, int populationSize, int dimensions)
{
    int i;
    for(i=0;i<populationSize;i++)
    {
        int j;
        for(j=0; j<populationSize; j++)
        {
            double beta0 = 1.0;
            double distance = [...] //euclidian distance between ffi and ffj
            double factor = exp(-gamma * distance * distance);
            int d;
            for(d=0;d<dimensions;d++)
            {
                NewPopulation[i][d] = Population[i][d] + beta0 * factor * (Population[j][d] - Population[i][d]) + alpha * rand[i][j][d];
            }
        }
    }
}

其中rand包含范围内的随机值(-0.5,0.5),而Population包含上一次迭代的解。提供了Fitness值,但目前未在任何地方使用。当然,此代码片段目前不会执行任何可行的优化。

非常感谢任何帮助,我正在研究这段时间并开始绝望。

关于萤火虫算法的论文:

Firefly Algorithm: Recent Advances and Applications

1 个答案:

答案 0 :(得分:2)

  1. 首先,光强度(亮度)和吸引力之间存在差异。用目标函数计算光强度。如果问题在于建立最大的全局最优值,则必须使光强度与目标函数的值成正比。否则,光强度必须与目标函数的值成反比。 另一方面,吸引力与健身价值无关。 Beta0不被视为适用性,Beta0是必须在开头定义的参数以及Alpha和Gamma参数。 如果您有一个最小化问题,并且您认为目标函数是适合度值,那么适合度值较高的萤火虫就会吸引到更少的人。

  2. 是的,每个萤火虫都向其他萤火虫移动,但是当您获得新的解决方案时,您必须在新旧萤火虫之间进行贪婪的选择,并且只保留其中的最佳。

  3. 是的,您每次都必须生成一个新的随机值。