蚂蚁搬家(改进版)

      有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、18厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过两只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。

 要求:

       用类模拟出蚂蚁的行为特性,进而模拟出五只蚂蚁在木杆上的运行过程来编程求解。不能通过数学的方式直接用公式计算。

解题思路:

        把每个蚂蚁当作一个对象操作,有pos(位置)、direction(走向)、state(状态)属性,只需要在蚂蚁移动的过程中,每移动一次就判断是否走出了杆的长度(0~27),如果走出了范围,马上改变蚂蚁的状态;判断是否有蚂蚁碰面了,如果有碰面,就马上改变蚂蚁的走向。记录时间,输出最大的和最小的。

改进:

       把五个for改进为利用数组处理蚂蚁的走向,模拟一个五位的二进制加法器Add()函数。

代码:

class Main{
   public static void main(String args[]){
       int min=999,max=-999;
       int[] q=new int[]{0,0,0,0,0,0};  //利用数组来确定蚂蚁的走向
       for(int i=0;i<31;i++){	
		       Ant a=new Ant(3);
		       Ant b=new Ant(7);  
		       Ant c=new Ant(11); 
		       Ant d=new Ant(18); 
		       Ant e=new Ant(23);
	         a.direction=q[0];
		       b.direction=q[1];
		       c.direction=q[2];
		       d.direction=q[3];
		       e.direction=q[4];
		       q=Add(q);             //模拟一个加法器          
		       for(int l=0;;l++){
		         a.move();
		         b.move(); 
		         c.move();
		         d.move();
		         e.move();
		         if(a.pos==b.pos){
		         	a.direction*=-1;b.direction*=-1;
		        }
		        if(b.pos==c.pos){
		        	b.direction*=-1;c.direction*=-1;
		        }
		        if(c.pos==d.pos){
		        	c.direction*=-1;d.direction*=-1;
		        }
		        if(d.pos==e.pos){
		        	d.direction*=-1;e.direction*=-1;
		        }
		         //System.out.println(a.state+" "+b.state+" "+c.state+" "+d.state);
		         if((a.state+b.state+c.state+d.state+e.state)==5){
		         	 if(l>max){
		         	 	max=l;
		         	}
		         	if(l<min){
		         		min=l;
		         	}
		         	break;
		        }
		      }
			}
      System.out.println("所有蚂蚁掉下去最小时间是:"+min);
      System.out.println("所有蚂蚁掉下去最大时间是:"+max);
   }
   public static int[] Add(int[] a){    //模拟五位的二进制加法器
   	 a[0]++;                            //每次都在最后的位置加一
   	 for(int i=0;i<5;i++){
   	 	  if(a[i]>1){
   	 	  	 a[i]=0;                   //大于1就归零,向前进位
   	 	  	 a[i+1]++;                 //进位
   	 	  }else{
   	 	  	break;
   	 	  }
   	}
   	return a;
  }
}
class Ant{
	  int pos;
	  int direction;
	  int state=0;
	  public Ant(int pos){
	  	this.pos=pos;
	  }
	  public void move(){
	  	 if(this.pos<=0||this.pos>=27){
	  	 	state=1;
	  	 }
	  	 if(this.direction==0){
	  	 	 this.direction=-1;
	  	}
	  	 this.pos=this.pos+direction;
	  }
}

结果:

      


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蚂蚁算法是一种基于觅食行为的仿生优化算法,灵感来源于蚂蚁在寻找食物、寻路和寻找最优路径的行为。蚂蚁算法模拟蚂蚁在觅食过程中的信息交流与协作,其主要应用在组合优化问题中。 蚂蚁算法的基本原理是通过模拟蚂蚁在寻找食物的过程中释放信息素与蒸发信息素的行为来实现全局搜索与局部优化的策略。在算法中,每个蚂蚁都具有感知环境并具备随机选择路径的能力,蚂蚁会在路径上释放信息素,并根据路径上信息素浓度选择下一个位置。而信息素的浓度则受到路径长度和路径上信息素的衰减影响。 蚂蚁算法通过迭代寻找解空间中的最优解,每次迭代都会更新信息素浓度,并根据蚂蚁的觅食经验来调整路径选择的概率。这样,在演化的过程中,较优解上信息素的浓度逐渐增加,进而吸引更多蚂蚁选择该路径,从而实现对解空间的搜索和优化。 蚂蚁算法的优点在于其能在较短的时间内找到接近最优解的解,并且对于大规模组合优化问题有较好的鲁棒性。此外,蚂蚁算法还可以应用在图论、网络路由、机器学习等领域中。 总而言之,蚂蚁算法是一种基于觅食行为的仿生优化算法,通过模拟蚂蚁在寻找食物的过程中的信息交流与协作,来寻找组合优化问题的最优解。它具有全局搜索能力和局部优化能力,适用于大规模问题,且易于实现和灵活应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值