Tue 27 Aug 00:14:56 CEST 2024
This commit is contained in:
		
							parent
							
								
									42bfed827f
								
							
						
					
					
						commit
						a65dd0762b
					
				
							
								
								
									
										296
									
								
								test/test-simu1.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										296
									
								
								test/test-simu1.js
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,296 @@
 | 
			
		|||
/*
 | 
			
		||||
  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>
 | 
			
		||||
    }
 | 
			
		||||
  }  
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user