首次接觸模擬退火,看來還是挺神奇的。
主要參考這篇博文:
題意判斷多邊形內部能否容納乙個半徑為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.模擬退火演算法認識 爬山演算法也是乙個用來求解最優化問題的演算法,每次都向著當前上公升最快的方向往上爬,但是初始化不同可能 會得到不同的區域性最優值,模擬退火演算法就可能跳出這種區域性最優解的限制。模擬退火演算法是模擬熱力學系統 中的退火過程。在退火過程中是將目標函式作為能量函式。大致過程如下 ...