求函数最值(模拟退火算法C++实现)

#include
#include
#include
#include
using namespace std;
//迭代准确率不是太高,需要逐步调参
int T = 100;            //初始温度
double Tmin = 10; //温度最小值
double delta =0.9; //温度下降比例
double getResult(double x)
{
double result = (double)pow(x, 2);//求x平方的最小值
return result;
}
double getSA()               //温度每下降一次,需要迭代10000次
{
double t = T;
vector v(10000);   //迭代10000次
vector::iterator i1 = v.begin();
for (; i1 < v.end(); i1++)
{
*i1 = rand();
}
while (t>Tmin) //Metropolis抽样算法
{
for (i1=v.begin(); i1 < v.end(); i1++)
{
double temp = getResult(*i1);
double temp_new = *i1 + (rand() * 2 - 1)*t;
if (temp_new>0 && temp_new<100)
{
double fun_new = getResult(temp_new);
if (fun_new - temp < 0)       
{
*i1 = temp_new;
}
else
{
double p = 1 / (1 + exp(-(fun_new - temp) / t));
if (rand() < p)
{
*i1 = temp_new;
}
}
}
}
t = t*delta;
}


i1 = v.begin();                 //迭代完了,取最小值,理论上来说,应该迭代到0
double min = getResult(*i1);
for (; i1 < v.end(); i1++)
{
if (getResult(*i1) < min)
min = getResult(*i1);
}
return min;
}


int main()
{
srand((unsigned)time(NULL)); //随机数种子
cout< system("pause");
return 0;
}

你可能感兴趣的:(AI)