模拟退火算法之运用实例

前一篇贴了一个模拟退火算法模板,可能有些没有交代清楚,就其使用来说,上述算法不需做任意修改就可使用,只需对实际的问题建模然后和这个算法模板合并使用即可.

XXXCoolingPolicy 是指温度冷却的策略,动态冷却会根据本次循环过程的反馈去调整温度的冷却,此方法系国外一研究专家所发明,能自适应的去调整温度,至于专家名字,很抱歉,我忘了...要花时间去把资料翻出来.  静态的当然很简单,就是简单的降低温度的某个固定值或者固定百分比.

XXXSelectPolicy是指选择策略.  对于单体而言,它有n类的邻域变化类型,比如对于tsp问题,我们只是不停的交换两个城市的位置,那么对于这样的模型,就是只有一种邻域类型,如果你还想加上其它的比如两个相邻的和另外两个相邻的城市一起交换顺序,那么这时候就成了两种邻域类型.  均等的选择策略就是平均的分配这些机会给各种不同的邻域变化类型,而动态的则要根据上一轮各个邻域类型的贡献值而定.

 

这样,我们要建一个解决TSP问题的模型再简单不过了,看起来就是下面这个样子

  <textarea cols="71" rows="15" name="code" class="cpp">class TSP { public: TSP(){}; double objValue(){ return mObjValue;}; int neighborTypes(); void randAdj(){//调整顺序}; void updateSln(){//更新目标值即计算新顺序下的目标值}; ... private: vector&lt;Point2F&gt; cities;//假设城市用点坐标表示 double mObjValue; ... }</textarea>

 

.

 

 

模拟退火算法应用其实很广泛, 推而广之,我们来看看看似毫不相干的曲线离散化的优化.

某个CAD软件中对于曲线的输出采用固定的段数离散化输出,假设它分成10段吧,但是效果却很差,对于比较平坦的曲线来说还好,对于曲率变化大的曲线来说,在曲率大的地方明显失真,因为软件中的离散化是按照十段平均取曲线参数的,即0,0.1,0.2,...1.0(假定是规范的参数域).这样难免会在曲率大的地方失真严重,这里就可以优化了,其实就是对参数点的选取进行优化.

现在分析这个问题,首先目标值是什么?  我们的目标就是整体误差最小,或者你可以定义某种标准来衡量它的视觉效果的话也无不可. 这个你可以自己取根据需要制定,比如,你想让离散化的线段最接近原来那段曲线,你可以用线段中点到曲线的参数中点的距离来衡量. 你确定了目标值,我们就可以开始下面的步骤了.

你要操作哪些具体的对象来达到你的预期? 前面已经说过,我们要对参数的选取优化,但是10段是规定好了的,不能变化,我们可以设这初始的参数值就是0.0,0.1...1.0.  然后随机选取一个去调整,调整之后再计算目标值,在一定的概率下看是否接受这次改变. 经过若干次的外循环和内循环,你可以得到相对优化的结果.   如果这句话你看不大明白,建议你再看看模拟退火算法的原理.

 

其实可以运用的地方很多,比如你有一张券,面值10000元,券只能抵消费不能找现退现,你去某超市用券买东西,你就要最大化利用你的券,但是你肯定不想买你完全不需要的东西,你的策略大概是大部分买你需要的,剩下的零头买可要可不要的,如果还有零头就随便拿点小商品充数.这样你就等于见了一个你这次消费的模型了,你可以试试看,算一下,如果对于需要的东西而言已有很需要和一般需要而言,你还可以加上权值,总之,你建好了模型就好了,模拟退火算法可以很轻松的解决这些问题.  ....

.

 

你可能感兴趣的:(算法,优化,Class)