• 大小: 13KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-05-28
  • 语言: C/C++
  • 标签: 遗传算法  四目标  

资源简介

四目标遗传算法最小值优化代码,c++,目标函数可以自行更改。

资源截图

代码片段和文件信息

// ConsoleApplication2.cpp: 定义控制台应用程序的入口点。
//

#include “stdafx.h“
#include
#include
#include
#include
#define PI 3.1415926 //圆周率
#define sizepop 50 // 种群数目
#define maxgen 500 // 进化代数
#define pcross 0.6 // 交叉概率
#define pmutation 0.1 // 变异概率
#define lenchrom 5 // 染色体长度
#define bound_down 0 // 变量下界,这里因为都相同,所以就用单个值去代替了,如果每个变量上下界不同,也许需要用数组定义
#define bound_up (0.9*3.1415926) // 上界
double chrom[sizepop][lenchrom]; // 种群数组
double fitness[sizepop]; //种群每个个体的适应度
double fitness_prob[sizepop]; // 每个个体被选中的概率(使用轮盘赌法确定)
double bestfitness[maxgen]; // 每一代最优值
double gbest_pos[lenchrom]; // 取最优值的位置
double average_best[maxgen + 1]; // 每一代平均最优值
double gbest; // 所有进化中的最优值
int gbest_index; // 取得最优值的迭代次数序号


 // 目标函数
double fit_func(double * arr)
{
double x1 = *arr;
double x2 = *(arr + 1);
double x3 = *(arr + 2);
double x4 = *(arr + 3);
double x5 = *(arr + 4);
double func_result = -5 * sin(x1)*sin(x2)*sin(x3)*sin(x4)*sin(x5) - sin(5 * x1)*sin(5 * x2)*sin(5 * x3)*sin(5 * x4)*sin(5 * x5) + 8;
return func_result;
}

// 求和函数
double sum(double * fitness)
{
double sum_fit = 0;
for (int i = 0; i sum_fit += *(fitness + i);
return sum_fit;
}
// 求最小值函数
double * min(double * fitness)
{
double min_fit = *fitness;
double min_index = 0;
static double arr[2];
for (int i = 1; i {
if (*(fitness + i) < min_fit)
{
min_fit = *(fitness + i);
min_index = i;
}
}
arr[0] = min_index;
arr[1] = min_fit;
return arr;
}
// 种群初始化
void init_chrom()
{
for (int i = 0; i {
for (int j = 0; j {
chrom[i][j] = bound_up * (((double)rand()) / RAND_MAX);
}
fitness[i] = fit_func(chrom[i]); // 初始化适应度
}
}
// 选择操作
void Select(double chrom[sizepop][lenchrom])
{
int index[sizepop];
for (int i = 0; i {
double * arr = chrom[i];
fitness[i] = 1 / (fit_func(arr)); // 本例是求最小值,适应度为目标函数的倒数,即函数值越小,适应度越大
}
double sum_fitness = 0;
for (int i = 0; i {
sum_fitness += fitness[i]; // 适应度求和
}
for (int i = 0; i {
fitness_prob[i] = fitness[i] / sum_fitness;
}
for (int i = 0; i {
fitness[i] = 1 / fitness[i]; // 恢复函数值
}

for (int i = 0; i {
double pick = ((double)rand()) / RAND_MAX;
//while (pick < 0.0001)pick = ((double)rand()) / RAND_MAX;
for (int j = 0; j {
pick = pick - fitness_prob[j];
if (pick <= 0)
{
index[i] = j;
break;
}

}

}
for (int i = 0; i {
if (index[i] != 0)
{
for (int j = 0; j {
chrom[i][j] = chrom[index[i]][j];
}
fitness[i] = fitness[index[i]];
}

}
}

// 交叉操作
void Cross(double chrom[sizepop][lenchrom])
{
for (int i = 0; i {
// 随机选择两个染色体进行交叉
double pick1 = ((double)rand()) / RAND_MAX;
double pick2 = ((double)rand()

评论

共有 条评论