题目链接:HDU 2899
Problem Description
Now, here is a fuction:
F(x) = 6x^7+8x^6+7x^3+5x^2-yx (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
1 | 2 |
Sample Output
1 | -74.4291 |
Solution
题意
给定 $y$,求函数 $F(x) = 6x^7 + 8x^6 + 7x^3 + 5x^2 - yx$ 的最小值,其中 $x$ 的范围是 $[0, 100]$。
思路
模拟退火
模拟退火算法是一种随机化算法,在数学建模中比较常见,在 ACM 中不太常用。主要用于求解函数 (不是单峰函数的时候) 的最值,在最小圆/球覆盖中也有应用。
模拟退火算法基于物理退火的原理,将固体加热至高温然后冷却,温度越高降温的概率越大 (降温更快),温度越低降温的概率越小 (降温越慢)。模拟退火算法进行多次降温,直到找到一个可行解。
简单来说,如果新的状态比当前状态更优就接受该状态,否则以一定概率接受新状态。概率为:$P(\Delta E) = e^{\frac{-\Delta E}{T}}$,其中 $T$ 为当前温度,$\Delta E$ 新状态与当前状态的能量差。
模拟退火主要有三个参数:初始温度 $T_0$,降温系数 $d$,终止温度 $T_k$。
让当前温度 $T = T_0$,温度下降,尝试转移,如果转移 $T = d * T$。当 $T < T_k$ 时结束模拟退火算法。
伪代码如下:
1 | T0 = 100000; // 初始温度为高温,设置成一个大数 |
模拟退火算法的缺点主要是精度不高,求得的是近似最优解而不是最优解。
Code
1 |
|
Reference
《算法竞赛 入门到进阶》罗勇军 郭卫斌 著