- 手机:
- 18888889999
- 电话:
- 0898-66889888
- 邮箱:
- admin@youweb.com
- 地址:
- 海南省海口市玉沙路58号
先再啰嗦一句:智能优化算法解决NP问题,程序的每次运行结果基本都不一样。如果你不能理解这句话,先看我的02号置顶日志。
1. 遗传算法
遗传算法基本可以解决任何优化问题。这是因为遗传算法的编码很自由,而其他智能优化算法在解决具体问题的时候存在一定的局限性(下面介绍)。
遗传算法的编码有多种形式,根据具体问题选择一种合适的编码方式,问题便可迎刃而解。
遗传算法的编码形式有
01编码:如,选址问题,0表示不选,1表示选择;
1~N自然数排列编码:这个编码的特点就是,优化节点访问顺序,要求每个节点都要访问且只能访问一次,如TSP、VRP问题、航班排序问题等等,
自然数编码:一般用于分配问题中,如有N个任务分配给M个工人,那么任务n的对应编码m就表示,任务n分配给工人m
实数编码:求解连续函数时用到,如同后面介绍的群体类算法。
遗传算法的上述四种编码方式,基本可解决任何问题。具体在使用时就要根据问题(主要是约束条件)来选择编码,也会出现一些编码的等效变化,即可能编码是其他样子,但本质用的时候还是上述四种编码。当然也会有复合编码,就是上述四种编码方式的组合。
不同的编码对应的交叉和变异是不一样的,这个就需要根据具体的编码来进行操作。
2. 蚁群算法
说实话蚁群算法的应用范围很窄。
蚁群算法的提出是基于解决旅行商问题(路径最短问题)的,在这个问题中,蚁群算法的信息素的定义以及启发函数的定义都是根据距离进行的,是可行的。
而在解决除路径最短问题的其他问题中,我们很难找到一个可行的方法来定义启发函数,即很难给蚂蚁一个启发值,让它应该往最优的方向爬。所以蚁群算法的应用范围很窄。
当然,如果非要用蚁群算法解决某个优化问题,你必须提出一种可行的启发函数,首先应该从原理上讲得通,这样给蚂蚁一个启发,蚂蚁能搜到最优解。然后要编程验证,你这个方法确实能得到最优解。(我一般的验证方法就是:先遗传算法来解决这个问题,然后和蚁群算对比,如果最优解差不多,则可行。如果差太多,证明不可行)
总之:用蚁群算法必须要想方法定义启发函数和信息素。
3. 模拟退火算法
模拟退火算法其实和遗传算法差别不大的。二者具体操作基本一样。
4. 粒子群、人工蜂群、狼群等等群体类算法
群体类算法很多:粒子群算法、布谷鸟算、萤火虫算、灰狼算法、蝙蝠算法、人工蜂群算法、烟花算法等等真的是太多了。
这些群体类算法最显著的特征就是它们是求解连续函数的最优解和最优值,在用这些算法的时候,可以用标准测试函数来验证程序写的怎么样。
因为这类算法的编码都是实数编码,而且最重要的是它们的原理的实现就是基于实数来操作的。所以这些问题在解决连续性函数的问题,都是很容易实现的。
如果用这些算法解决离散问题,如在遗传算法中介绍的选址问题、分配问题、排序问题中,都是需要将连续性编码进行转换的。
而解决这些问题的效果好不好,取决于这个转换好不好。比如选址问题最终体现的是01,那么只需要用0~1内的实数,然后再四舍五入转换成01,从而实现选址。其他问题都有对应的转换方法。
转换的方法可以分为两种:一种是编码仍然是实数编码然后通过取整或排序的方法来转换;另一种就是编码是离散的,然后在原理上进行等效,就是说算法的实数编码运用的公式原理,我们通过等效变换,换成对离散编码的操作,当然这种等效是很难的,因为你要尝试并证明这个等效是可行的、有用的!
那么这里就要说了。目前这个群体类算法肯定是可以通过第一种转换方法来转成遗传算法的这四种编码方式,也就是说用群体类算法可以解决任何问题。但是这种转换方法并不是效果很好,与遗传算法比对,差挺多的。
所以,如果你让我用群体类算法来解决某个离散问题,我会和你说并不是很适合求解离散问题,而且我可能会说写不了。
如果你发现别人可以写,那么他应该是用的第一种转换方法,效果肯定不好。如果你又发现别人用第一种转换方法,效果挺好的,那么他这个算法就不很单纯了。这个单纯的意思见附言。(为什么我能这么肯定?因为我是做这一块的,我会查很多的文献,查很多的代码,能不能实现,我太了解了)
附:在这里想额外说一点,算法是讲究原理的。什么意思呢?
1)比如遗传算法的交叉操作是遗传算法特有的。如果你在粒子群算法中使用了,那么你这个算法就是遗传算法和粒子群算法的结合。
2)比如粒子群算法的速度更新公式、蚁群算法的概率计算公式,都是算法原理的一部分,如果你不使用这些公式,那么你不能把它称之为对应的算法。
上述观点都是我对智能优化算法的理解与使用经验。在这一块我看过的论文和程序、我尝试的方法肯定你比做到的多的多!