⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 antcolony.java

📁 java实现的基本蚁群算法
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
                  for(int j=0;j<height;j++){
                  	if(grid[i][j]>=1){
						/*for(int k=0;k<2;k++){
						  Pheromone_grid[k][i][j]=0;
						}
						for(int m=0;m<phe.size();m++){
							Pheromone p=(Pheromone)phe.elementAt(m);
							if(p.x==i&&p.y==j){
								phe.removeElement(p);
							}
						}*/
						
                  	}
                    switch (grid[i][j]){
                    case 1:
                      //如果grid[][]存的是障碍物
                      obs_grid[i][j]=obsCount;
                      obsP[obsCount]=new Point(i,j);
                      obsCount++;
                      break;
                    case 2:
                      //如果grid[][]存的窝点信息,多余的窝点信息省去了
                      if(OriginPts<100){
                          OriginPt[OriginPts]=new Point(i,j);
                          OriginPts++;
                      }
                      break;
                    case 3:
                      //如果grid[][]存的食物点信息,多余的食物点信息省去了
                      if(EndPts<100){
                          EndPt[EndPts]=new Point(i,j);
                          EndPts++;
                      }
                      break;
                    }
                  }
                }
            //如果没有指定窝,则随机的选择一点
            if(OriginPts==0){
              for(int i=0;i<width;i++){
                int  j;
                for(j=0;j<height;j++){
                  if(obs_grid[i][j]<0){
                    OriginPt[OriginPts]=new Point(i,j);
                    OriginPts++;
                    break;
                  }
                }
                if(j<height-1){
                  break;
                }
              }
            }
        }
	public void reinit(){
                //重新初始化整个环境

                //先停止程序的运行
                running=false;
                btnStart.setLabel("开始");


		//清空所有信息素Pheromone数组中的值
                for(int i=0;i<width;i++){
			for(int j=0;j<height;j++){
                                for(int k=0;k<2;k++){
                                  Pheromone_grid[k][i][j]=0;
                                }
			}
		}

                //初始化蚂蚁数组,antCount只蚂蚁在不同的窝点之间进行随机的分配
      		for(int i=0;i<antCount;i++){
                        int index=(int)(OriginPts*Math.random());
		        ants[i].OriginPt=new Point(OriginPt[index]);
                        ants[i].init();
		}

                //清空信息素向量
                phe.removeAllElements();

                //在每个食物点和窝点周围分布一定量的按照梯度递减的信息素,分配的是一个点为中心的半径为FoodR的圆,并且信息素按照半径递减
		for(int i=0;i<EndPts;i++){
                   for(int x=-FoodR;x<=FoodR;x++){
                        int y=(int)(Math.sqrt(FoodR*FoodR-x*x));
                        for(int yy=-y;yy<=y;yy++){
                            Pheromone_grid[1][(EndPt[i].x+x+width)%width][(EndPt[i].y+yy+height)%height]=(int)(1000*(1-Math.sqrt(x*x+yy*yy)/FoodR));
                        }
                    }
                }
                for(int i=0;i<OriginPts;i++){
                   for(int x=-FoodR;x<=FoodR;x++){
                        int y=(int)(Math.sqrt(FoodR*FoodR-x*x));
                        for(int yy=-y;yy<=y;yy++){
                            Pheromone_grid[0][(OriginPt[i].x+x+width)%width][(OriginPt[i].y+yy+height)%height]=(int)(1000*(1-Math.sqrt(x*x+yy*yy)/FoodR));
                        }
                    }
                }

                //重画
		canvas.repaint();

                //让程序开始运行
                //running=true;
	}
	public void paint(Graphics g) {
		canvas.repaint();
	}


public static void main(String[] args) {
    Antcolony applet = new Antcolony();
    applet.isStandalone = true;
    Frame frame;
    frame = new Frame() {
      protected void processWindowEvent(WindowEvent e) {
        super.processWindowEvent(e);
        if (e.getID() == WindowEvent.WINDOW_CLOSING) {
          System.exit(0);
        }
      }
      public synchronized void setTitle(String title) {
        super.setTitle(title);
        enableEvents(AWTEvent.WINDOW_EVENT_MASK);
      }
    };
    frame.setTitle("Applet Frame");
    frame.add(applet, BorderLayout.CENTER);
    applet.init();
    applet.start();
    frame.setSize(300,320);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    frame.setLocation((d.width - frame.getSize().width) / 2, (d.height - frame.getSize().height) / 2);
    frame.setVisible(true);
  }
  public void start()
  //下面三个函数是控制线程的
	{
		if (runner == null)
		{
			runner= new Thread(this);
			runner.start();
			//running = true;
		}
	}

	public void stop()
	{
		if (runner!=null)
		{
			runner.stop();
			runner=null;
			running = false;
		}
	}

	public void run() {

		int i;
                //线程一直运行下去
		while (true) {
		        if(running){
 		 	  //如果开始动画,就进行canvas的处理
                          canvas.process();
                        }
		 	try { Thread.sleep(delay);}
		 	catch (InterruptedException e) {
			}
		}

	}
        public boolean action(Event evt, Object o) {
    		if (evt.target == btnMap) {
                //开始编辑地图面板
			running=false;
                        btnStart.setLabel("开始");
			MapPad ctl = new MapPad(this);
	                ctl.setSize(308,380);
                        ctl.show();
                        return true;
		}else if(evt.target == btnStart){
                  if(!running){
                    //如果刚刚按下了重置按钮就重新初始化一下
                    if(reset)reinit();
                    btnStart.setLabel("停止");
                    reset=false;
                    running=true;
                  }else{
                    btnStart.setLabel("开始");
                    running=false;
                  }
                  return true;
                }else if(evt.target == btnReset){
                  running=false;
                  int j=0;
                  //表示已经按下了重置按钮,以便下次开始的时候进行重新初始化
                  reset=true;
                  repaint();
                  btnStart.setLabel("开始");
                  return true;
                }else if(evt.target == btnConfig){
                        running=false;
                        btnStart.setLabel("开始");
  			Configer ctl = new Configer(this);
	                ctl.setSize(300,300);
                        ctl.show();
                        return true;
                }else if(evt.target == choPDraw){
                  //选择画信息素的模式
                  drawPhe=choPDraw.getSelectedIndex();
                  if(drawPhe!=1){canvas.repaint();}
                  return true;
                }
                return false;

        }
 /**Destroy the applet*/
  public void destroy() {
  //当结束程序的时候,把线程也结束
    if (runner!=null)
    {
       running = false;
       runner.stop();
       runner=null;
    }
  }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -