hdu2899:Strange fuction(模擬退火演算法)
阿新 • • 發佈:2018-12-18
Problem Description Now, here is a fuction: F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100) Can you find the minimum value when x is between 0 and 100. Input The first line of the input contains an integer T(1<=T<=100) which means the number of test cases. Then T lines follow, each line has only one real numbers Y.(0 < Y <1e10) Output Just the minimum value (accurate up to 4 decimal places),when x is between 0 and 100. Sample Input 2 100 200 Sample Output -74.4291 -178.8534 |
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; typedef long long ll; #define T 100 #define eps 1e-8 #define delta 0.98 #define INF 0x7fffffff const int maxn = 3; double x[maxn]; double Random() { double x = rand() * 1.0 / RAND_MAX; if(rand() & 1) x *= -1; return x; } double f(double x, double y) { return 6 * x * x * x * x * x * x * x + 8 * x * x * x * x * x * x + 7 * x * x * x + 5 * x * x - y * x; } void init() { for(int i = 0; i < maxn; i++) { x[i] = fabs(Random()) * 100; } } double Search(double y) { double t = T;//初始化溫度 double ans = INF; while (t > eps) { for(int i = 0; i < maxn; i++) {//隨機選3個起點 只選一個也可以 不隨機選也可以 根據時間複雜度改變吧 最多10個 double temp = f(x[i], y); for(int j = 0; j < maxn; j++) { double xx = x[i] + Random() * t; if(xx - 0 >= -eps && xx - 100 <= eps) { double fx = f(xx, y); if(fx < temp) { x[i] = xx; temp = fx; } } } ans = min(ans, temp); } t *= delta; } return ans; } int main() { int TT; scanf("%d", &TT); while (TT--) { init(); double y, ans; scanf("%lf", &y); ans = Search(y); printf("%.4lf\n", ans); } return 0; }