模拟退火算法应用于最优排列问题和最优组合问题 之 排列篇

简介:
模拟退火算法应用于最优排列问题和最优组合问题 之 排列篇

一般学习模拟退火算法的时候,都是用全排列问题作为例子讲解,所谓全排列问题,就是说解的长度(或者步骤)是确定的,只不过排列顺序不同罢了,其中任何一种排列顺序都是问题的一个解,我们通过不断尝试不同的排列顺序,找到其中最优的一个。

 

TSP旅行商问题就是典型的全排列问题,所有的城市都是两两互联的,每个城市都要去一次(且只能去一次),先去那个后去那个,顺序不同只不过花费的代价不一样,但都是问题的一个解决方案。

 

注意:任何一种排列都是问题的一个解。这是一种很好的特性,这种情况下,可以直接应用典型的模拟退火算法。

 

模拟退火算法的核心就是对解的取舍。

 

第一步:首先生成一个初始解。

生成初始解的时候,你可以随机生成,也可以依照某种原则生成。无论怎样,反正就是一组排列。

当你把这组排列应用到问题域的时候, 会得到一个反馈的结果(也可以叫输出吧),比如说总花费、总路程之类的,一般我们希望这个结果越小(或者越大)越好。

这里,最优的输出值大概是多少,我们并不知道,甚至没有任何概念。

所以,应用这个初始解得到的输出,可能离目标很远,也可能离目标很近,哪怕他就在目的地门口,我们也一无所知。

 

第二步:变换解。

所谓变换解就是,我们把前一个解做一定的改变,具体怎么改变呢?

我要说取前一个解的领域,你可能会说我装逼(哈哈)。

其实想怎么变就怎么变,比如:将排列(即前一个解)中某两个元素的位置交换一下,再比如:将排列(即前一个解)从某个位置劈开,然后将两部分前后调换一下,再重新组合起来,等等。 

 

发挥你的想象,只要你每次都用同样的变换就行。另外,变换最起码要遵守问题描述,比如每个城市只能去一次,你不能变的去两次。

 

现在我们有了一个新的解。

如果把这个新的解应用的问题域上,同样也会得到一个反馈结果(输出),同样,我们还是不知道这个输出距离最终目标有多远。 

不管怎么样,我们至少可以确定一点,新解和旧解的输出肯定不同。

变换的核心思想就是:差之毫厘,谬之千里。

 

第三步:新解的取舍。 

现在我们有两个解和两个解的输出。虽然我们不知道最终目标输出是多少,但是哪个解的输出距离目标更近一点我们应该能看出来。

比如:旧解的输出是花费100元,新解的输出是花费80元。

如果像这样,新解比旧解“看上去”更好,我们就把新解作为当前解,回到第二步,用它再做新的变换。

注意:这里我用到一个“看上去”,确实是这样,只要看上去更好就行,你不用考虑更多,也许他可能要兜圈子。

 

如果新解比旧解看上去要差呢?扔了它?那就成了贪心算法了。模拟退火的核心就在这里,怎么取舍这个看上去差一点的解。

要说公式有点复杂,要说白了其实很简单,就是掷骰子。

骰子出大时候,我们就接受这个看上去差一点的解作为新的当前解,用它再做新的变换。

 

如果骰子出了小,那只有放弃他了,当前解不发生改变,还是前面的旧解,下一次变换只能

再次用他重新来一次。

当然这个骰子做了一点手脚,刚开始总是出大,后来大小出的差不多,再后来就总是出小了。具体原因大家自己看公式去吧。

 

这里想说一下,为什么我们要用一定的可能性来接受这个看上去差一点的解能?

因为这个解虽然差一点,但是也许只是看上去差一点, 作为下一个变换的起点,看上去差一点的解不见得比看上去好一点的解前途更差。

延安的共军和重庆的国军,你选哪个呢?身在其中,有时候骰子可能更靠谱一点。

 

第四步:循环。

现在,我们可能接受了变换解作为当前解;也可能放弃了变换解,当前解没发生变化,还是上一个解。 

不管怎么样,回到第二步,对当前解继续使用变换,取舍,循环下去。。。。。。。。

 

第五步:退出。

前面我们说过,一般情况下我们不知道最终目标是多少,如果知道的话,比如花费40元,如果某一个解的输出得到了这个花费40元,那么你的算法就可以退出了。这个解就是一个最优解(因为他的输出你确定是最优的)。

但是一般情况下我们不知道最终目标说多少,怎么办呢?

前面我们分析过,虽然有时候通过骰子,我们可能会接受一些看上去差一点的解,但是经过许多次循环以后,我们获得的当前解还是越来越好的

由于这样一个趋势,程序运行一段时间以后,我们无论再怎么变换出新解,也得不到更好的输出。

但是骰子还会让我们接受一些差解,那不就死循环了吗?

别忘了,骰子也有一个趋势,就是到后来就总是出小,即不再接受差解。

 

这样,找不出更好的解,也不再接受差解,如果当前解经过长时间都没发生改变,比如说100000次循环都没变,那么我们就可以认为当前解就是比较优秀的解了,可以退出了。

 

还有一种类似的方法是看输出。比如,初解的输出是100元,过了一会得到一个更好的值80元,再过一会又得到一个更好的值40元,然后经过长时间的运算也没找到更好的输出,那么40元输出对应的那个解就是比较优秀的解。

 

最后一个问题:是最优解吗?

回答:保证是比较优秀的解;很可能是最优解,但不能保证。哪怕你得到40元这个当前最好输出以后又运行了1年,没有找到更好的输出,也不能保证40元对应的解就是最优解(也许他真的就是)。

 

最优解有时候就像本拉登,天天在你身边,你也不一定认得出来。 

 

//==========================================

本文转自左洸博客园博客,原文链接:http://www.cnblogs.com/myqiao/archive/2011/05/17/2049416.html,如需转载请自行联系原作者

目录
相关文章
|
20天前
|
机器学习/深度学习 人工智能 自然语言处理
【自然语言处理】TF-IDF算法在人工智能方面的应用,附带代码
TF-IDF算法在人工智能领域,特别是自然语言处理(NLP)和信息检索中,被广泛用于特征提取和文本表示。以下是一个使用Python的scikit-learn库实现TF-IDF算法的简单示例,并展示如何将其应用于文本数据。
176 65
|
21天前
|
存储 人工智能 自然语言处理
算法、系统和应用,三个视角全面读懂混合专家(MoE)
【8月更文挑战第17天】在AI领域,混合专家(MoE)模型以其独特结构成为推动大型语言模型发展的关键技术。MoE通过动态选择专家网络处理输入,实现条件计算。稀疏型MoE仅激活部分专家以减少计算负担;软MoE则加权合并专家输出提升模型稳定性。系统层面,MoE优化计算、通信与存储,利用并行化策略提高效率。在NLP、CV、推荐系统等领域展现强大应用潜力,但仍面临训练稳定性、可解释性等挑战。[论文链接: https://arxiv.org/pdf/2407.06204]
168 63
|
5天前
|
机器学习/深度学习 算法 数据挖掘
R语言中的支持向量机(SVM)与K最近邻(KNN)算法实现与应用
【9月更文挑战第2天】无论是支持向量机还是K最近邻算法,都是机器学习中非常重要的分类算法。它们在R语言中的实现相对简单,但各有其优缺点和适用场景。在实际应用中,应根据数据的特性、任务的需求以及计算资源的限制来选择合适的算法。通过不断地实践和探索,我们可以更好地掌握这些算法并应用到实际的数据分析和机器学习任务中。
|
10天前
|
算法 C++
A : DS串应用–KMP算法
这篇文章提供了KMP算法的C++实现,包括计算模式串的next数组和在主串中查找模式串位置的函数,用于演示KMP算法的基本应用。
|
13天前
|
缓存 算法 前端开发
深入理解缓存淘汰策略:LRU和LFU算法的解析与应用
【8月更文挑战第25天】在计算机科学领域,高效管理资源对于提升系统性能至关重要。内存缓存作为一种加速数据读取的有效方法,其管理策略直接影响整体性能。本文重点介绍两种常用的缓存淘汰算法:LRU(最近最少使用)和LFU(最不经常使用)。LRU算法依据数据最近是否被访问来进行淘汰决策;而LFU算法则根据数据的访问频率做出判断。这两种算法各有特点,适用于不同的应用场景。通过深入分析这两种算法的原理、实现方式及适用场景,本文旨在帮助开发者更好地理解缓存管理机制,从而在实际应用中作出更合理的选择,有效提升系统性能和用户体验。
40 1
|
21天前
|
机器学习/深度学习 人工智能 自然语言处理
【深度学习】探讨最新的深度学习算法、模型创新以及在图像识别、自然语言处理等领域的应用进展
深度学习作为人工智能领域的重要分支,近年来在算法、模型以及应用领域都取得了显著的进展。以下将探讨最新的深度学习算法与模型创新,以及它们在图像识别、自然语言处理(NLP)等领域的应用进展。
56 6
|
19天前
|
机器学习/深度学习 自然语言处理 负载均衡
揭秘混合专家(MoE)模型的神秘面纱:算法、系统和应用三大视角全面解析,带你领略深度学习领域的前沿技术!
【8月更文挑战第19天】在深度学习领域,混合专家(Mixture of Experts, MoE)模型通过整合多个小型专家网络的输出以实现高性能。从算法视角,MoE利用门控网络分配输入至专家网络,并通过组合机制集成输出。系统视角下,MoE需考虑并行化、通信开销及负载均衡等优化策略。在应用层面,MoE已成功应用于Google的BERT模型、Facebook的推荐系统及Microsoft的语音识别系统等多个场景。这是一种强有力的工具,能够解决复杂问题并提升效率。
34 2
|
20天前
|
机器学习/深度学习 人工智能 算法
【人工智能】线性回归模型:数据结构、算法详解与人工智能应用,附代码实现
线性回归是一种预测性建模技术,它研究的是因变量(目标)和自变量(特征)之间的关系。这种关系可以表示为一个线性方程,其中因变量是自变量的线性组合。
36 2
|
17天前
|
数据采集 搜索推荐 算法
【高手进阶】Java排序算法:从零到精通——揭秘冒泡、快速、归并排序的原理与实战应用,让你的代码效率飙升!
【8月更文挑战第21天】Java排序算法是编程基础的重要部分,在算法设计与分析及实际开发中不可或缺。本文介绍内部排序算法,包括简单的冒泡排序及其逐步优化至高效的快速排序和稳定的归并排序,并提供了每种算法的Java实现示例。此外,还探讨了排序算法在电子商务、搜索引擎和数据分析等领域的广泛应用,帮助读者更好地理解和应用这些算法。
14 0
|
18天前
|
机器学习/深度学习 数据采集 算法
随机森林算法应用
8月更文挑战第20天
下一篇
DDNS