c语言遗传算法中加入模拟退火,怎么编写模拟退火程序呢
这是我在遗传算法变异操作后加的模拟退火程序,怎么改正或是编写呢?void mutationoperatorSA() //模拟退火扰动操作{
{
int i,j;
double p;
for (i=0;i<popsize;i++)
{
for(j=0;j<chromlength;j++)
{
p=rand()%1000/1000.0;//printf("@@@@p=%f",p);
if (p<pm)
{
//printf("\nbianyi\n");
population[i].chrom[j]=(population[i].chrom[j]=='0')?'1':'0';//问题
}
}
}
}
void SA()
{
int i,j;
struct individual newpopulation[POPSIZE];
// 冷却表参数
int MarkovLength = 10000; // 马可夫链长度
double Tolerance = 0.01; // 容差
DecayScale = 0.95; // 衰减参数0.95
double Temperature = 100; // 初始温度
population[i],newpopulation[i]; // prior and next value of x
int AcceptPoints = 0; // Metropolis过程中总接受点
//srand((unsigned)time(NULL));
//1.0f*rand()/RAND_MAX //0~1之间的浮点数
// 随机选点
// 每迭代一次退火一次(降温), 直到满足迭代条件为止
double StartTemperature = Temperature; //初始温度
for(i=0;i<popsize; i++)
{
Temperature *=DecayScale;
AcceptPoints = 0;
// 在当前温度T下迭代loop(即MARKOV链长度)次
for (int j=0;j<MarkovLength;j++)
{
mutationoperatorSA();
calculateobjectvalue();
calculatefitnessvalue();
// 3) Metropolis过程
if( population[i].fitness - newpopulation[i].fitness > 0 )
{
// 接受, 此处lastPoint即下一个迭代的点以新接受的点开始
population[i]=newpopulation[i];
AcceptPoints++;
}
else
{
double change = -1 * ( newpopulation[i].fitness - population[i].fitness ) / Temperature ;
if( exp(change) > 1.0f*rand()/RAND_MAX )
{
population[i]=newpopulation[i];
AcceptPoints++;
}
// 不接受, 保存原解
}while( fabs( newpopulation[i].fitness - population[i].fitness ) > Tolerance );
}
}
}