Console.WriteLine("{0},{1},{2},{3}",PreX,PreY,ObjectFunction(PreX,PreY),Temperature);
} while(Math.Abs(ObjectFunction(BestX,BestY)–ObjectFunction(PreBestX,PreBestY))>Tolerance);
Console.WriteLine("最小值在点:{0},{1}",BestX,BestY);
Console.WriteLine("最小值为:{0}",ObjectFunction(BestX,BestY));
}
}
}
l结果:
最小值在点:-1.07678129318956,1.07669421564618
最小值为:-2.26401670947686
l后记:
原来想写一系列的文章,介绍如何用C#解数值问题,这是因为在CSDN上很少有数值计算方面的文章,所以希望能有所补充。
一开始在网上搜索模拟退火的资料并想作为C#数值计算的一个例子,找不到现成的源码。后来自己实验了很久,终于将此程序写出,不敢私藏,拿出来作用模拟退火或者用C#解数值算法问题的一个入门例子。
本文尽量避免太过学术化,如数学和物理名称和公式,仓促下笔,有很多地方可能讲得不是很清楚,希望各位体谅。任何问题或批评,可EMAIL与我:armylau2@163.com
另,模拟退火还可以应用到其它更多更复杂的问题,如“推销员问题”等组合优化问题。本例只是求一个二维函数的最小值问题,而且其冷却表参数的选择也过于简单,只能作用一个初步的入门简介,请读者注意。
l参考文献:
1.http://www.computer-dictionary-online.org/index.ASP?q=simulated annealing 计算机词典
2.NumericRecipesinC
3.计算方法丛书非数值并行算法(第一册)模拟退火算法