模擬退火合集

2021-06-26 02:02:39 字數 2993 閱讀 2700

首次接觸模擬退火

,看來還是挺神奇的。

主要參考這篇博文:

題意判斷多邊形內部能否容納乙個半徑為r的圓,即在有限的平面內找最優範圍。遺傳演算法的結果難以掌控,爬山演算法又沒法保證跳出區域性最優,所以基於貪心原則的模擬退火演算法還是值得考慮的。

然後就是設定每次變化的步長和演化方式。該題可以從每條邊的中點開始,向乙個隨機方向延伸,使找出的點到各條邊的最小距離最大。

#include #include #include #include #include #include #include #include #include #include using namespace std;

#ifdef __gnuc__

typedef long long ll;

inline void opt64(ll a)

#else

typedef __int64 ll;

inline void opt64(ll a)

#endif

const int maxn = 55, maxstps = 6;

const double inf = 1e20, eps = 1e-3, aeps = 1e-3;

int n;

double radius;

inline int cmp(double x, double y)

inline int cmp(double x)

struct _point

void ipt()

double dot(const _point &a)

double cross(const _point &a)

_point operator + (const _point &a)

_point operator - (const _point &a)

double dis()

} da[maxn], db[maxn];

bool point_in_poly(_point p)

return res%2;

}double dis_point_to_seg(_point o, _point a, _point b)

void cal(_point * a)

int solve(double r)}}

}r *= 0.9;

}return 0;

}int main()

maxx = maxx - minx;

maxy = maxy - miny;

scanf("%lf", &radius);

if (solve(sqrt(maxx*maxx + maxy*maxy)/2.0)) puts("yes");

else puts("no");

}return 0;

}

找出橢球面上距離球心最近的點

#include #include #include #include #include using namespace std;

const double eps = 1e-10, r = 0.99;

double a, b, c, d, e, f, res;

double dir[8][2] = ;

inline double dis (double x, double y, double z)

inline int cmp(double x)

int cal(double a, double b, double c, double &z)

void solve()

k *= r;

}printf("%.7lf\n", res);

}int main()

return 0;

}

最小覆蓋圓

#include #include #include #include #include #include #include #include #include #include using namespace std;

#ifdef __gnuc__

typedef long long ll;

inline void opt64(ll a)

#else

typedef __int64 ll;

inline void opt64(ll a)

#endif

const int maxn = 1005, maxstps = 5;

const double inf = 1e20, eps = 1e-4, aeps = 1e-6;

int n;

double radius;

double maxx = -1, maxy = -1, minx = inf, miny = inf;

inline int cmp(double x, double y)

inline int cmp(double x)

struct _point

void ipt()

_point operator - (const _point &a)

double dis()

} da[maxn];

inline bool point_in_rect(double x, double y)

void solve(double x, double y, double r, double mxdis)

if (cmp(c-mxdis)==-1)}}

r *= 0.7;

}printf("(%.1lf,%.1lf).\n", x, y);

printf("%.1lf\n", mxdis);

}int main()

return 0;

}

模擬退火演算法

w 模擬退火演算法的基本思想 將乙個優化問題比擬成乙個金屬物體,將優化問題的目標函式比擬成物體的能量,問題的解比擬成物體的狀態,問題的最優解比擬成能量最低的狀態,然後模擬金屬物體的退火過程,從乙個足夠高的溫度開始,逐漸降低溫度,使物體分子從高能量狀態緩慢的過渡到低能量狀態,直至獲得能量最小的理想狀態...

模擬退火演算法

一些求解極值的問題不能通過函式特性直接求解,只能暴力列舉,但是單純的列舉效率不高,通過模擬退火演算法可以高效的找到答案。學習好博文 最小圓覆蓋 hdu 3007 buried memory 大意 給出一些點,求出能覆蓋他們的最小的圓。輸出圓心和半徑 include include include i...

模擬退火演算法

1.模擬退火演算法認識 爬山演算法也是乙個用來求解最優化問題的演算法,每次都向著當前上公升最快的方向往上爬,但是初始化不同可能 會得到不同的區域性最優值,模擬退火演算法就可能跳出這種區域性最優解的限制。模擬退火演算法是模擬熱力學系統 中的退火過程。在退火過程中是將目標函式作為能量函式。大致過程如下 ...