#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
#define n 190 //萤火虫数目
#define Y 0.5 //光吸收强度
#define a 0.1 //步长
#define B 1.0 //最大吸引度
#define T 300 //迭代次数
#define dim 2 //测试函数维度
#define PI 3.1415926 //圆周率
#define e 2.71828 //自然底数
double Fpos[n][dim]; //萤火虫位置
double Lig[n]; //萤火虫光亮
double TFpos[T][dim]; //各代最优位置
double C[n]; //相对亮度值
double D[n]; //相对距离:
double Func(double *Fpos)
{
double x = Fpos[0];
double y = *(Fpos + 1);
double fitness = sin(sqrt(x*x + y * y)) / (sqrt(x*x + y * y)) + exp((cos(2 * PI*x) + cos(2 * PI*y)) / 2) - 2.71289;
return fitness;
}
void Init()
{
for (int i = 0;i < n;i++)
{
for (int j = 0;j < dim;j++)
{
Fpos[i][j] = (((double)rand() / RAND_MAX) - 0.5) * 4;
}
// Lig[i] = Func(Fpos[i]);
}
}
void FA()
{
/* int tmp = 0;
double max = Lig[tmp];
for (int i = 0;i < n;i++)
{
if (Lig[i] > max)
{
max = Lig[i];
tmp = i; ////求出最亮的萤火虫i;
}
}
*/
for (int i = 0;i < T;i++)
{
for (int j = 0;j < n;j++)
{
C[j] = Func(Fpos[j]);
for (int k = 0;k < n;k++) //计算出所有萤火虫相对于萤火虫j的亮度
{
C[k] = Func(Fpos[k]); //若萤火虫k亮度大于j,则计算相对亮度;
if (C[k] > C[j])
{
double dis = 0;
for (int t = 0;t < dim;t++)
{
dis += pow(Fpos[j][t] - Fpos[k][t], 2);
}
double r = sqrt(dis); //计算出萤火虫j与k相对距离
D[k] = r; //计算出j与k相对距离
C[k] = C[k] * pow(e, -Y * r); //计算出k相对于j的亮度
}
}
int tmp = 0;
double max = C[tmp];
for (int k = 0;k < n;k++) //求出所有萤火虫中相对于萤火虫j拥有最大亮度的萤火虫tmp;
{
if (C[k] > max)
{
max = C[k];
tmp = k; //求出对萤火虫j最具吸引力的萤火虫tmp,即j要向tmp移动(j可能等于tmp);
}
}
double B0 = B * pow(e, -Y * D[tmp] * D[tmp]); //计算出j与tmp之间的吸引度
for (int k = 0;k < dim;k++)
{
Fpos[j][k] = Fpos[j][k] + B0 * (Fpos[tmp][k] - Fpos[j][k]) + a * (((double)rand() / RAND_MAX) - 0.5); //更新j位置。
}
}
}
}
int main()
{
clock_t start, finish;
srand((unsigned int)time(NULL));
start = clock();
Init();
FA();
for (int i = 0;i < n;i++)
{
Lig[i] = Func(Fpos[i]);
}
int tmp = 0;
double max = Lig[tmp];
for (int i = 0;i < n;i++)
{
if (Lig[i] > max)
{
max = Lig[i];
tmp = i;
}
}
finish = clock();
double duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf("Time:%lf\n", duration);
printf("%lf %lf %lf\n", Lig[tmp], Fpos[tmp][0], Fpos[tmp][1]);
system("Pause");
return 0;
}
Kinonoyomeo
- 粉丝: 91
- 资源: 1万+
最新资源
- OpenEuler22.03TLS-SP3系统ssh漏洞官方升级包
- Jmeter实现同一线程组内接口并行执行
- MySQL的安装与配置PDF
- python007-django疫情数据可视化分析系统(LW+PPT).zip
- python006-django基于python技术的学生管理系统的设计与开发.zip
- python005-基于Python爬虫的网络小说数据分析系统的设计与实现.zip
- vs2015 udp 广播 demo
- 创维42L20HW(8DA6)软件数据.rar
- gcc15交叉编译工具链windows版,用于编译龙芯应用,gcc version 15.0.0 20241119 (experimental) (GCC)
- python004-基于python的抑郁症患者看护系统.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0