萤火虫算法的标准移动公式类似于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应该是“源头上的吸引力”,所以当将萤火虫i移向萤火虫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
发布于 2020-09-24 07:17:12
https://stackoverflow.com/questions/31104587
复制相似问题