資源簡(jiǎn)介
四目標(biāo)遺傳算法最小值優(yōu)化代碼,c++,目標(biāo)函數(shù)可以自行更改。
代碼片段和文件信息
//?ConsoleApplication2.cpp:?定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//
#include?“stdafx.h“
#include
#include
#include
#include
#define?PI?3.1415926?//圓周率
#define?sizepop?50?//?種群數(shù)目
#define?maxgen?500?//?進(jìn)化代數(shù)
#define?pcross?0.6?//?交叉概率
#define?pmutation?0.1?//?變異概率
#define?lenchrom?5?//?染色體長(zhǎng)度
#define?bound_down?0?//?變量下界,這里因?yàn)槎枷嗤跃陀脝蝹€(gè)值去代替了,如果每個(gè)變量上下界不同,也許需要用數(shù)組定義
#define?bound_up?(0.9*3.1415926)?//?上界
double?chrom[sizepop][lenchrom];?//?種群數(shù)組
double?fitness[sizepop];?//種群每個(gè)個(gè)體的適應(yīng)度
double?fitness_prob[sizepop];?//?每個(gè)個(gè)體被選中的概率(使用輪盤(pán)賭法確定)
double?bestfitness[maxgen];?//?每一代最優(yōu)值
double?gbest_pos[lenchrom];?//?取最優(yōu)值的位置
double?average_best[maxgen?+?1];?//?每一代平均最優(yōu)值
double?gbest;?//?所有進(jìn)化中的最優(yōu)值
int?gbest_index;?//?取得最優(yōu)值的迭代次數(shù)序號(hào)
?//?目標(biāo)函數(shù)
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;
}
//?求和函數(shù)
double?sum(double?*?fitness)
{
double?sum_fit?=?0;
for?(int?i?=?0;?i sum_fit?+=?*(fitness?+?i);
return?sum_fit;
}
//?求最小值函數(shù)
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?=?*(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]);?//?初始化適應(yīng)度
}
}
//?選擇操作
void?Select(double?chrom[sizepop][lenchrom])
{
int?index[sizepop];
for?(int?i?=?0;?i {
double?*?arr?=?chrom[i];
fitness[i]?=?1?/?(fit_func(arr));?//?本例是求最小值,適應(yīng)度為目標(biāo)函數(shù)的倒數(shù),即函數(shù)值越小,適應(yīng)度越大
}
double?sum_fitness?=?0;
for?(int?i?=?0;?i {
sum_fitness?+=?fitness[i];?//?適應(yīng)度求和
}
for?(int?i?=?0;?i {
fitness_prob[i]?=?fitness[i]?/?sum_fitness;
}
for?(int?i?=?0;?i {
fitness[i]?=?1?/?fitness[i];?//?恢復(fù)函數(shù)值
}
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 {
//?隨機(jī)選擇兩個(gè)染色體進(jìn)行交叉
double?pick1?=?((double)rand())?/?RAND_MAX;
double?pick2?=?((double)rand()
評(píng)論
共有 條評(píng)論