模拟退火算法(Simulated Annealing, SA)是一种通用概率算法,用来在一个大的搜寻空间内
寻找足够好的解,是解决优化问题的一种有效策略。该算法源自固体的退火过程,这一过程
中,物质被加热后再缓慢冷却,原子会在加热过程中获得较大的运动能量,随着温度的缓慢
降低,原子逐渐冷却并达到能量较低的稳定状态。同理,在模拟退火算法中,系统温度会逐
渐下降,解的接受概率也会随之改变,从而避免陷入局部最优解。
下面是一个用 Java 实现的模拟退火算法的基本框架,用于求解函数 f(x) = x^2 在区间[-10, 10]
上的最小值问题。
```java
import java.util.Random;
public class SimulatedAnnealing {
// 目标函数:f(x) = x^2
private static double function(double x) {
return x * x;
}
// 模拟退火算法
public static double simulatedAnnealing(double initial, double finalTemperature, double
coolingRate, int iterations) {
double temperature = finalTemperature; // 初始化温度
double x = initial; // 初始解
double minX = x; // 当前最佳解
double minF = function(x); // 当前最佳函数值
Random rand = new Random(); // 随机数生成器
for (int i = 0; i < iterations; i++) {
double randomValue = rand.nextDouble() * 2 - 1; // 生成随机数,范围在[-1, 1]
double newX = x + randomValue * temperature; // 生成新的解
// 判断新解是否更好,使用 Metropolis 准则
if (function(newX) < function(x)) {
x = newX;
if (function(x) < minF) {
minX = x;
minF = function(x);
}
} else {
// 计算接受概率,使用 boltzmann 分布
double probability = Math.exp(-(function(newX) - function(x)) /
temperature);
if (rand.nextDouble() < probability) {
x = newX;
}
}
// 降温
temperature *= (1 - coolingRate);
}
return minF;