poj 2420 poj1379 模擬退火

2021-06-29 03:50:09 字數 1532 閱讀 9591

具體模擬退火的原理可參考  

模擬退火可用於一些  精度  要求不是很高的題目。

比如取答案的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...