模拟退火(Simulated Annealing, SA)算法是一种概率型启发式搜索算法,用于寻找优化问题中的全局最优解。以下是使用MATLAB实现模拟退火算法的一个示例代码,该代码旨在最小化一个简单的数学函数。
function sa_example()
% 初始化参数
max_iterations = 1000; % 最大迭代次数
initial_temp = 1000; % 初始温度
cooling_rate = 0.01; % 冷却率
min_temp = 1e-5; % 最小温度
step_size = 0.1; % 步长
dimensions = 2; % 问题维度
lower_bound = -10; % 搜索空间的下界
upper_bound = 10; % 搜索空间的上界
% 目标函数,例如 f(x) = sum((x - 3)^2, 2) + 20;
% 这是一个具有多个局部最小值的函数
target_function = @(x) sum((x - 3).^2, 2) + 20;
% 初始化解
x = (upper_bound - lower_bound) .* rand(dimensions, 1) + lower_bound;
f_x = target_function(x);
% 初始化最佳解
best_x = x;
best_fx = f_x;
% 模拟退火循环
for iter = 1:max_iterations
current_temp = initial_temp * (cooling_rate ^ iter);
% 如果温度小于最小温度,则停止
if current_temp < min_temp
break;
end
% 生成新的解
new_x = x + step_size * (randn(dimensions, 1) - 0.5);
new_x = max(min(new_x, upper_bound), lower_bound); % 确保新解在界限内
new_fx = target_function(new_x);
% 计算概率接受比当前解差的新解
if new_fx < f_x || exp((f_x - new_fx) / current_temp) > rand()
x = new_x;
f_x = new_fx;
% 更新最佳解
if new_fx < best_fx
best_x = new_x;
best_fx = new_fx;
end
end
% 打印当前状态(可选)
if mod(iter, 100) == 0
fprintf('Iteration: %d, Current solution: %f, Current f(x): %f, Best f(x): %f\n', ...
iter, x, f_x, best_fx);
end
end
% 输出结果
fprintf('Best solution found: x = [%f, %f], f(x) = %f\n', best_x(1), best_x(2), best_fx);
end
代码解释
参数初始化:我们设置了最大迭代次数、初始温度、冷却率、最小温度、步长、问题维度、搜索空间的上下界。
目标函数:target_function是我们想要最小化的函数。在这个例子中,我们使用了一个简单的二次函数。
初始化解:我们从搜索空间中随机选择一个点作为初始解。
模拟退火循环:在循环中,我们逐渐降低温度,每次迭代生成一个新的解,并根据概率函数决定是否接受这个新解。
生成新解:新解是通过在当前解的基础上加上一个小的随机扰动得到的,并确保新解在界限内。
概率接受:即使新解的函数值比当前解的函数值大,也有可能以一定的概率被接受,这个概率随着温度的降低而减小。
输出结果:在找到最佳解后,我们打印出最佳解及其函数值。
这个模拟退火算法的实现可以作为一个基础框架,根据你的具体问题进行调整和扩展。