#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<iostream>
using namespace std;
const int upper_bound = 30;//变量上界
const int lower_bound = 0;//变量下界
const int NP = 5;//种群规模
const int D = 1;//变量维数
const int NG = 100;//最大进化代数
const double F = 0.4;//变异算子
const double CR = 0.1;//交叉算子
int random_integer(int a, int b);//产生a和b之间的随机整数
double random_real_number(int a, int b);//产生a和b之间的随机实数
double objective_function(double x);//目标函数
struct Individual //个体类
{
double element[D];//个体元素值
double fitness_value;//对应个体的目标函数值
};
class DE //DE算法类
{
private:
int best_i;//当前种群中的最优个体(第几个)
double best_fitness;//当前最优个体的适应值
int random_a;//随机数a
int random_b;//随机数b
int random_c;//随机数c
double parent_fitness[NP];//父代种群的适应值
double childen_fitness[NP];//子代种群的适应值
public:
DE();
~DE(){}
void initial_population(Individual *initial);//产生初始种群
void mutation_operator(Individual *initial, Individual *mutation);//变异
void crossover_operator(Individual *initial, Individual *mutation, Individual *crossover);//交叉
void select_operator(Individual *initial, Individual *crossover);//选择
void find_best_individual();//找到最优解
void output_best();//输出最优解
};
int random_integer(int a, int b)//产生a和b之间的随机整数
{
int number = 0;
if (a < b)
number = rand() % (b - a) + a;
else
number = rand() % (a - b) + b;
return number;
}
double random_real_number(int a, int b)//产生a和b之间的随机实数
{
double number = 0;
if (a < b)
number = a + (b - a)*rand() / (RAND_MAX + 1.0);
else if (a>b)
number = b + (a - b)*rand() / (RAND_MAX + 1.0);
else
number = (double)a;
return number;
}
double objective_function(double x)//目标函数
{
return x*x*x - 60*x*x + 900*x + 100;
}
DE::DE()
{
best_i = 0;
best_fitness = 0;
random_a = 0;
random_b = 0;
random_c = 0;
parent_fitness[NP] = { 0 };
childen_fitness[NP] = { 0 };
}
void DE::initial_population(Individual *initial)//产生初始种群
{
for (int i = 0; i < NP; i++)
{
for (int j = 0; j < D; j++)
{
initial[i].element[j] = random_real_number(upper_bound, lower_bound);//随机产生个体
initial[i].fitness_value = objective_function(initial[i].element[j]);//计算个体适应值
}
}
for (int i = 0; i < NP; i++)//将初始种群作为父代种群
parent_fitness[i] = initial[i].fitness_value;
}
void DE::mutation_operator(Individual *initial, Individual *mutation)//变异
{
for (int i = 0; i < NP; i++)
{
do //变异的个体随机选择,但不能是同一个个体
{
random_a = random_integer(0, NP);
random_b = random_integer(0, NP);
random_c = random_integer(0, NP);
} while (i == random_a || i == random_b || i == random_c || random_a == random_b || random_a == random_b || random_b == random_c);
for (int j = 0; j < D; j++)//变异操作
{
mutation[i].element[j] = initial[random_c].element[j] + F*(initial[random_a].element[j] - initial[random_b].element[j]);
if (mutation[i].element[j] > upper_bound || mutation[i].element[j] < lower_bound)//边界处理,如果变异后的个体不合要求,就重新产生
{
mutation[i].element[j] = random_real_number(upper_bound, lower_bound);
}
}
}
}
void DE::crossover_operator(Individual *initial, Individual *mutation, Individual *crossover)//交叉
{
for (int i = 0; i < NP; i++)
{
for (int j = 0; j < D; j++)
{
if (random_real_number(0, 1) < CR)
{
crossover[i].element[j] = mutation[i].element[j];
}
else
{
crossover[i].element[j] = initial[i].element[j];
}
}
}
}
void DE::select_operator(Individual *initial, Individual *crossover)//选择
{
for (int i = 0; i < NP; i++)
{
for (int j = 0; j < D; j++)
{
if (objective_function(crossover[i].element[j]) >= objective_function(initial[i].element[j]))//更新个体
{
initial[i].element[j] = crossover[i].element[j];
childen_fitness[i] = objective_function(crossover[i].element[j]);
}
else
{
childen_fitness[i] = parent_fitness[i];
}
}
}
}
void DE::find_best_individual()//找到最优解
{
best_fitness = parent_fitness[0];
for (int i = 0; i < NP; i++)
{
if (best_fitness < parent_fitness[i])
{
best_i = i;
best_fitness = parent_fitness[i];
}
}
}
void DE::output_best()//输出最优解
{
cout << "最优解:" << parent_fitness[best_i] << endl;
}
int main()
{
int ng = 0;
Individual _initial[NP];//当前种群
Individual _mutation[NP];//变异种群
Individual _crossover[NP];//交叉种群
DE de;
clock_t start, finish;
start = clock();
srand((unsigned)time(0));
de.initial_population(_initial);
while (ng <= NG)
{
de.find_best_individual();
de.mutation_operator(_initial, _mutation);
de.crossover_operator(_initial, _mutation, _crossover);
de.select_operator(_initial, _crossover);
ng++;
}
de.output_best();
finish = clock();
cout << double(finish - start) / CLOCKS_PER_SEC << " (s) " << endl;
system("pause");
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
差分进化算法求解平方和函数最小值.zip (20个子文件)
差分进化算法求解平方和函数最小值
差分进化算法求解平方和函数最小值.sln 1KB
差分进化算法求解平方和函数最小值.sdf 7.25MB
差分进化算法求解平方和函数最小值.v12.suo 20KB
差分进化算法求解平方和函数最小值
差分进化算法求解平方和函数最小值.vcxproj.filters 943B
de.cpp 5KB
Debug
差分进化算法求解平方和函数最小值.tlog
CL.write.1.tlog 484B
CL.read.1.tlog 12KB
cl.command.1.tlog 570B
link.write.1.tlog 466B
差分进化算法求解平方和函数最小值.lastbuildstate 198B
link.command.1.tlog 1KB
link.read.1.tlog 3KB
vc120.pdb 340KB
vc120.idb 267KB
de.obj 161KB
差分进化算法求解平方和函数最小值.log 2KB
差分进化算法求解平方和函数最小值.vcxproj 3KB
Debug
差分进化算法求解平方和函数最小值.pdb 1.1MB
差分进化算法求解平方和函数最小值.exe 69KB
差分进化算法求解平方和函数最小值.ilk 906KB
共 20 条
- 1
资源评论
- tutu0812182023-06-06总算找到了想要的资源,搞定遇到的大问题,赞赞赞!
林当时
- 粉丝: 95
- 资源: 1万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功