1、禁忌搜索算法
(1)概念
禁忌搜索(Tabu Search或Taboo Search,简称TS)是对局部搜索(LS)的一种扩展,是一种全局寻优算法,其特点是采用禁忌技术,即用一个禁忌表记录下已经到达过的局部最优点及求解过程,在下一次搜索中,利用禁忌表中的信息不再或有选择地搜索这些点,以此来跳出局部最优点。该算法可以克服爬山算法全局搜索能力不强的弱点。
(2)思路
(3)相关术语
评价函数:评价函数是用来评价邻域中的邻居、判断其优劣的衡量指标。大多数情况下,评价函数为目标函数(或目标函数的倒数)。但自定义的形式也可存在,算法也可使用多个评价函数,以提高解的分散性(区分度)。
邻域移动:邻域移动是进行解转移的关键,又称“算子”,邻域移动需要根据不同的问题特点来自定义
禁忌表:禁忌表记录被禁止的变化,以防出现搜索循环、陷入局部最优。对其的设计中最关键的因素是禁忌对象(禁忌表限定的对象)和禁忌步长(对象的禁忌在多少次迭代后失效)。
邻居选择策略:选择最佳邻域移动的规则。目前最广泛采用的是“最好解优先策略”及“第一个改进解优先策略”。前者需比较所有邻域,耗时较久,但解的收敛更有效;后者在发现第一个改进解就进行转移,耗时较少,但收敛效率弱于前者,对于邻域解空间较大的问题往往比较适合。
破禁准则:破禁准则是对于禁忌表的适度放松。防止了因为禁忌表的存在,而错过优异解的情况出现。(如设置禁忌步长)
停止规则:禁忌搜索中停止规则的设计多种多样,如最大迭代数、算法运行时间、给定数目的迭代内不能改进解或组合策略等等。
(4)图解
(5)流程图
2、求解TSP
同样是求解att48实例(最优解为10628)
代码结构:
其中Data类表示定义数据、变量初始化和读取数据的类
package com.chb.Tabu;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Random;
import java.util.Scanner;
public class Data {
public static final int MAX_GEN=1000;//最大的迭代次数
public static final int N=200;//每次搜索领域的个数
public static final int ll=20;//禁忌长度
public static int cityNum=48;//城市数量,手动设置
public static int jinji[][]=new int[ll][cityNum];//禁忌表
public static int[]Ghh=new int[cityNum];//初始路径编码
public static int bestGh[]=new int[cityNum];//最好的路径编码
public static int[]LocalGh=new int[cityNum];//当前最好路径编码
public static int[]tempGh=new int[cityNum];//存放临时编码
public static int bestT;//最佳的迭代次数
public static int bestEvaluation;
public static int LocalEvaluation;
public static int tempEvaluation;
public static int point[][]=new int[cityNum][2];//每个城市的坐标
public static int dist[][]=new int[cityNum][cityNum];//距离矩阵
public static int t