具體模擬退火的原理可參考
模擬退火可用於一些 精度 要求不是很高的題目。
比如取答案的0.1,或者沒有小數點
poj2420:
/*
題意:給定n個點,找到乙個點,使得n個點到這個點的距離和最小
模擬退火法
模擬退火的過程
1 確定生成點的範圍,初設為矩形,在這個範圍內生成num個點(num自定)
2 確定最高溫度step,以及退溫係數,接下來進行退火
3 對於每個生成的點i,在以其為原點,半徑為step的!圓周上!,隨機生成k個點(注意踢掉不符合的點),一旦有點優於i,則替換。
(由於step的不斷縮小,所以總會找到符合的點)
4 縮小範圍d,若d《精度,退出,否則執行
5 遍歷所有num個點,找到val的最大值
*/#include #include #include #include #include #include using namespace std;
#define inf 1e20
const double pi=acos(-1.0);
const int maxn=1010;
const int num=20;
struct point
point(double a,double b)
}p[maxn],may[num+10];//原點,隨機生成的點
int n;
double val[num+10]; //價值陣列
double maxx,maxy;
double minx,miny;
double rand() //隨機生成0---1
double dist(point a,point b)
double judge(point tmp) //判斷函式
void init()//第一步 生成num個解(包括讀入啦)
}void solve()
point(double a,double b)
}p[maxn],may[num+10];//原點,隨機生成的點
int n;
double val[num+10]; //價值陣列
double x,y;
double rand() //隨機生成0---1
double dist(point a,point b)
double judge(point tmp) //判斷函式
void init()//第一步 生成num個解(包括讀入啦)
}void solve()
}step*=0.85; //退火
}int idx=1;
for(int i=2;i<=num;i++)
if(val[i]>val[idx])
idx=i;
printf("the safest point is (%.1lf, %.1lf).\n",may[idx].x,may[idx].y);
}int main()
Poj1379 poj 2539(模擬退火
題目 在矩形中有若干個點,求乙個點使得所有點到該點的最小距離最大。思路 這個是2008年顧研 上的例題,可以比較簡單地用模擬退火演算法求解。所謂模擬退火就是先隨機出若干個點,然後以某一特定步長嘗試周圍的解,而後逐漸縮小步長,知道步長小於特定值,跳出。這個演算法雖然簡單易行,但是其正確性並不是非常有保...
POJ 2420解題報告
好吧。這道題最大的收穫是發現模擬退火演算法好簡單啊。還是很容易寫出來的。這道題我看大牛們用的是牛頓近似解或者模擬退火演算法。可以移步這裡 提交到poj後wa,於是自己的程式改得越來越像上面鏈結中的程式了。於是不貼 了。收穫是最終發現錯誤還是出在邏輯上面,自己有個變數沒注意,導致雖然能過樣例點,但是過...
poj 2420 模擬退火
題意 給n個點,求與這n個點,距離和最接近的那個點是什麼,輸出這個最短距離。解析 模擬退火。在acdream那裡學模擬退火,準備做去年西安網賽的題目。來自 pragma comment linker,stack 1677721600 include include include include i...