旅行商问题,即TSP问题(Traveling Salesman Problem)是数学领域中著名问题之一。假设有一个旅行商人要拜访N个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要 回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。TSP问题是一个NPC问题。这个问题一般是使用遗传算法去解,但是蚂蚁算法要更高效.对于c++不熟悉的我,用C语言是个噩梦,因此写一个java代码,并且桌面窗口显示结果的版本.
再来说说蚁群算法
再来说说蚁群算法
各个蚂蚁在没有事先告诉他们食物在什么地方的前提下开始寻找食物。当一只找到食物以后,它会向环境释放一 种挥发性分泌物pheromone (称为信息素,该物质随着时间的推移会逐渐挥发消失,信息素浓度的大小表征路径的远近)来实现的,吸引其他的蚂蚁过来,这样越来越多的蚂蚁会找到食物。有 些蚂蚁并没有像其它蚂蚁一样总重复同样的路,他们会另辟蹊径,如果另开辟的道路比原来的其他道路更短,那么,渐渐地,更多的蚂蚁被吸引到这条较短的路上 来。最后,经过一段时间运行,可能会出现一条最短的路径被大多数蚂蚁重复着。(实在不理解去度娘)
公共函数及变量
package com.seul.tsp;
/*
* 公共函数以及变量
*/
public class PublicFun
{
public static final double ALPHA=1.0;//信息启发式因子,信息素的重要程度
public static final double BETA=2.0;//期望启发式因子, 城市间距离的重要程度
public static final double ROU=0.5;//信息素残留系数
public static int N_ANT_COUNT=50;//蚂蚁数量
public static int N_IT_COUNT=200;//迭代次数
public static int N_CITY_COUNT=15;//城市数量
public static final double DBQ=100.0;//总信息素
public static final double DB_MAX=Math.pow(10,9);//一个标志数,用来初始化一个比较大的最优路径
//两两城市间的信息量
public static double[][] g_Trial;
//两两城市间的距离
public static double[][] g_Distance;
//返回指定范围内的随机整数
public static int rnd(int nLow,int nUpper)
{
return (int) (Math.random()*(nUpper-nLow)+nLow);
}
//返回指定范围内的随机浮点数
public static double rnd(double dbLow,double dbUpper)
{
return Math.random()*(dbUpper-dbLow)+dbLow;
}
}
蚂蚁类
package com.seul.tsp;
/*
* 蚂蚁类
* 使用对象的复制,必须实现Cloneable接口,然后重写Object中clone()方法
*/
public class Ant implements Cloneable
{
public int[] m_nPath=new int[PublicFun.N_CITY_COUNT];//蚂蚁走过的路径
public double m_dbPathLength;//蚂蚁走过的路径长度
public int[] m_nAllowedCity=new int[PublicFun.N_CITY_COUNT];//蚂蚁没有去过的城市
public int m_nCurCityNo;//当前所在城市的编号
public int m_nMovedCityCount;//已经去过的城市数量
/*
* 初始化函数,蚂蚁搜索前调用该方法
*/
public void Init()
{
for (int i = 0; i < PublicFun.N_CITY_COUNT; i++)
{
m_nAllowedCity[i]=1;//设置全部城市没有去过
m_nPath[i]=0;//蚂蚁走过的路径全部设置为0
}
m_dbPathLength=0.0; //蚂蚁走过的路径长度设置为0
m_nCurCityNo=PublicFun.rnd(0,PublicFun.N_CITY_COUNT);//随机选择一个出发城市
m_nPath[0]=m_nCurCityNo;//把出发城市保存的路径数组中
m_nAllowedCity[m_nCurCityNo]=0;//标识出发城市已经去过了
m_nMovedCityCount=1;//已经去过的城市设置为1;
}
/*
* 覆盖Object中的clone()方法
* 实现对象的复制
*/
protected Object clone() throws CloneNotSupportedException
{
return super.clone();
}
/*
* 选择下一个城市
* 返回值为城市编号
*/
public int ChooseNextCity()
{
int nSelectedCity=-1;//返回结果,初始化为-1
//计算当前城市和没去过城市的信息素的总和
double dbTotal=0.0;
double[] prob=new double[PublicFun.N_CITY_COUNT];//用来保存各个城市被选中的概率
for (int i = 0; i < PublicFun.N_CITY_COUNT; i++)
{
if(m_nAllowedCity[i]=