蚁群优化解决tsp问题的编程体会纲要:
主要分为以下几个部分:
1.Java随机数的复习
2.int和double类型的最大值
3.轮盘赌算法选择城市位置的实践
4. 对信息素更新的原理的了解:贪心算法结合蒸发率等
5.Java的readline读取数据文件
*******************************************************************
Java随机数的复习
需要引入Java包,然后就是要理解产生的随机数的范围【0,n)
另外:
random对象的nextInt(),nextInt(int n)方法的说明:
int nextInt()
返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。
int nextInt(int n)
返回一个伪随机数,它是从此随机数生成器的序列中取出的、在 0(包括)和指定值(不包括)之间均匀分布的 int值。
java.util.Random类有两种方式构建方式:带种子和不带种子
不带种子:此种方式将会返回随机的数字,每次运行结果不一样
带种子:
此种方式,无论程序运行多少次,返回结果都是一样的
还有: 如果没有提供种子数,Random实例的种子数将是当前时间的毫秒数,可以通过System.currentTimeMillis()来获得当前时间的毫秒数。
本次的蚁群优化就采用了用当前时间做种子:
long r1 = System.currentTimeMillis();
Random rnd=new Random(r1);
int firstcity=rnd.nextInt(citycount);
int和double类型的最大值
//java.lang.integer.MAX_VALUE:
//值为 2的31次方-1 的常量,它表示 int 类型能够表示的最大值。
Double类型的应用与之相似:
bestlength = Double.MAX_VALUE;
轮盘赌算法选择城市位置的实践
轮盘赌选择
又称比例选择方法.其基本思想是:各个个体被选中的概率与其适应度大小成正比.
具体操作如下:
(1)计算出群体中每个个体的适应度f(i=1,2,…,M),M为群体大小;
(2)计算出每个个体被遗传到下一代群体中的概率;
(3)计算出每个个体的累积概率;
(q[i]称为染色体x[i] (i=1, 2, …, n)的积累概率)
(4)在[0,1]区间内产生一个均匀分布的伪随机数r;
(5)若r<q[1],则选择个体1,否则,选择个体k,使得:q[k-1]<r≤q[k] 成立;
(6)重复(4)、(5)共M次
本次应用:
public void SelectNextCity(int index,double[][]tao,Double[][]distance){
double []p;
p=new double[citys];
double alpha=1.0;
double beta=2.0;
double sum=0;
int currentcity=tour[index-1];
//计算公式中的分母部分
for(int i=0;i<citys;i++){
if(unvisitedcity[i]==1)
sum+=(Math.pow(tao[currentcity][i], alpha)*
Math.pow(1.0/distance[currentcity][i], beta));
}
//计算每个城市被选中的概率
for(int i=0;i<citys;i++){
if(unvisitedcity[i]==0)
p[i]=0.0;
else{
p[i]=(Math.pow(tao[currentcity][i], alpha)*
Math.pow(1.0/distance[currentcity][i], beta))/sum;
}
}
long r1 = System.currentTimeMillis();
Random rnd=new Random(r1);
double selectp=rnd.nextDouble();
//轮盘赌选择一个城市;
double sumselect=0;
int selectcity=-1;
for(int i=0;i<citys;i++){
sumselect+=p[i];
if(sumselect>=selectp){
selectcity=i;
break;
}
}
if (selectcity==-1)
System.out.println("本次轮盘赌没有选中任何城市");
tour[index]=selectcity;
unvisitedcity[selectcity]=0;
}
对信息素更新的原理的了解:贪心算法结合蒸发率等
Java的readline读取数据文件
具体实践:将TSP问题的数据读取入数组内
部分数据如图:
核心代码:
String strbuff;
BufferedReader tspdata = new BufferedReader(new InputStreamReader(new FileInputStream(filename)));
strbuff = tspdata.readLine(); //先读取第一行,得到城市数量
citycount = Integer.valueOf(strbuff);
distance = new Double[citycount][citycount];
x = new Double[citycount];
y = new Double[citycount];
for (int citys = 0; citys < citycount; citys++) {
strbuff = tspdata.readLine();
String[] strcol = strbuff.split(" ");
x[citys] = Double.valueOf(strcol[1]);
y[citys] = Double.valueOf(strcol[2]);
}