一、要解决的问题:
某个目标函数的最值〔某一给定的函数、旅行的路程或费用、买书的花费、利润)
(最大值问题通过给目标函数添加负号可以转换为求最小值问题)。
(1)求一个给定函数的最值问题
(2)旅行商问题
(3)书店买书问题(假设有m个书店,n本书,那么买书的方案数就有m^n)
(4)背包问题(如果有n件货物,那么可能性就有2^n)
在matlab中有一个函数:intlinprog专门解决0-1规划问题。
二、求解的通用步骤
(1)蒙特卡罗模拟(这里用其求解最值问题)
随机生成很多组解,验证这些解是否满足题目的约束条件,若满足则将其保存到一个"可行集"中,然后计算这个可行集内每个解对应的目标函数值,在里面找到最值即可。
对比穷举法:穷举法是按照某一特定的规则来穷举整个空间,蒙特卡罗模拟是随机搜索,这是两者的区别。共同的缺点:如果解空间的可能性特别特别多,就不能用
求函数y= 11sinx +7cos(5x)在[-3,3]内的最大值
蒙特卡罗模拟:随机生成一万个x: [0.5245 2.2515 -1.0251 1.5441 -2.8954……]
穷举法:x每次增长一个固定的长度:[-3-2.9999 -2.9998 -2.9997……]
注意:当要求的函数中有30个自变量时,上面两种方法都不能做
(NP-Hard: TSP有38个城市时,对应的计算量是10^44次,假设我们的计算机每秒可进行10亿次计算,那么穷尽所有解的时间大于1“亿亿亿""年)﹒
启发式搜索
盲目搜索还是启发式搜索?
按照预定的策略实行搜索.在搜索过程中获取的中间信息不用来改进策略,称为盲目搜索;反之,如果利用了中间信息来改进搜索策略则称为启发式搜索。
例如:蒙特卡罗模拟用来求解优化问题就是盲目搜索.还有大家熟悉的枚举法也是盲目搜索。
关于“启发式”,可以简单总结为下面两点:
1)任何有助于找到问题的最优解,但不能保证找到最优解的方法均是启发式方法;
2)有助于加速求解过程和找到较优解的方法是启发式方法。
模拟退火算法就是启发式搜索算法(还有蚁群、遗传、粒子群等)中的一种。
(2)模拟退火算法
1、爬山法找函数的最大值
怎么找到这个一元函数的最大值(只有一个上下界约束,即函数的定义域)?
爬山法的缺陷:
a.与初始值的选取有关
b.特别容易找到局部最优解
假如我们现在站在上帝视角来看这个图,很明显我们要找的最大值在全局最大值处,但是我们可能找到的是位于局部最大值点。因为我们观察到该点左右两侧邻域的目标函数值都小于该点的目标函数值。若我们想要搜索到最大值处,就还需要往左走一段,因此爬山法实际上是一种“眼光狭隘"的搜索算法(贪心)。
我们马上要介绍的模拟退火算法就能克服这个问题。它在到达局部最大值处后,会以一定的概率接受一个比当前解要差的解(即该点处左右两侧的邻域),此时就有几率跳出局部最大值点,从而我们就有了找到蓝色点的可能性。
2、举个例子来说:求函数内的最大值
求函数y= 11sinx +7cos(5x)在[-3,3]内的最大值
p的概率为0,对应爬山法,概率为1对应蒙特卡罗方法
还有sigmoid函数的值域也是[0,1]。
a.接受新解的概率p越大意味着在解空间中搜索的范围越大。
b.假设我们将搜索过程看作一个“工序”,那么搜索前期我们搜索的范围应该尽量的大,这样能避免陷入局部最优解;搜索后期我们搜索的范围应该尽量的小。
c.
Ct可以看作一个和时间有关的系数,因此在搜索过程中,我们接受新解的概率p就和时间有关,搜索前期t较小,我们希望搜索的范围大,即更倾向于接受新解,那么对应的p就应该大一点,而Ct与p负相关,因此Ct,应该小一点;搜索后期我们希望p较小,那么Ct应该大一点,因此我们可以下结论:Ct关于t递增。﹒
问:如果这个优化问题有约束条件怎么办?
答:在生成解B,就验证是否满足约束条件。
问:这个Ct怎么设置呀?