Mathematica实现模拟退火法

王 茂南 2018年1月2日17:05:26
评论
3 1931字阅读6分26秒
摘要这一篇文章,我们将会讲一下在mathematica中实现模拟退火法的方式。但是,这一篇不是为了说明模拟退火法是如何实现的,而是为了说明如何编写和使用mathematica的函数包。

这一篇文章,我们将会讲一下在 Mathematica 中实现模拟退火法的方式。其实,在 Mathmatica 中最优化算法里是内置了模拟退火法的,我们可以看下面的例子。

  1. NMinimize[{100 (y - x^2)^2 + (1 - x)^2, -2.084 <= x <= 2.084 && -2.084 <= y <= 2.084}, {x, y}, Method -> "SimulatedAnnealing"]
  2. >> {0,{x->1,y->1}}

在上面指定 Method -> "SimulatedAnnealing" 就是使用模拟退火法。那么,为什么我还要来讲使用 Mathematica 来进行模拟退火法呢,其实我是想利用这个例子来说明一下如何写 Mathematica 的函数包,及 Mathematica 的函数包如何使用,好了,下面开始吧。

哦,还有个事情,就是如果想看 Mathematica 数值非线性最优化全局最优解,可以在帮助文档中搜索:tutorial/ConstrainedOptimizationGlobalNumerical

 

模拟退火法例子

模拟退火函数包

  1. BeginPackage["tuihuoLXS`"]
  2. tuihuoLXS::usage = "tuihuoLXS[一组位置坐标]将给出经退火算法优化后的结果,起始概率默认为0.8,可用setInitial设定;停止概率默认为0.2,可通过setEnd设定;每次退火的大小默认为.01,可用setStep设定";
  3. setInitial::usage ="setInitial[初始概率],如setInitial[.8]";
  4. setEnd::usage = "setEnd[停止概率]";
  5. setStep::usage = "setEnd[退火步数]";
  6. evaluationFunction::usage="评估函数,即测试总距离"
  7. Begin["`Private`"]
  8. Ncity;(*城市个数*)
  9. step=.01;
  10. Tstart=.8;(*初始温度*)
  11. Tend=.2;(*停止温度*)
  12. setInitial[n_/;0<n<1]:=Tstart=n;(*设置初始概率*)
  13. setEnd[n_/;0<n<1]:=Tend=n;
  14. setStep[n_/;0<n<1]:=step=n;(*设置步数*)
  15. acceptQ:=RandomChoice[{initialT,1}->{True,False}];(*是否接受当前结果*)
  16. evaluationFunction[list_]:=
  17. Total[EuclideanDistance@@@Partition[list,2,1]];(*计算某条路线的总距离*)
  18. newRoute[list_]:=
  19. ReplacePart[list,{#1->list[[#2]],#2->list[[#1]]}&@@RandomSample[Range[Ncity],2]];
  20. mainfunction[list_]:=
  21. (
  22. routeNew=newRoute[list];
  23. {old,new}=evaluationFunction/@{list,routeNew};
  24. If[new < old, routeNew,If[acceptQ,initialT=initialT-step;routeNew,list]]
  25. );(*迭代函数*)
  26. tuihuoLXS[initialList_]/;MatrixQ[initialList]&&And@@(NumberQ/@Flatten[initialList]):=
  27. (
  28.     initialT = (Tstart&)[];
  29.     Ncity = Length@initialList;
  30.     Nlist = N[initialList];
  31.     NestWhile[mainfunction,Nlist,(#;initialT>Tend)&]
  32. );(*主函数*)
  33. End[]
  34. EndPackage[]

 

函数包编写

我们可以看到上面函数包的编写需要使用 BeginPackage["tuihuoLXS"]</code> 开头,<code>EndPackage[]</code> 结尾,中间为了使变量私有化,需要有 <code>Begin["Private`"]End[]

第二个地方,我们可以看到最上面有 setEnd::usage='',那么其实是为了写函数的说明的。我们下面可以看一下函数包的使用说明。

 

函数包的使用方式

就直接看下面的图片了。我们通过 Names["tuihuoLXS`*"] 查看函数包里所有的函数。通过 ? 函数名来查看函数的使用方法:

Mathematica实现模拟退火法

以上,就是使用了模拟退火法的例子,来说明了在 Mathematica 中如何编写函数包和使用函数包。

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2018年1月2日17:05:26
  • 转载请务必保留本文链接:https://mathpretty.com/8887.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: