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

📄 littleant.as

📁 蚁群算法蚁群算法在移动Agent迁移中的应用研究文档信息
💻 AS
字号:
package com.view
{
	import com.model.ModelLocator;
	
	import flash.display.Sprite;
	import flash.events.Event;

	public class littleAnt extends Sprite
	{
		[Bindable]
		private var __model:ModelLocator = ModelLocator.getInstance();
		
		private var range:int = 3;
		private var remeber:Number = 5;
		private var remeberplace:Array = new Array();
		private var moveFaultProbability:Number = .02 * Math.random();
		private var messagesFaultProbability:Number = .3;
		private var speed:Number = 1;
		private var award:Number = 360 * Math.random();
		private var currentplace:Array = new Array();
		private var previousplace:Array = new Array();
		private var messagesplace:MapUnit;
		
		private var ant:antswc;
		
		public function littleAnt(xpoint:Number, ypoint:Number){
			currentplace = [int(xpoint / __model.mapinfo.unit), int(ypoint / __model.mapinfo.unit)];
			remeberplace.push(currentplace);
			
			ant = new antswc();
			addChild(ant);
			ant.scaleX = ant.scaleY = 0.05;
			ant.rotation = award;
			
			this.addEventListener(Event.ENTER_FRAME, conctrolMove);
		}
		
		private function conctrolMove(event:Event):void{
			//if((messagesplace = lookForMessages()) == null){
				moveForMove();
			//}else{
				//moveForFood(messagesplace);
			//}
		}
		
		
		
		
		private function moveForMove():void{
			if(Math.random() < moveFaultProbability){
				changeAward();
			}
			
			ant.rotation = award;
			var xnext:Number = this.x + speed * Math.sin(award / 57.3);
			var ynext:Number = this.y - speed * Math.cos(award / 57.3);
			
			if(againstTheWall(xnext, ynext) && !noBackWay(xnext, ynext)){
				this.x = xnext;
				this.y = ynext;
			}else{
				changeAward();
			}
			
		}
		
		
		private function moveForFood(nextMapUnit:MapUnit):void{
			var xunitdifference:int = nextMapUnit.xnum - currentplace[0];
			var yunitdifference:int = nextMapUnit.ynum - currentplace[1];
			
			var xdifference:Number;
			switch(xunitdifference){
				case -1:
					xdifference = (nextMapUnit.xnum+1)*__model.mapinfo.unit - this.x;
					break;
				case 1:
					xdifference = nextMapUnit.xnum*__model.mapinfo.unit - this.x;
					break;
				case 0:
					xdifference = 0;
					break;
			}
			
			var ydifference:Number;
			switch(yunitdifference){
				case -1:
					ydifference = (nextMapUnit.ynum+1)*__model.mapinfo.unit - this.y;
					break;
				case 1:
					ydifference = nextMapUnit.ynum*__model.mapinfo.unit - this.y;
					break;
				case 0:
					ydifference = 0;
					break;
			}
			
			if(!(xdifference == 0 && ydifference == 0)){
				//trace(yunitdifference);
				//trace(Math.atan(xdifference/ydifference) * 57.3)
				ant.rotation = award = Math.atan(xdifference/(0-ydifference)) * 57.3 + (yunitdifference == 1?180:0);
				//ant.rotation = Math.atan(xdifference/ydifference) * 57.3;
					
				var difference:Number = Math.sqrt(xdifference*xdifference + ydifference*ydifference);
				this.x +=  xdifference / difference;
				this.y +=  ydifference / difference;
				
				var nextplace:Array = [int(this.x/__model.mapinfo.unit), int(this.y/__model.mapinfo.unit)];
				if(nextplace[0] != currentplace[0] || nextplace[1] != currentplace[1]){
					currentplace = nextplace;
					
					if(remeberplace.length == remeber){
						remeberplace.shift();
					}
					
					remeberplace.push(nextplace);
				}
			}else{
				this.x += speed * Math.sin(award / 57.3);
				this.y -= speed * Math.cos(award / 57.3);
			}
			
		}
		
		private function changeAward(r:Number=360):void{
			award = r * Math.random();
			//this.rotation = (award += (r * 2 * Math.random() - r));
		}
		
		private function againstTheWall(xnext:Number, ynext:Number):Boolean{
			if(xnext < 0 || xnext > __model.mapinfo.xnum*__model.mapinfo.unit || ynext < 0 || ynext > __model.mapinfo.ynum*__model.mapinfo.unit)
				return false;
			else
				return true;
		}
		
		private function noBackWay(xnext:Number, ynext:Number):Boolean{
			var nextplace:Array = [int(xnext/__model.mapinfo.unit), int(ynext/__model.mapinfo.unit)];
			if(nextplace[0] != currentplace[0] || nextplace[1] != currentplace[1]){
				
				if(_getIndexOf(remeberplace, nextplace) == -1){
					if(remeberplace.length == remeber){
						remeberplace.shift();
					}
					remeberplace.push(nextplace);
					
					currentplace = nextplace;
					return false;
				}else{
					return true;
				}
			}else{
				return false;
			}
		}
		
		private function _getIndexOf(base:Array, child:Array):int{
			for(var i:Number = 0; i < base.length; i ++){
				if(base[i][0] == child[0] && base[i][1] == child[1]){
					return i;
					break;
				}
			}
			return -1;
		}
		
		private function lookForMessages():MapUnit{
			if(previousplace != currentplace){
				//trace(previousplace);
				//trace(currentplace);
				var step:int = (range - 1) / 2;
				var currentxnum:int = currentplace[0];
				var currentynum:int = currentplace[1];
				var choose:Array = new Array();
				
				var xbegin:int = Math.max(0,currentxnum-step);
				var xend:int = Math.min(__model.mapinfo.xnum, currentxnum+step);
				var ybegin:int = Math.max(0,currentynum-step);
				var yend:int = Math.min(__model.mapinfo.ynum, currentynum+step);
				
				for(var i:int = xbegin; i <= xend; i++){
					for(var j:int = ybegin; j <= yend; j++){
						if(!(i == currentxnum && j == currentynum) && __model.mapinfo.maps[i][j].Messages > 0){
							if(_getIndexOf(remeberplace, [__model.mapinfo.maps[j][i].xnum, __model.mapinfo.maps[j][i].ynum]) == -1)
								choose.push(__model.mapinfo.maps[j][i]);
						}
					}
				}
				previousplace = currentplace;
				var len:int = choose.length;
				//trace("***************" + len);
				if(len > 0){
					choose.sortOn("Messages", Array.NUMERIC);
					for(var k:String in choose){
						//trace("****" + choose[k].xnum + "," + choose[k].ynum + "," + choose[k].Messages);
					}
					var nextchoose:MapUnit;
					if(Math.random() > messagesFaultProbability){
						//trace(choose[len-1].xnum + "," + choose[len-1].ynum + "," + choose[len-1].Messages);
						//trace("_____________________________");
						nextchoose = choose[len-1];
					}else{
						var index:int = int((len-1)*Math.random());
						nextchoose = choose[index];
					}
					return nextchoose;
				}else{
					return null;
				}
				
			}else{
				return messagesplace;
			}
				
		}
		
	}
}

⌨️ 快捷键说明

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