蚂蚁优化解决tsp问题的编程体会纲要

蚁群优化解决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]);  
        }  




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值