297 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			297 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								  SEJAM2:
							 | 
						||
| 
								 | 
							
								  1. Physical and computational agents
							 | 
						||
| 
								 | 
							
								  2. Netlog API und Patchworld
							 | 
						||
| 
								 | 
							
								  3. Agent groups
							 | 
						||
| 
								 | 
							
								  4. Resources (obstacles)
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function world() {
							 | 
						||
| 
								 | 
							
								  this.modelSim=null;
							 | 
						||
| 
								 | 
							
								  this.children=[];
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  this.act = {
							 | 
						||
| 
								 | 
							
								    init: function () {
							 | 
						||
| 
								 | 
							
								      var self=this;
							 | 
						||
| 
								 | 
							
								      this.modelSim = simu.model();
							 | 
						||
| 
								 | 
							
								      this.children=net.create('agents-follower',10, function (o) {
							 | 
						||
| 
								 | 
							
								          var x0=random(0,self.modelSim.world.patchgrid.cols-1),
							 | 
						||
| 
								 | 
							
								              y0=random(0,self.modelSim.world.patchgrid.rows-1);
							 | 
						||
| 
								 | 
							
								          net.setxy(x0,y0)        
							 | 
						||
| 
								 | 
							
								      })
							 | 
						||
| 
								 | 
							
								      this.children.push(net.create('agents-leader',1,function (o) {
							 | 
						||
| 
								 | 
							
								          var x0=random(0,self.modelSim.world.patchgrid.cols-1),
							 | 
						||
| 
								 | 
							
								              y0=random(0,self.modelSim.world.patchgrid.rows-1);
							 | 
						||
| 
								 | 
							
								          net.setxy(x0,y0)        
							 | 
						||
| 
								 | 
							
								      }))
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    wait: function () {},
							 | 
						||
| 
								 | 
							
								    end: function () {}
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  this.trans = {
							 | 
						||
| 
								 | 
							
								    init:wait,
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  this.next=init
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function follower() {
							 | 
						||
| 
								 | 
							
								  this.group=null;
							 | 
						||
| 
								 | 
							
								  this.children=[];
							 | 
						||
| 
								 | 
							
								  this.position=null;
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  this.act = {
							 | 
						||
| 
								 | 
							
								    init: function () {
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    percept: function () {
							 | 
						||
| 
								 | 
							
								      this.group = net.ask('agent',net.ask('parent'));
							 | 
						||
| 
								 | 
							
								      
							 | 
						||
| 
								 | 
							
								      if (this.group && this.group.length) this.group=this.group[0];
							 | 
						||
| 
								 | 
							
								      if (this.group) this.position=this.group.pos;
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    wait: function () {
							 | 
						||
| 
								 | 
							
								      sleep(5)
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    end: function () {}
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  this.trans = {
							 | 
						||
| 
								 | 
							
								    init:percept,
							 | 
						||
| 
								 | 
							
								    percept:wait,
							 | 
						||
| 
								 | 
							
								    wait:percept,
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  this.next=init
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function leader() {
							 | 
						||
| 
								 | 
							
								  this.children = []
							 | 
						||
| 
								 | 
							
								  this.steps = 0
							 | 
						||
| 
								 | 
							
								  this.act = {
							 | 
						||
| 
								 | 
							
								    init: function () {
							 | 
						||
| 
								 | 
							
								      log('waiting for twins...')
							 | 
						||
| 
								 | 
							
								      net.turn(DIR.WEST)
							 | 
						||
| 
								 | 
							
								      sleep(2)
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    groupthem: function () {
							 | 
						||
| 
								 | 
							
								      log('group')
							 | 
						||
| 
								 | 
							
								      // Collect some follower agents in the world
							 | 
						||
| 
								 | 
							
								      this.children = 
							 | 
						||
| 
								 | 
							
								        map(net.ask('agents-follower','*'), function (o) {
							 | 
						||
| 
								 | 
							
								          if (Math.random()>0.5) return o.agent;
							 | 
						||
| 
								 | 
							
								          else return none;
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								      log(this.children)
							 | 
						||
| 
								 | 
							
								      net.group.add(me(),this.children,DIR.EAST)  
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    percept : function () {
							 | 
						||
| 
								 | 
							
								      var obstacles = net.ask('resource-obstacle',4);
							 | 
						||
| 
								 | 
							
								      log(4); log(simu.inspect(obstacles))
							 | 
						||
| 
								 | 
							
								      var sensors = [DIR.NORTH,DIR.SOUTH,DIR.WEST,DIR.EAST];
							 | 
						||
| 
								 | 
							
								      iter(sensors,function (sensor) {
							 | 
						||
| 
								 | 
							
								        var next = net.ask('distance',sensor);
							 | 
						||
| 
								 | 
							
								        log(sensor); log(simu.inspect(next))
							 | 
						||
| 
								 | 
							
								      })
							 | 
						||
| 
								 | 
							
								      var next = net.ask('resource',{dx:-2,dy:-2,w:5,h:5});
							 | 
						||
| 
								 | 
							
								      log('bbox'); log(simu.inspect(next))
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    move: function () {
							 | 
						||
| 
								 | 
							
								      if (this.steps==3) {
							 | 
						||
| 
								 | 
							
								        log('turning');
							 | 
						||
| 
								 | 
							
								        net.turn(DIR.NORTH);
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        log('moving');
							 | 
						||
| 
								 | 
							
								        net.forward(1);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      this.steps++
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    wait: function () { sleep(5)},
							 | 
						||
| 
								 | 
							
								    end: function () {}
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  this.trans = {
							 | 
						||
| 
								 | 
							
								    init:groupthem,
							 | 
						||
| 
								 | 
							
								    groupthem:wait,
							 | 
						||
| 
								 | 
							
								    wait:percept,
							 | 
						||
| 
								 | 
							
								    percept:move,
							 | 
						||
| 
								 | 
							
								    move:wait
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  this.next=init
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								model = {
							 | 
						||
| 
								 | 
							
								  name:'Test Simulation',
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  // Agents behaviour and visuals
							 | 
						||
| 
								 | 
							
								  agents : {
							 | 
						||
| 
								 | 
							
								    world : {
							 | 
						||
| 
								 | 
							
								      behaviour:world,
							 | 
						||
| 
								 | 
							
								      visual:{
							 | 
						||
| 
								 | 
							
								          shape:'circle',
							 | 
						||
| 
								 | 
							
								          width:10,
							 | 
						||
| 
								 | 
							
								          height:10,
							 | 
						||
| 
								 | 
							
								          fill: {
							 | 
						||
| 
								 | 
							
								            color:'green',
							 | 
						||
| 
								 | 
							
								            opacity: 0.0
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								      } 
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    follower : {
							 | 
						||
| 
								 | 
							
								      behaviour : follower,
							 | 
						||
| 
								 | 
							
								      visual:{
							 | 
						||
| 
								 | 
							
								          shape:'circle',
							 | 
						||
| 
								 | 
							
								          width:4,
							 | 
						||
| 
								 | 
							
								          height:4,
							 | 
						||
| 
								 | 
							
								          fill: {
							 | 
						||
| 
								 | 
							
								            color:'blue',
							 | 
						||
| 
								 | 
							
								            opacity: 0.0
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								      type:'physical'
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    leader : {
							 | 
						||
| 
								 | 
							
								      behaviour : leader,
							 | 
						||
| 
								 | 
							
								      visual:{
							 | 
						||
| 
								 | 
							
								          shape:'circle',
							 | 
						||
| 
								 | 
							
								          width:4,
							 | 
						||
| 
								 | 
							
								          height:4,
							 | 
						||
| 
								 | 
							
								          fill: {
							 | 
						||
| 
								 | 
							
								            color:'white',
							 | 
						||
| 
								 | 
							
								            opacity: 0.0
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								      type:'physical'
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  parameter : {
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Node constructor functions (visual)
							 | 
						||
| 
								 | 
							
								  nodes: {
							 | 
						||
| 
								 | 
							
								    world: function (x,y) {
							 | 
						||
| 
								 | 
							
								        return {
							 | 
						||
| 
								 | 
							
								          id:'world',
							 | 
						||
| 
								 | 
							
								          x:x, // patch position
							 | 
						||
| 
								 | 
							
								          y:y,
							 | 
						||
| 
								 | 
							
								          visual : {
							 | 
						||
| 
								 | 
							
								            shape:'icon',
							 | 
						||
| 
								 | 
							
								            icon:'world',
							 | 
						||
| 
								 | 
							
								            label:{
							 | 
						||
| 
								 | 
							
								              text:'World',
							 | 
						||
| 
								 | 
							
								              fontSize:14
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								            width:20,
							 | 
						||
| 
								 | 
							
								            height:20,
							 | 
						||
| 
								 | 
							
								            fill: {
							 | 
						||
| 
								 | 
							
								              color:'black',
							 | 
						||
| 
								 | 
							
								              opacity: 0.5
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								          },
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    follower : function (x,y,id) {
							 | 
						||
| 
								 | 
							
								        return {
							 | 
						||
| 
								 | 
							
								          id:id,
							 | 
						||
| 
								 | 
							
								          x:x, // patch position
							 | 
						||
| 
								 | 
							
								          y:y,
							 | 
						||
| 
								 | 
							
								          visual : {
							 | 
						||
| 
								 | 
							
								            shape:'circle',
							 | 
						||
| 
								 | 
							
								            width:10,
							 | 
						||
| 
								 | 
							
								            height:10,
							 | 
						||
| 
								 | 
							
								            line : {
							 | 
						||
| 
								 | 
							
								              width:0,
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								            fill: {
							 | 
						||
| 
								 | 
							
								              color:'orange',
							 | 
						||
| 
								 | 
							
								              opacity: 0.5
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								        }      
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    leader : function (x,y,id) {
							 | 
						||
| 
								 | 
							
								        return {
							 | 
						||
| 
								 | 
							
								          id:id,
							 | 
						||
| 
								 | 
							
								          x:x, // patch position
							 | 
						||
| 
								 | 
							
								          y:y,
							 | 
						||
| 
								 | 
							
								          visual : {
							 | 
						||
| 
								 | 
							
								            shape :'rect',
							 | 
						||
| 
								 | 
							
								            width :10,
							 | 
						||
| 
								 | 
							
								            height:10,
							 | 
						||
| 
								 | 
							
								            fill: {
							 | 
						||
| 
								 | 
							
								              color:'black',
							 | 
						||
| 
								 | 
							
								              opacity: 0.5
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								            line : {
							 | 
						||
| 
								 | 
							
								              width:1,
							 | 
						||
| 
								 | 
							
								              color:'black'
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								        }      
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  },  
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  resources : {
							 | 
						||
| 
								 | 
							
								    block : function (x,y,w,h,id) {
							 | 
						||
| 
								 | 
							
								      return {
							 | 
						||
| 
								 | 
							
								          data : [],
							 | 
						||
| 
								 | 
							
								          id : id,
							 | 
						||
| 
								 | 
							
								          class : 'obstacle',
							 | 
						||
| 
								 | 
							
								          visual: {
							 | 
						||
| 
								 | 
							
								            shape:'rect',
							 | 
						||
| 
								 | 
							
								            label:{
							 | 
						||
| 
								 | 
							
								              text:id,
							 | 
						||
| 
								 | 
							
								              fontSize:5
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								            x:x,
							 | 
						||
| 
								 | 
							
								            y:y,
							 | 
						||
| 
								 | 
							
								            width:w,
							 | 
						||
| 
								 | 
							
								            height:h,
							 | 
						||
| 
								 | 
							
								            line: {
							 | 
						||
| 
								 | 
							
								              color: '#888',
							 | 
						||
| 
								 | 
							
								              width: 0
							 | 
						||
| 
								 | 
							
								            },
							 | 
						||
| 
								 | 
							
								            fill : {
							 | 
						||
| 
								 | 
							
								              color: '#888',
							 | 
						||
| 
								 | 
							
								              opacity: 0.2,
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								          }    
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  world : {
							 | 
						||
| 
								 | 
							
								    init: {
							 | 
						||
| 
								 | 
							
								      agents: {
							 | 
						||
| 
								 | 
							
								        world: function(nodeId) {
							 | 
						||
| 
								 | 
							
								          if (nodeId=='world') 
							 | 
						||
| 
								 | 
							
								            return {level:3,args:{verbose:1}};
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    // special nodes
							 | 
						||
| 
								 | 
							
								    map : function (model) {
							 | 
						||
| 
								 | 
							
								      return [
							 | 
						||
| 
								 | 
							
								          model.nodes.world(20,20),  // patch position    
							 | 
						||
| 
								 | 
							
								      ]
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    resources : function (model) {
							 | 
						||
| 
								 | 
							
								      // patch grid coordinates!!
							 | 
						||
| 
								 | 
							
								      return [
							 | 
						||
| 
								 | 
							
								        model.resources.block(10,15,2,3,'obstacle1'),
							 | 
						||
| 
								 | 
							
								        model.resources.block(3,5,2,3,'obstacle2'),
							 | 
						||
| 
								 | 
							
								        model.resources.block(7,10,2,3,'obstacle3'),
							 | 
						||
| 
								 | 
							
								        model.resources.block(10,3,2,3,'obstacle4'),
							 | 
						||
| 
								 | 
							
								      ]
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    patchgrid : {
							 | 
						||
| 
								 | 
							
								      rows : 20,
							 | 
						||
| 
								 | 
							
								      cols : 20,
							 | 
						||
| 
								 | 
							
								      width : 10, // geometrical width and height of patch in pixels
							 | 
						||
| 
								 | 
							
								      height : 10,
							 | 
						||
| 
								 | 
							
								      floating : true,  // physical agents are tuples <logical node, physical agent>
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }  
							 | 
						||
| 
								 | 
							
								}
							 |