导航:首页 > 编程语言 > javatsp

javatsp

发布时间:2022-09-25 15:01:58

java人工蜂群算法求解TSP问题

一、人工蜂群算法的介绍

人工蜂群算法(Artificial Bee Colony, ABC)是由Karaboga于2005年提出的一种新颖的基于群智能的全局优化算法,其直观背景来源于蜂群的采蜜行为,蜜蜂根据各自的分工进行不同的活动,并实现蜂群信息的共享和交流,从而找到问题的最优解。人工蜂群算法属于群智能算法的一种。

二、人工蜂群算法的原理

1、原理

标准的ABC算法通过模拟实际蜜蜂的采蜜机制将人工蜂群分为3类: 采蜜蜂、观察蜂和侦察蜂。整个蜂群的目标是寻找花蜜量最大的蜜源。在标准的ABC算法中,采蜜蜂利用先前的蜜源信息寻找新的蜜源并与观察蜂分享蜜源信息;观察蜂在蜂房中等待并依据采蜜蜂分享的信息寻找新的蜜源;侦查蜂的任务是寻找一个新的有价值的蜜源,它们在蜂房附近随机地寻找蜜源。

假设问题的解空间是

代码:

[cpp]view plain

  • #include<iostream>

  • #include<time.h>

  • #include<stdlib.h>

  • #include<cmath>

  • #include<fstream>

  • #include<iomanip>

  • usingnamespacestd;

  • constintNP=40;//种群的规模,采蜜蜂+观察蜂

  • constintFoodNumber=NP/2;//食物的数量,为采蜜蜂的数量

  • constintlimit=20;//限度,超过这个限度没有更新采蜜蜂变成侦查蜂

  • constintmaxCycle=10000;//停止条件

  • /*****函数的特定参数*****/

  • constintD=2;//函数的参数个数

  • constdoublelb=-100;//函数的下界

  • constdoubleub=100;//函数的上界

  • doubleresult[maxCycle]={0};

  • /*****种群的定义****/

  • structBeeGroup

  • {

  • doublecode[D];//函数的维数

  • doubletrueFit;//记录真实的最小值

  • doublefitness;

  • doublerfitness;//相对适应值比例

  • inttrail;//表示实验的次数,用于与limit作比较

  • }Bee[FoodNumber];

  • BeeGroupNectarSource[FoodNumber];//蜜源,注意:一切的修改都是针对蜜源而言的

  • BeeGroupEmployedBee[FoodNumber];//采蜜蜂

  • BeeGroupOnLooker[FoodNumber];//观察蜂

  • BeeGroupBestSource;//记录最好蜜源

  • /*****函数的声明*****/

  • doublerandom(double,double);//产生区间上的随机数

  • voidinitilize();//初始化参数

  • doublecalculationTruefit(BeeGroup);//计算真实的函数值

  • doublecalculationFitness(double);//计算适应值

  • voidCalculateProbabilities();//计算轮盘赌的概率

  • voidevalueSource();//评价蜜源

  • voidsendEmployedBees();

  • voidsendOnlookerBees();

  • voidsendScoutBees();

  • voidMemorizeBestSource();

  • /*******主函数*******/

  • intmain()

  • {

  • ofstreamoutput;

  • output.open("dataABC.txt");

  • srand((unsigned)time(NULL));

  • initilize();//初始化

  • MemorizeBestSource();//保存最好的蜜源

  • //主要的循环

  • intgen=0;

  • while(gen<maxCycle)

  • {

  • sendEmployedBees();

  • CalculateProbabilities();

  • sendOnlookerBees();

  • MemorizeBestSource();

  • sendScoutBees();

  • MemorizeBestSource();

  • output<<setprecision(30)<<BestSource.trueFit<<endl;

  • gen++;

  • }

  • output.close();

  • cout<<"运行结束!!"<<endl;

  • return0;

  • }

  • /*****函数的实现****/

  • doublerandom(doublestart,doubleend)//随机产生区间内的随机数

  • {

  • returnstart+(end-start)*rand()/(RAND_MAX+1.0);

  • }

  • voidinitilize()//初始化参数

  • {

  • inti,j;

  • for(i=0;i<FoodNumber;i++)

  • {

  • for(j=0;j<D;j++)

  • {

  • NectarSource[i].code[j]=random(lb,ub);

  • EmployedBee[i].code[j]=NectarSource[i].code[j];

  • OnLooker[i].code[j]=NectarSource[i].code[j];

  • BestSource.code[j]=NectarSource[0].code[j];

  • }

  • /****蜜源的初始化*****/

  • NectarSource[i].trueFit=calculationTruefit(NectarSource[i]);

  • NectarSource[i].fitness=calculationFitness(NectarSource[i].trueFit);

  • NectarSource[i].rfitness=0;

  • NectarSource[i].trail=0;

  • /****采蜜蜂的初始化*****/

  • EmployedBee[i].trueFit=NectarSource[i].trueFit;

  • EmployedBee[i].fitness=NectarSource[i].fitness;

  • EmployedBee[i].rfitness=NectarSource[i].rfitness;

  • EmployedBee[i].trail=NectarSource[i].trail;

  • /****观察蜂的初始化****/

  • OnLooker[i].trueFit=NectarSource[i].trueFit;

  • OnLooker[i].fitness=NectarSource[i].fitness;

  • OnLooker[i].rfitness=NectarSource[i].rfitness;

  • OnLooker[i].trail=NectarSource[i].trail;

  • }

  • /*****最优蜜源的初始化*****/

  • BestSource.trueFit=NectarSource[0].trueFit;

  • BestSource.fitness=NectarSource[0].fitness;

  • BestSource.rfitness=NectarSource[0].rfitness;

  • BestSource.trail=NectarSource[0].trail;

  • }

  • doublecalculationTruefit(BeeGroupbee)//计算真实的函数值

  • {

  • doubletruefit=0;

  • /******测试函数1******/

  • truefit=0.5+(sin(sqrt(bee.code[0]*bee.code[0]+bee.code[1]*bee.code[1]))*sin(sqrt(bee.code[0]*bee.code[0]+bee.code[1]*bee.code[1]))-0.5)

  • /((1+0.001*(bee.code[0]*bee.code[0]+bee.code[1]*bee.code[1]))*(1+0.001*(bee.code[0]*bee.code[0]+bee.code[1]*bee.code[1])));

  • returntruefit;

  • }

  • doublecalculationFitness(doubletruefit)//计算适应值

  • {

  • doublefitnessResult=0;

  • if(truefit>=0)

  • {

  • fitnessResult=1/(truefit+1);

  • }else

  • {

  • fitnessResult=1+abs(truefit);

  • }

  • returnfitnessResult;

  • }

  • voidsendEmployedBees()//修改采蜜蜂的函数

  • {

  • inti,j,k;

  • intparam2change;//需要改变的维数

  • doubleRij;//[-1,1]之间的随机数

  • for(i=0;i<FoodNumber;i++)

  • {

  • param2change=(int)random(0,D);//随机选取需要改变的维数

  • /******选取不等于i的k********/

  • while(1)

  • {

  • k=(int)random(0,FoodNumber);

  • if(k!=i)

  • {

  • break;

  • }

  • }

  • for(j=0;j<D;j++)

  • {

  • EmployedBee[i].code[j]=NectarSource[i].code[j];

  • }

  • /*******采蜜蜂去更新信息*******/

  • Rij=random(-1,1);

  • EmployedBee[i].code[param2change]=NectarSource[i].code[param2change]+Rij*(NectarSource[i].code[param2change]-NectarSource[k].code[param2change]);

  • /*******判断是否越界********/

  • if(EmployedBee[i].code[param2change]>ub)

  • {

  • EmployedBee[i].code[param2change]=ub;

  • }

  • if(EmployedBee[i].code[param2change]<lb)

  • {

  • EmployedBee[i].code[param2change]=lb;

  • }

  • EmployedBee[i].trueFit=calculationTruefit(EmployedBee[i]);

  • EmployedBee[i].fitness=calculationFitness(EmployedBee[i].trueFit);

  • /******贪婪选择策略*******/

  • if(EmployedBee[i].trueFit<NectarSource[i].trueFit)

  • {

  • for(j=0;j<D;j++)

  • {

  • NectarSource[i].code[j]=EmployedBee[i].code[j];

  • }

  • NectarSource[i].trail=0;

  • NectarSource[i].trueFit=EmployedBee[i].trueFit;

  • NectarSource[i].fitness=EmployedBee[i].fitness;

  • }else

  • {

  • NectarSource[i].trail++;

  • }

  • }

  • }

  • voidCalculateProbabilities()//计算轮盘赌的选择概率

  • {

  • inti;

  • doublemaxfit;

  • maxfit=NectarSource[0].fitness;

  • for(i=1;i<FoodNumber;i++)

  • {

  • if(NectarSource[i].fitness>maxfit)

  • maxfit=NectarSource[i].fitness;

  • }

  • for(i=0;i<FoodNumber;i++)

  • {

  • NectarSource[i].rfitness=(0.9*(NectarSource[i].fitness/maxfit))+0.1;

  • }

  • }

  • voidsendOnlookerBees()//采蜜蜂与观察蜂交流信息,观察蜂更改信息

  • {

  • inti,j,t,k;

  • doubleR_choosed;//被选中的概率

  • intparam2change;//需要被改变的维数

  • doubleRij;//[-1,1]之间的随机数

  • i=0;

  • t=0;

  • while(t<FoodNumber)

  • {

  • R_choosed=random(0,1);

  • if(R_choosed<NectarSource[i].rfitness)//根据被选择的概率选择

  • {

  • t++;

  • param2change=(int)random(0,D);

  • /******选取不等于i的k********/

  • while(1)

  • {

  • k=(int)random(0,FoodNumber);

  • if(k!=i)

  • {

  • break;

  • }

  • }

  • for(j=0;j<D;j++)

  • {

  • OnLooker[i].code[j]=NectarSource[i].code[j];

  • }

  • /****更新******/

  • Rij=random(-1,1);

  • OnLooker[i].code[param2change]=NectarSource[i].code[param2change]+Rij*(NectarSource[i].code[param2change]-NectarSource[k].code[param2change]);

  • /*******判断是否越界*******/

  • if(OnLooker[i].code[param2change]<lb)

  • {

  • OnLooker[i].code[param2change]=lb;

  • }

  • if(OnLooker[i].code[param2change]>ub)

  • {

  • OnLooker[i].code[param2change]=ub;

  • }

  • OnLooker[i].trueFit=calculationTruefit(OnLooker[i]);

  • OnLooker[i].fitness=calculationFitness(OnLooker[i].trueFit);

  • /****贪婪选择策略******/

  • if(OnLooker[i].trueFit<NectarSource[i].trueFit)

  • {

  • for(j=0;j<D;j++)

  • {

  • NectarSource[i].code[j]=OnLooker[i].code[j];

  • }

  • NectarSource[i].trail=0;

  • NectarSource[i].trueFit=OnLooker[i].trueFit;

  • NectarSource[i].fitness=OnLooker[i].fitness;

  • }else

  • {

  • NectarSource[i].trail++;

  • }

  • }

  • i++;

  • if(i==FoodNumber)

  • {

  • i=0;

  • }

  • }

  • }

  • ❷ 用java解决tsp问题用什么算法最简单

    package noah;

    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;

    public class TxTsp {

    private int cityNum; // 城市数量
    private int[][] distance; // 距离矩阵

    private int[] colable;//代表列,也表示是否走过,走过置0
    private int[] row;//代表行,选过置0

    public TxTsp(int n) {
    cityNum = n;
    }

    private void init(String filename) throws IOException {
    // 读取数据
    int[] x;
    int[] y;
    String strbuff;
    BufferedReader data = new BufferedReader(new InputStreamReader(
    new FileInputStream(filename)));
    distance = new int[cityNum][cityNum];
    x = new int[cityNum];
    y = new int[cityNum];
    for (int i = 0; i < cityNum; i++) {
    // 读取一行数据,数据格式1 6734 1453
    strbuff = data.readLine();
    // 字符分割
    String[] strcol = strbuff.split(" ");
    x[i] = Integer.valueOf(strcol[1]);// x坐标
    y[i] = Integer.valueOf(strcol[2]);// y坐标
    }
    data.close();

    // 计算距离矩阵
    // ,针对具体问题,距离计算方法也不一样,此处用的是att48作为案例,它有48个城市,距离计算方法为伪欧氏距离,最优值为10628
    for (int i = 0; i < cityNum - 1; i++) {
    distance[i][i] = 0; // 对角线为0
    for (int j = i + 1; j < cityNum; j++) {
    double rij = Math
    .sqrt(((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j])
    * (y[i] - y[j])) / 10.0);
    // 四舍五入,取整
    int tij = (int) Math.round(rij);
    if (tij < rij) {
    distance[i][j] = tij + 1;
    distance[j][i] = distance[i][j];
    } else {
    distance[i][j] = tij;
    distance[j][i] = distance[i][j];
    }
    }
    }

    distance[cityNum - 1][cityNum - 1] = 0;

    colable = new int[cityNum];
    colable[0] = 0;
    for (int i = 1; i < cityNum; i++) {
    colable[i] = 1;
    }

    row = new int[cityNum];
    for (int i = 0; i < cityNum; i++) {
    row[i] = 1;
    }

    }

    public void solve(){

    int[] temp = new int[cityNum];
    String path="0";

    int s=0;//计算距离
    int i=0;//当前节点
    int j=0;//下一个节点
    //默认从0开始
    while(row[i]==1){
    //复制一行
    for (int k = 0; k < cityNum; k++) {
    temp[k] = distance[i][k];
    //System.out.print(temp[k]+" ");
    }
    //System.out.println();
    //选择下一个节点,要求不是已经走过,并且与i不同
    j = selectmin(temp);
    //找出下一节点
    row[i] = 0;//行置0,表示已经选过
    colable[j] = 0;//列0,表示已经走过

    path+="-->" + j;
    //System.out.println(i + "-->" + j);
    //System.out.println(distance[i][j]);
    s = s + distance[i][j];
    i = j;//当前节点指向下一节点
    }
    System.out.println("路径:" + path);
    System.out.println("总距离为:" + s);

    }

    public int selectmin(int[] p){
    int j = 0, m = p[0], k = 0;
    //寻找第一个可用节点,注意最后一次寻找,没有可用节点
    while (colable[j] == 0) {
    j++;
    //System.out.print(j+" ");
    if(j>=cityNum){
    //没有可用节点,说明已结束,最后一次为 *-->0
    m = p[0];
    break;
    //或者直接return 0;
    }
    else{
    m = p[j];
    }
    }
    //从可用节点J开始往后扫描,找出距离最小节点
    for (; j < cityNum; j++) {
    if (colable[j] == 1) {
    if (m >= p[j]) {
    m = p[j];
    k = j;
    }
    }
    }
    return k;
    }

    public void printinit() {
    System.out.println("print begin....");
    for (int i = 0; i < cityNum; i++) {
    for (int j = 0; j < cityNum; j++) {
    System.out.print(distance[i][j] + " ");
    }
    System.out.println();
    }
    System.out.println("print end....");
    }

    public static void main(String[] args) throws IOException {
    System.out.println("Start....");
    TxTsp ts = new TxTsp(48);
    ts.init("c://data.txt");
    //ts.printinit();
    ts.solve();
    }
    }

    ❸ java中错误:没有为类型 Tsp 定义方法 printBestRoute(),如何改,是在遗传算法实现中出现的问题

    那就再定义下这个方法就好了吧

    ❹ 百度上提问:Java上怎样读取txt文件里的数据为一个多行两列的数组,每一个数据由逗号隔开

    public voidinit(String filename) throws FileNotFoundException, IOException{

    //读取数据

    double[] x;

    double[] y;

    int num;

    String strbuff;

    BufferedReader tspdata = newBufferedReader(new InputStreamReader(new FileInputStream(filename)));

    strbuff = tspdata.readLine();

    int num =Integer.valueOf(strbuff);

    // System.out.println(Integer.valueOf(strbuff));

    x = new double[num];

    y = new double[num];

    for (int citys = 0; citys <num; citys++) {

    strbuff = tspdata.readLine();

    String[] strcol =strbuff.split(",");

    x[citys] = Integer.valueOf(strcol[1]);

    y[citys] =Integer.valueOf(strcol[2]);

    }

    }



    ❺ Java中的一些问题

    1.定义变量时至少应指出变量名和类型吗?

    答:必须给出名称和类型。

    2.定义变量时没有给出初值,该变量可能是无意义的值吗??

    答:类的成员变量会给出默认值,基本数据类型会是0,对象是null。局部变量不可以没有初始值

    3.定义变量同一个类型,多个变量可用逗号分隔吗?

    答:可以。

    4.定义变量时必须要给变量初始化吗??

    答:成员变量可以不必初始化,局部变量一定要初始化。

    5.定义变量而没初始化时,该变量与默认值吗??

    答:成员变量有初始值,局部变量没有

    6.字符型变量的默认值为换行符吗?

    答:是

    7.布尔型变量的默认值为真吗?

    答:false

    8.变量的默认值是可以改变的吗??

    答:可以改变。

    ❻ java中,主类创建的对象,如何能在其他类中调用急急急!!

    主类中创建的public对象,你可以在其他类中通过主类对象名.public对象名访问,如果是private的话无法访问,只有你在主类中写public方法,然后通过方法调用。

    ❼ 菜鸟在Java 的tsp问题插入一个节点遇到了一个问题

    while(temp.next!=null){
    if(temp.next.p.distanceTo(p)<minDis){
    nearestNode = temp;
    }
    temp = temp.next;
    }
    如果我没看错的话 temp.next!=null 这句代码已经执行了指针指向下一个了。当然有可能是我搞错了。

    问题解决了吗?采纳一下我的答案吧。谢谢。

    ❽ 用java做一个java登录监控程序,监控当前有多少个session有效,急~~~~

    要监控session是否有效,就要变相的拿到session的主动权
    比如你可以在页面写一个循环请求的ajax(这个循环需要是一个同步的请求)
    如果用户把页面关掉了,那么这个ajax所请求的方法也就终止了
    你要做的就是在一定的时间内去检测目标session的最后一次更新时间

    ❾ 求java上旅游路线的规划算法

    这个属于TSP(旅行商)问题,搜索 旅行商问题 可以找到相关解法的介绍。

    ❿ 用java解决tsp问题用什么算法最简单

    1. 用java解决tsp

    2. package noah;

      import java.io.BufferedReader;
      import java.io.FileInputStream;
      import java.io.IOException;
      import java.io.InputStreamReader;

      public class TxTsp {

      private int cityNum; // 城市数量
      private int[][] distance; // 距离矩阵

      private int[] colable;//代表列,也表示是否走过,走过置0
      private int[] row;//代表行,选过置0

      public TxTsp(int n) {
      cityNum = n;
      }

      private void init(String filename) throws IOException {
      // 读取数据
      int[] x;
      int[] y;
      String strbuff;
      BufferedReader data = new BufferedReader(new InputStreamReader(
      new FileInputStream(filename)));
      distance = new int[cityNum][cityNum];
      x = new int[cityNum];
      y = new int[cityNum];
      for (int i = 0; i < cityNum; i++) {
      // 读取一行数据,数据格式1 6734 1453
      strbuff = data.readLine();
      // 字符分割
      String[] strcol = strbuff.split(" ");
      x[i] = Integer.valueOf(strcol[1]);// x坐标
      y[i] = Integer.valueOf(strcol[2]);// y坐标
      }
      data.close();

      // 计算距离矩阵
      // ,针对具体问题,距离计算方法也不一样,此处用的是att48作为案例,它有48个城市,距离计算方法为伪欧氏距离,最优值为10628
      for (int i = 0; i < cityNum - 1; i++) {
      distance[i][i] = 0; // 对角线为0
      for (int j = i + 1; j < cityNum; j++) {
      double rij = Math
      .sqrt(((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j])
      * (y[i] - y[j])) / 10.0);
      // 四舍五入,取整
      int tij = (int) Math.round(rij);
      if (tij < rij) {
      distance[i][j] = tij + 1;
      distance[j][i] = distance[i][j];
      } else {
      distance[i][j] = tij;
      distance[j][i] = distance[i][j];
      }
      }
      }

      distance[cityNum - 1][cityNum - 1] = 0;

      colable = new int[cityNum];
      colable[0] = 0;
      for (int i = 1; i < cityNum; i++) {
      colable[i] = 1;
      }

      row = new int[cityNum];
      for (int i = 0; i < cityNum; i++) {
      row[i] = 1;
      }

      }

      public void solve(){

      int[] temp = new int[cityNum];
      String path="0";

      int s=0;//计算距离
      int i=0;//当前节点
      int j=0;//下一个节点
      //默认从0开始
      while(row[i]==1){
      //复制一行
      for (int k = 0; k < cityNum; k++) {
      temp[k] = distance[i][k];
      //System.out.print(temp[k]+" ");
      }
      //System.out.println();
      //选择下一个节点,要求不是已经走过,并且与i不同
      j = selectmin(temp);
      //找出下一节点
      row[i] = 0;//行置0,表示已经选过
      colable[j] = 0;//列0,表示已经走过

      path+="-->" + j;
      //System.out.println(i + "-->" + j);
      //System.out.println(distance[i][j]);
      s = s + distance[i][j];
      i = j;//当前节点指向下一节点
      }
      System.out.println("路径:" + path);
      System.out.println("总距离为:" + s);

      }

      public int selectmin(int[] p){
      int j = 0, m = p[0], k = 0;
      //寻找第一个可用节点,注意最后一次寻找,没有可用节点
      while (colable[j] == 0) {
      j++;
      //System.out.print(j+" ");
      if(j>=cityNum){
      //没有可用节点,说明已结束,最后一次为 *-->0
      m = p[0];
      break;
      //或者直接return 0;
      }
      else{
      m = p[j];
      }
      }
      //从可用节点J开始往后扫描,找出距离最小节点
      for (; j < cityNum; j++) {
      if (colable[j] == 1) {
      if (m >= p[j]) {
      m = p[j];
      k = j;
      }
      }
      }
      return k;
      }

      public void printinit() {
      System.out.println("print begin....");
      for (int i = 0; i < cityNum; i++) {
      for (int j = 0; j < cityNum; j++) {
      System.out.print(distance[i][j] + " ");
      }
      System.out.println();
      }
      System.out.println("print end....");
      }

      public static void main(String[] args) throws IOException {
      System.out.println("Start....");
      TxTsp ts = new TxTsp(48);
      ts.init("c://data.txt");
      //ts.printinit();
      ts.solve();
      }
      }

    阅读全文

    与javatsp相关的资料

    热点内容
    为什么安卓机拍照那么丑 浏览:694
    服务器绑定云产品实例 浏览:313
    程序员认真工作被开除 浏览:453
    程序员送苹果 浏览:143
    小程序绘图源码 浏览:968
    如何购买域名和服务器阿里云 浏览:671
    服务器地址及端口在哪里 浏览:695
    腾讯云服务器有危险吗 浏览:798
    复制文件到文件夹php 浏览:10
    java注释正则表达式 浏览:858
    java连接远程oracle 浏览:91
    javamainargs 浏览:758
    金华数据文档加密软件公司 浏览:854
    内心极度担心解压的音乐 浏览:897
    穿搭技巧app卡色配什么颜色 浏览:595
    程序员得结石 浏览:131
    查公司薪资的app叫什么 浏览:410
    压缩包多个文件夹图片连续看 浏览:487
    linuxmysql无法用命令启动 浏览:442
    地税身份认证用什么ApP 浏览:531