8 Metaheuristics

Python039

8 Metaheuristics,第1张

下图介绍了两种不同种类的Metaheuristics,我们主要用左边的,尤其是Iterated Greedy。

I 和D 的过程用图像表示如下:

我在这里只用Iterated Greedy算法。原因如下:

其他算法诸如蚁群算法等,可能能提供非常接近最优解的方案,有些算法的运行速度也很快,可以弥补python运行慢的缺陷。但是这些算法通常存在诸多不足,例如算法太复杂,适用面很窄,需要设置过多参数导致很难实现。

Iterated Greedy的优势在于,它由两个简单的阶段构成:

D和I

更好的解决方案总会被接受

更坏的方案以特定的可能性接受,接受的概率如下图

类似 模拟退火法

从当前解决方案中随机删除 numberJobsToRemove 个订单。这里 numberJobsToRemove 是Iterated Greedy的一个参数。

输出的结果是被移除的订单集合 removedJobs 和一个不完整的解决方案 partialPermutation 。

* 注意:solver.RNG.choice的结果每次都一样,是因为我们设置了随机数种子,目的就是只要是用同一个种子作为参数构造出的solver的属性RNG都是同一个。

将 removedJobs 重新加回 partialPermutation ,并插入到最佳位置(NEH)的顺序,并返回新的完整解决方案。这个插入过程是通过排列Permutation实现的,看一下Construction函数的参数表可知,需要两个列表。

* 注:前面讲算法的时候说过,重构函数执行之后会生成一个新的方案newSolution,新方案就是通过把removedJobs插入到最佳位置得到的。最优位置的选择需要在Construction函数中借助 solver.EvaluationLogic.DetermineBestInsertion(completeSolution, i)来实现

我们通过简单的解构和重构,必然会得出一个新方案newSolution,那么我们接受新方案newSolution为当前方案currentSolution的前提是,如果

- 新的解决方案( newSolution ),

- 当前解决方案( currentSolution )。

* 公式中,T叫做baseTemperature,是Iterated Greedy的第二个参数,T越大,则接受更坏方案的概率也越大。新的最优方案存储在SolutionPool中(numberJobsToRemove是第一个参数)

下面开始对newSolution进行评估和比较:

* 注意:判断一个新方案是否可接受取决于两方面:1. 如果新方案更好,那么无论如何都会接受新方案;2. 如果新方案并没有优化,则视作WorseSolution,即使是worseSolution也是要按照公式计算出的概率来衡量是否要接受这个不好的方案

为了看起来更加直观,我把接受差方案的过程写成了函数AcceptWorseSolution。注意看参数表,以便于确定何时调用这个函数。

局部搜索可以被用于优化currentSOlution,但不是必须的。通常会使用IterativeImprovement结合Insertion邻域一起使用。

Iterated Greedy是一个迭代的解构D和构建C组成的序列。

在一个循环中被反复执行,直到达到 停止标准

在这里的例子中, 停止标准 是迭代次数 maxIterations ,但时间限制或没有优化的迭代次数也是可以的。

后面可能还会讲到怎么设计一个没有优化的迭代次数,这里可以先思考一下。

现在尝试运行一下:

与 IterativeImprovement 算法类似,现在要为 IteratedGreedy 创建一个单独的类,以便该类的一个实例可以传递给求解器Solver。

像 IterativeImprovement 一样, Iterated Greedy 应该继承自 ImprovementAlgorithm 。

必要的 参数 是以下属性:

EvaluationLogic, SolutionPool以及随机数生成器RNG都由求解器solver传递给算法。

添加 IteratedGreedy 类,以便它可以作为一种算法传递给求解器。

成员函数:Konstruktor, Initialize, Destruction, Construction, AcceptWorseSolution, Run

推荐教程:Python教程

人工智能英文简称AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。

人工智能算法也被称之为软计算 ,它是人们受自然界规律的启迪,根据其原理模拟求解问题的算法。

目前的人工智能算法有人工神经网络遗传算法、模拟退火算法、群集智能蚁群算法和例子群算等等。

随着人工智能算法的不断优化,可以不仅可以帮助我们提高工作效率、改善我们的生活水平,同时也能为我们在庞大的现代信息资源中迅速的找到我们所需要的信息。

数学建模竞赛(国赛和美赛)经验分享

第一次参赛是在大一的暑假参加的国赛,当时和两个同学刚刚组队,我们也没有什么基础,结果可想而知:无奖。在经历了这一次国赛之后,大一时的两位队友也无心再参加,所以又重新找了两位队友。从此我们队伍成员便确认了下来。这两位分别是一名女生负责排版,一名男生负责建模;而我负责写程序。我们一起准备第二年的国赛,在这期间,我们学校决定自己组织一次建模比赛为国赛做铺垫。我们为了检验自己的学习成果,便参加了。凭借着很好的运气,我们拿了二等奖的好成绩。时间不久,便到了国赛。在国赛期间,我们每天熬夜熬到很晚,有了一点想法之后就开始讨论,然后发现行不通,又开始讨论,再进行完善……就这么一直反反复复着。直到提交了论文的最后#在找队友的时候,一定要找靠谱的,自己熟悉的,千万不要临时组队。在准备竞赛这段时间,要经常沟通,彼此磨合,培养默契。在参加竞赛的时候,不免会讨论得过于激烈,千万不要烦彼此,因为只有交流彼此得思想才会进行碰撞,才有可能找到适合本队得解题办法。在分工方面,建议有一个人主要负责建模,一个主要负责编程,一个主要负责写论文和排版。三个人对建模、编程、排版都要了解,因为不知竞赛得的时候会有谁的工作量大一些,另外的人还可以去帮忙。三样都懂一些也可以更好的交流,更好的完成作品。

在准备建模比赛期间,要先了解常见的模型,比如:层次分析法,微分方程模型,线性规划、非线性规划和整数规划等。如果感觉自己不能完全吃透,可以先进行了解,在实际竞赛的过程中会查阅大量的资料,在短时间内去了解一个未知的领域,借鉴经典模型并进行完善,做出适合本问题的模型。下面推荐几本书:第一本是《数学模型》:

《数学模型》这本书很经典,讲了很多的经典模型。

第二本是《matlab在数学建模中的应用》;

第三本书是《数学建模算法与应用》。

负责编程的人至少要有一门自己擅长的编程语言,如MATLAB,Python等。建模过程中大部分人都是用MATLAB,但是也有不少人使用Python。MATLAB的工具包比较多,使用的人比较多。Python的话是库比较多。我个人是比较喜欢使用python的,但是Matlab也会一些。在平常的学习中要找到适合本队的题目,是数据分析题,还是优化的题目等。如果选择数据分析的话,就要对数据分析比较了解,需要掌握数据如何可视化,选什么图,才能更能够刻画数据的特点。如果不知道选择什么种类的图,可以参照下面的图:

还要熟悉数据处理的一些软件,如Excel,SPSS,python的某些库等。

当然算法是少不了的,如果时间紧,可以了解大概,明白算法的框架,常用算法有:常用的聚类算法、遗传算法、蚁群算法、粒子群算法、元胞自动机等。

排版是很重要的,能够给人第一印象,好的排版能给人带来美的享受。 有人使用Word来进行排版,那么就要学会Mathtype公式编辑器的使用;如果使用Latex进行排版,要好好学习语法,可以找找模板。论文中的流程图建议使用Visio来画。在学习排版的过程中,可以先大体看一下往年优秀论文的排版,学习学习。比如西文和数字使用Times New Roman字体会比较好看,又如自己去 探索 正文的行距是多少会感觉比较美观,三线表的磅数是多少会自己会感觉比较美观等。

不知道,你所说的赛是什么比赛,我比较熟悉的是大学生数学建模竞赛。在本科期间国赛和美赛都参加了两次,且获得了不错的成绩,特别在有了丰富经验以后,在最后一次美赛中,获得了最高奖(O奖)。

相比而言,美赛更难,原因如下:

其实这两个比赛的最大不同就是语言,还有不同就是在于背景不同。

国赛是以国内的实际问题为背景,关于其资料查询方便,阅读起来轻松快捷,但是问题都是一些新颖问题,没有现成答案,所以还是有难度。而美赛背景是美国文化,你得先搞清楚背景,然而国外资料也不易找到,并且文献全是英文,查阅起来不方便,速度迟缓。

另一方面语言不同,对于国赛,只要你弄出来,很快能写好。但是美赛,你把问题弄明白,还得转化为地道的英语,这是有技术含量的,这需要能力加时间。

另外,美赛有很多国家参加,而国赛参赛人数比较少,并且很多厉害的大学基本不参加国赛而是参加美赛,所以美赛是参赛人数多,质量高。美赛是四天三夜而国赛是三天两夜。综上,美赛更难!