根据 Link,感觉老题解大多害人不浅。
写一下我理论分析认为错误的题解,但是懒得造 hack 了,老哥们帮忙看一看,如果没分析错就帮忙 @ 一下管理,有错误请指出。
else if((1.0*exp(rc-lsc))/T>(1.0*rand()/RAND_MAX))//以一定的概率接受较差的新解,具体讲解见上面贴的Ciyang大佬的博客
{
exc(x,y);//换回去(不换回去(即接受命运的审判(较差的新解))的概率会越来越低,可以自行理解,exp函数用法见Ciyang大佬的博客)
}
这部分判断条件写错了。T 应放在 exp 里面,且应为 <。 2
else if(exp((best_ans - tmp_ans) / T) > (double)rand() / RAND_MAX) {
//条不接收较差的条件
swap(pos[x], pos[y]);
//不接受较差解,将两个牛位置交换回去
}
应为 <。
else if(exp(ans-Num)/T<double(rand())/RAND_MAX)swap(pos[x],pos[y]);
这里 T 应放在 exp 里面。
else if((exp(dc-linshi)*1.0/t>(rand()*1.0/RAND_MAX))) change(x,y); //用一定的概率接受该解(毕竟有比你优的,但是你肯定要把不优的换回去啊qwq
T 应放在 exp 里面,应为 <。
if(exp(de/t)>rand())//这里是如果按一定概率接受答案没有接受,就把答案改回来
{
swap(b[ex],b[ey]);
}
这位更是重量级。
if(exp(1.0*(now-lcans))/temp<1.0*rand()/RAND_MAX) // 概率接受
{
swap(pos[x],pos[y]);
}
temp 应放在 exp 里面。
else if (exp(abs(now - ans)) * 1.0 / temp < rddb(10000) / 32767){
ans = now;
}
temp 应放在 exp 里面。
else if (exp((ans - mmm) / t) > (double)rand() / (double)RAND_MAX) swap(pos[x], pos[y]);
应为 <。