模拟退火算法C语言实现
时间: 2024-04-14 10:07:51 浏览: 137
基于C语言的模拟退火算法
5星 · 资源好评率100%
以下是模拟退火算法的C语言实现示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define MAX_STEPS 100000 // 最大迭代次数
#define T_INITIAL 100.0 // 初始温度
#define T_FINAL 0.001 // 终止温度
#define ALPHA 0.95 // 降温速率
double rand_double(double a, double b) {
double r = (double)rand() / RAND_MAX;
return a + r * (b - a);
}
double energy(double x) { // 优化目标函数,这里以 x^2 为例
return x * x;
}
double acceptance_probability(double delta_energy, double temperature) { // 计算接受概率
if (delta_energy < 0) {
return 1.0;
}
return exp(-delta_energy / temperature);
}
void simulated_annealing() {
srand(time(NULL));
double x = rand_double(-10.0, 10.0); // 初始状态
double temperature = T_INITIAL;
double energy_current = energy(x);
double energy_best = energy_current;
double x_best = x;
int steps = 0;
while (temperature > T_FINAL && steps < MAX_STEPS) {
double x_new = rand_double(-10.0, 10.0); // 生成新的状态
double energy_new = energy(x_new);
double delta_energy = energy_new - energy_current;
if (acceptance_probability(delta_energy, temperature) > rand_double(0.0, 1.0)) {
x = x_new;
energy_current = energy_new;
}
if (energy_current < energy_best) {
energy_best = energy_current;
x_best = x;
}
temperature *= ALPHA; // 降温
steps++;
}
printf("Final temperature: %f\n", temperature);
printf("Best solution: x = %f, energy = %f\n", x_best, energy_best);
}
int main() {
simulated_annealing();
return 0;
}
```
在以上示例中,我们以优化目标函数 x^2 为例,定义了 rand_double() 用于生成指定范围内的随机浮点数,energy() 用于计算优化目标函数的值,acceptance_probability() 用于计算接受概率。在 simulated_annealing() 中,我们定义了初始状态 x、初始温度 temperature、当前能量 energy_current、最佳能量 energy_best、最佳状态 x_best 以及迭代次数 steps 等变量,然后在 while 循环中进行模拟退火算法过程,直到温度低于终止温度或达到最大迭代次数。在每次循环中,我们生成新的状态 x_new,计算其能量 energy_new,然后计算出能量差 delta_energy,如果接受概率大于一个随机生成的浮点数,则接受 x_new 作为新的状态,否则继续使用当前状态 x。在每次迭代中,我们还记录下当前能量最小的状态 x_best 以及其对应的能量 energy_best。最后输出最终温度和最佳状态及其能量。
阅读全文