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值,但目前未在任何地方使用。当然,此代码片段目前不会执行任何可行的优化。
非常感谢任何帮助,我正在研究这段时间并开始绝望。
关于萤火虫算法的论文:
答案 0 :(得分:2)
首先,光强度(亮度)和吸引力之间存在差异。用目标函数计算光强度。如果问题在于建立最大的全局最优值,则必须使光强度与目标函数的值成正比。否则,光强度必须与目标函数的值成反比。 另一方面,吸引力与健身价值无关。 Beta0不被视为适用性,Beta0是必须在开头定义的参数以及Alpha和Gamma参数。 如果您有一个最小化问题,并且您认为目标函数是适合度值,那么适合度值较高的萤火虫就会吸引到更少的人。
是的,每个萤火虫都向其他萤火虫移动,但是当您获得新的解决方案时,您必须在新旧萤火虫之间进行贪婪的选择,并且只保留其中的最佳。
是的,您每次都必须生成一个新的随机值。