模拟matlab退火算法工具箱求解大型问题的效率

3142人阅读
智能信息处理(3)
一、实验目的
1.&掌握模拟退火算法的基本原理和步骤。
2.&复习、的基本概念、基本语法和编程方法,并熟练使用、编写模拟退火算法程序。
二、实验设备
三、实验原理
模拟退火算法是基于迭代求解策略的一种随机寻优算法,其出发点是基于物理退火过程与组合优化之间的相似性,模拟退火算法由某一较高初温开始,利用具有概率突跳特性的抽样策略在解空间中进行随机搜索,伴随温度的不断下降重复抽样过程,最终得到问题的全局最优解。
标准模拟退火算法的一般步骤可描述如下:
(1)令m=0,给定初温tm,随机产生初始状态sm;
(2)Repeat;
(2.1)Repeat;
(2.1.1)产生新状态:snew=Generate(sold);
(2.1.2)若C(sold)-C(snew))/tm]}?random[0,&1],则sold=snew;
(2.1.3)Until抽样稳定准则满足;
(2.2)退温:tm+1=update(tm),sm+1=sold,m=m+1;
(3)Until算法终止准则满足;
(4)输出算法搜索结果:sm。
四、预习要求
1.&认真阅读教材中模拟退火算法的基本原理与步骤。
2.&复习、的基本概念、基本语法和编程方法。
图1&标准模拟退火算法流程图
代码实现::::::::::::::::::::
#include &stdio.h&
#include &stdlib.h&
#include &time.h&
#include &string.h&
#include &math.h&
#define MAXN 10
const double MIN = 100.00;
//数据范围
const double INIT_T = 300;
//初始温度
const double RATE = 0.95;
//温度衰减率
const double FINAL_T = 0.1;
//凝固温度
const int IN_LOOP = 130;
//内层循环次数
const int OUT_LOOP = 100;
//外层循环次数
const int P_LIMIT = 10000;
//概率选择次数
double cost = 0; //用于记录次数
struct path
//数据类型存储
double NUM[MAXN];
path getnext(path p) //得到下一组数据的函数
printf(&第%.0lf次改变数字:\n&, cost);
x = (int)(10.0*rand()/(RAND_MAX+1.0)); //随机产生一个0-9的数更换
printf(&更换的是%d:%lf&, x, ret.NUM[x]);
ret.sum -= ret.NUM[x]*ret.NUM[x];
y = 2*MIN*rand()/(RAND_MAX+1.0)-MIN;//更换后的数据
printf(&变成:%lf\n&, y);
ret.NUM[x] = //覆盖
ret.sum += y*y; //更新总和
for(i=0; i&MAXN; i++)
printf(&%lf__&, bestpath.NUM[i]);
printf(&总和:%lf\n\n\n&, ret.sum);
void init()
char ss[66];
bestpath.sum = 0;
srand((int)(time(0)));
printf(&初始状态:&);
for(i=0; i&MAXN; i++)
{//随机产生10个-100到100的数
bestpath.NUM[i] = 2*MIN*rand()/(RAND_MAX+1.0)-MIN;
bestpath.sum += bestpath.NUM[i]*bestpath.NUM[i];
printf(&!!!%lf&, bestpath.NUM[i]);
printf(&$$$%lf\n&, bestpath.sum);
gets(ss); //用于记录初始状态
double rnd = rand()%1.0;
path curpath,
int i, P_t=0, A_t=0;
T = INIT_T;
while(true)
for (i=1; i&=IN_LOOP; i++)
newpath = getnext(curpath);//产生新数据
delta = newpath.sum - curpath.
if(delta & 0.0)
{//符合局部优化条件,更新
rnd = rand()%1.0;
double p = exp(-delta/T);
if (p & rnd) //符合概率,更新
if (P_t &=P_LIMIT)
{//概率上限限制
if (curpath.sum&bestpath.sum)
{//当前数据较优,更新最佳答案
bestpath =
if ( A_t &= OUT_LOOP || T & FINAL_T)
T = T * RATE;//温度衰减
void main()
printf(&Best number is: &);
for(i=0; i&MAXN; i++)
printf(&%lf__&, bestpath.NUM[i]);
printf(&/nThe result is: %lf\n&, bestpath.sum);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:35542次
排名:千里之外
原创:21篇
转载:11篇
(4)(1)(1)(3)(5)(11)(1)(6)算法(24)
模拟退火算法真的很巧妙,而且很多问题也能转换成这个算法
这个算法最大的妙处,就是它会无序的向着你所要求的答案去
寻找,直到找到符合你的精度,概率很高
如:在一个的平面上有N 个点,现在要你在这个面上找个
点到这N个点的距离和最小,精度保留 5 位小数,有个很简单的办法
就是枚举,当然不能这么干,而模拟退火算法是处理这类问题的典范
当然它不仅仅用于处理找点,你知道,网络流就是求最大流而已,可是
却用处很多,所以说好多问题,都可一转换成模拟退火问题,尤其那些
没有确定算法,需要暴力的题,包括今年上海赛区第一题也是可以用这个
算法,不过会超时。
接着回到那个题,找一个点到这些点距离最小,模拟退火的思路就是,先任意
在这个面内找个点 st ,最好在这些点中间,设有个半径为 T,以T为半径
st 为圆心可以包括所有的N 个点。好了,下面开始找了,一般 8 个方向就够了
4个其实也差不多,对于有些题要求很高,需要更多的方向,现在就以4 个
方向分析,上下左右,st点的上下左右,st_up, st_down, st_left, st_right.
比如:st_up.x = st.x, st_up.y = st.y + T。 在这四个点里面挑个离得最近的
把st 移到这里,然后继续找直到T 的半径下再也找不到更近的点,现在T *= 0.5
继续重复上面步骤找,要知道,每次让T 减一般,很快就会减到你想要的精度。
具体看代码
typedef struct POINT {
int main() {
Point st, st_tmp, //st_tmp, temp临时点
double T, T_MIN; // T要求把所有点覆盖,T_MIN可得到的最大精度 比如 T_MIN = 1e-6
//目前可得的最小距离
//输入完成后
ans = dis(st);
//dis() 函数由自己写,返回st 离所有点的距离之和
while (T & T_MIN) {
while (flag) {
//flag 的妙处
for (int i=-1; i&=1; i++)
for (int j=-1; j&=1; j++) { //八个方向,根据需要自己看着办
temp.x = st.x + T*i;
temp.y = st.y + T*j;
double tmp_d = dis(temp);
if (tmp_d & ans) {
ans = tmp_d;
//在T 半径上找到个比st 更小的点
//如果flag = 0,说明在T 半径的8个方向上没有比st 更优的点
T = 0.5 * T;
//这个也是根据情况,不过一般0.5就行了,越大越精确,速度也越慢
// 得到 st 为最近点,ans 为最近距离和,最远一样,改改即可
睡觉了,睡觉了,晚安
来自于百度空间
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:194604次
积分:3110
积分:3110
排名:第8037名
原创:117篇
评论:70条
(1)(1)(1)(1)(3)(6)(1)(26)(4)(2)(5)(1)(1)(10)(6)(2)(5)(24)(9)(1)(1)(9)MCP(最大截问题)的模拟退火算法程序源码_EEWorld电子工程世界搜索中心
搜索范围:
一周以内&&&&
搜索到约1项结果
MCP(最大截问题)的模拟退火算法程序源码...
.cn/detail/sinceyoulove/395651 发布时间:
相关结果约1个君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
一种有效的全局优化算法_模拟退火算法
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口君,已阅读到文档的结尾了呢~~
连续变量的全局优化问题的模拟退火算法和遗传算法算法,优化,全局,遗传算法,模拟退火,连续变量,全局优化,优化算法,连续变量和,变量的全局
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
连续变量的全局优化问题的模拟退火算法和遗传算法
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口}

我要回帖

更多关于 退火算法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信