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>
 | 
						|
    }
 | 
						|
  }  
 | 
						|
}
 |