基于蒙特卡洛算法的模拟退火算法求方程最值(c语言实现)

我的梦境 提交于 2019-11-26 17:36:44

–打个比方——将一个铁块加热至熔融态,并以此为最初状态,在此基础上不断降温,最终凝固,原子不再活跃。
–实现原理——刚开始的元素极为活跃,若是随机取到的值比原来的值更优,那么就放进一个临时的变量中,若是随机到的值较差,那么也有一定概率取到这个值,只不过概率随时间慢慢降低(退火降温导致原子不再活跃),最终将取到的临时变量中的值与原最优值进行比较,选择更新。
–实现步骤:
(1)定义初始温度、中止温度、退货速度;
(2)随机取一个值定为最优值;
(3)建立内外函数,内函数用来在等温状态(等概率)下取值,外函数用来退火降温(降低概率);

    #include <iostream>//模拟退火
    #include<stdlib.h>
    #include<math.h>
    #include<time.h>
    
    #define T 10000//初始温度
    #define EPS 1e-8//中止温度
    #define DELTA 0.98//退火速度
    #define y x*x*x+x*x+x//定义函数
    
    int main()
    {
    	double diffy, newy, besty, fakey, t = T, x;
    	int i, j;
    	srand((unsigned)time(NULL));
    	x = rand() % 1000;//函数定义域
    	besty = y;
    	while (1)
    	{
    		fakey = besty;
    		for (i = 0; i < 1000; i++)
    		{
    			x = rand() % 1000;
    			newy = y;
    			diffy = newy - besty;
    			if (diffy < 0)
    				fakey = newy;
    			else
    			{
    				double rd = rand() / (RAND_MAX + 1.0);
    				if (exp(diffy / t) > rd)
    					fakey = newy;
    			}
    		}
    		if (fakey < besty)
    			besty = fakey;
    		if (t < EPS)
    			break;
    		t *= DELTA;
    	}
    	printf("%lf", besty);
    	return 0;
    }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!