新学模拟退火求助

回复帖子

@chengni 2019-01-16 16:00 回复

我是从日报学的模拟退火,想拿这道题练一下,遇到了一个问题

这是某一篇题解的部分代码

void SA()
{
    double xx=xans;//初始化x的值 
    t=1926;//初始温度 
    while(t>1e-14)
    {
        double xtemp=xans+((rand()<<1)-RAND_MAX)*t;//随机生成一个x 
        double new_ans=f(xtemp);//计算新解 
        double DE=new_ans-ans;//计算新解与当前解的差值 
        if(DE>0)//新解大于当前解,则接受 
        {
            xx=xtemp;
            xans=xx;
            ans=new_ans;
        }
        else if(exp(-DE/t)*RAND_MAX>rand())//否则以概率接受 
        {
            xx=xtemp;
        }
        t*=delta;//降温 
    }
}//模拟退火 

其中关于

double xtemp=xans+((rand()<<1)-RAND_MAX)*t;//随机生成一个x 

这句话,为什么这里是 xans 而不是 xx,请大佬帮我讲解一下

@法兰西万岁 2019-02-18 11:52 回复

@chengni 我也想问这个问题,我也是在日报上学的,我觉得可能这里就是有问题,这个退火根本就用不上


else if(exp(-DE/t)*RAND_MAX>rand())//
 {
            xx=xtemp;
 }