Poj1379 poj 2539(模擬退火

2022-05-12 18:42:50 字數 3405 閱讀 9397

題目:在矩形中有若干個點,求乙個點使得所有點到該點的最小距離最大。

思路:這個是2023年顧研**上的例題,可以比較簡單地用模擬退火演算法求解。所謂模擬退火就是先隨機出若干個點,然後以某一特定步長嘗試周圍的解,而後逐漸縮小步長,知道步長小於特定值,跳出。這個演算法雖然簡單易行,但是其正確性並不是非常有保障,(不合理的隨機方法可能會降低到達正確解的概率),而且幾個主要引數的選取也主要看經驗,畢竟對於乙個隨機化演算法做出像**中一樣的嚴格評估還是比較困難的。。。。所以說即使實現完全正確,能否通過有時也是玄學的領域。。。。。尤其對於不太適合隨機化的題。

ps:poj不能用time,一呼叫就re,查了乙個多小時錯才發現。。。。以後不用time了。。。

/*

* @author: cwind

* * 蒟蒻只能做幾個水題。。

*///

#pragma comment(linker, "/stack:102400000,102400000")

#include #include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define ios std::ios::sync_with_stdio (false);std::cin.tie(0)

#define pb push_back

#define pb pop_back

#define bk back()

#define fs first

#define se second

#define sq(x) (x)*(x)

#define eps (1e-3)

#define iinf (1<<29)

#define linf (1ll<<59)

#define finf (1e100)

#define inf 1000000000

const

double pi=acos(-1.0

);typedef

long

long

ll;typedef unsigned

long

long

ull;

typedef pair

pii;

typedef pair

p;inline

double dis(double x1,double y1,double x2,double

y2)int

t;int

x,y,m;

const

int l=30

;double zx[1005],zy[1005

];int

main()

for(int i=0;i<30;i++)

}while(delta>eps)

if(md>d[i])}}

delta*=0.8

; }

double ans=0

;

int ansp=0

;

for(int i=0;i<30;i++)

}printf(

"the safest point is (%.1f, %.1f).\n

",pos[ansp][0],pos[ansp][1

]); }

return0;

}

view code

poj2539

題目:求使得一點到其他各點距離之和最小的點。

思路:和上題一樣的寫法,很順利的1a了。。

/*

* @author: cwind

* * 蒟蒻只能做幾個水題。。

*///

#pragma comment(linker, "/stack:102400000,102400000")

#include #include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define ios std::ios::sync_with_stdio (false);std::cin.tie(0)

#define pb push_back

#define pb pop_back

#define bk back()

#define fs first

#define se second

#define sq(x) (x)*(x)

#define eps (1e-3)

#define iinf (1<<29)

#define linf (1ll<<59)

#define finf (1e100)

#define inf 1000000000

const

double pi=acos(-1.0

);typedef

long

long

ll;typedef unsigned

long

long

ull;

typedef pair

pii;

typedef pair

p;inline

double dis(double x1,double y1,double x2,double

y2)const

int maxp=50

;const

int maxx=10000

;int

n;double c[105][2

];double p[maxp][2

],d[maxp];

double delta=5000

;int l=30

;double a=0.8

;int

main()

for(int i=0;i)

d[i]=sdis;

}while(delta>eps)

if(sdis}}

delta*=a;

}double ans=1e100;

for(int i=0;i)

printf(

"%.0f

",ans);

return0;

}

view code

poj 2420 poj1379 模擬退火

具體模擬退火的原理可參考 模擬退火可用於一些 精度 要求不是很高的題目。比如取答案的0.1,或者沒有小數點 poj2420 題意 給定n個點,找到乙個點,使得n個點到這個點的距離和最小 模擬退火法 模擬退火的過程 1 確定生成點的範圍,初設為矩形,在這個範圍內生成num個點 num自定 2 確定最高...

poj1379 模擬退火

poj 1379 題意 給定n個點,你需要在給定矩形範圍內找到乙個點,使得它到這n個點的距離的最小值最大。一開始是用的顧研的方法,但總是ac不了,聽盾哥說他那個有問題。正確的演算法流程應該是 初始化 初始溫度de 充分大 初始p個並行解狀態s 演算法迭代的起點 失敗次數上限l,接受引數x,衰變係數k...

poj 1379 模擬退火

題意 給定n個點和範圍,在範圍內找到乙個點,使得n個點到這個點的最小距離最大 模擬退火法 模擬退火的過程 1 找到這些點所在的範圍,用兩個點框定 中e1,e2兩個點 2 在這個範圍內生成num個點 num自定 3 對於每個生成的點i,在其周圍生成num個點,一旦有點優於i,則替換。4 縮小範圍d,若...