資源簡介
Shubert函數324個全局最優解問題,《演化優化及其在微分方程反問題中的應用》一文中提出了GMLE_DD算法,由于并行計算考試的需要,對論文中提出的方法進行了實現,在這里共享出來,C++實現。源代碼是n = 4時的情況。算法性能簡介http://blog.csdn.net/ryl219362/article/details/17100039
代碼片段和文件信息
#include??
#include??
#include??
#include?“time.h“
#define?Q_NUM 81//3//9//27//81 //?劃分子空間的個數
#define?POPSIZE 250//100//100//100//250 //?種群的數量
#define?NVARS 4//1//2//3//4 //?變量的數量
#define?M_SELECT 10 //?選擇后的數量
#define?GLOBAL_GEN 50000//2000//2000//5000//50000 //?演化代數
#define?SUB_GEN 100000//5000//5000//20000//100000 //?子種群演化代數
#define?MAX_NUM 10//5//10//10//10 //?p的上界
#define?MIN_NUM 5//1//3//4//5 //?p的下界
#define?N1_NUM 150//100//100//100//150 //?子種群的個體數量
#define?LBOUND -10.0
#define?UBOUND 10.0
#define?ANS_NUM 324//3//18//81//324 //?最優解的個數
#define?EPSILON_N 0.005//0.5//0.5//0.5//0.005 //?p的下界
#define?ALPHA 0.05//0.2//0.2//0.2//0.05 //?p的下界
//?a滿足總和固定為1的,每個元素的范圍是-0.5~1.5??的系數
double?EPSILON?=?EPSILON_N?A[M_SELECT];
int?cur_best?cur_worst; //?當前最好的當前最差的
double?best_fitness?worst_fitness; //?當前最好最壞的適應值
struct?genotype
{?
double?gene[NVARS]; //?基因?
double?fitness; //?適應度
double?upper[NVARS]; //?上邊界?
double?lower[NVARS]; //?下界
};?
struct?genotype?population[POPSIZE]; //?當前種群
struct?genotype?newpopulation[MAX_NUM]; //?p個個體的種群?
struct?genotype?subpopulation[N1_NUM]; //?子種群
struct?genotype?ansPopulation[ANS_NUM]; //?ANS_NUM個最優解
void?generateA()
{ //?生成一個和為1固定的隨機序列a
double?sum?=?0?minbound?=?0.5?maxbound?=?1.5;
for?(int?i?=?0;?i? {
A[i]?=(maxbound?-?minbound)?*?rand()?/?(1.0?*?RAND_MAX)?+?minbound;
sum?=?sum?+?A[i];
maxbound?=?1.5?1.5-sum???1.5?:?1.5?-?sum;
minbound?=?-0.5?>?(-0.5-sum)???-0.5?:?(-0.5?-?sum);
}
A[?M_SELECT?-?1]?=?1-sum;
}
double?calfitness(double?*x)
{ //?計算一個基因的適應度,shubert函數值取負
double?result?=?1.0?tmp?=?0.0;
for?(int?i?=?0;?i? {
tmp?=?0.0;
for?(double?j?=?1.0;?j?6;?j++)
tmp?+=?j?*?cos((j+1)?*?x[i]?+?j);
result?*=?tmp;
}
return?-result;
}
void?init1Gene(genotype?&single?double?lower[]?double?upper[])
{ //?初始化一個個體
for?(int?i?=?0?;?i?? {
single.lower[i] =?lower[i];
single.upper[i] =?upper[i];
single.gene[i] =?((double)(rand()?/?(1.0*RAND_MAX)))?*?(upper[i]?-?lower[i])?+?lower[i];?
}
single.fitness =?calfitness(single.gene);
}
void?initialize(double?lbound[]?double?ubound[])?
{? //?初始化一個種群
EPSILON?=?EPSILON_N; //?初始化EPSILON
for?(int?j?=?0;?j? init1Gene(population[j]?lbound?ubound);
}?
void?keepbestworst(genotype?*pops?int?sizes)
{ //?確定最好的和最差的個體
best_fitness?=?-INT_MAX?worst_fitness?=?INT_MAX;
for?(int?mem?=?0;?mem? {?
if?(pops[mem].fitness? {?
cur_worst?=?mem;?
worst_fitness?=?pops[mem].fitness;?
}
if?(pops[mem].fitness?>?best_fitness)?
{?
cur_best?=?mem;?
best_fitness?=?pops[mem].fitness;?
}
}
}?
void?select(genotype?pops[]?int?sizes)?
{ //?從種群中選取?M_SELECT?個個體多父體雜交
genotype?single?=?pops[0];
int?selected[M_SELECT]?=?{0};
for(int?i?=?0;?i?
評論
共有 條評論