Tue 27 Aug 00:14:56 CEST 2024
This commit is contained in:
		
							parent
							
								
									d033aa66cb
								
							
						
					
					
						commit
						6562620e3d
					
				
							
								
								
									
										289
									
								
								test/test-simu2.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										289
									
								
								test/test-simu2.js
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,289 @@
 | 
			
		|||
/*
 | 
			
		||||
  SEJAM2 Demo: Vehicle agents on streets
 | 
			
		||||
  1. Physical and computational agents
 | 
			
		||||
  2. Netlog API und Patchworld
 | 
			
		||||
  3. Resources (streets)
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
function world() {
 | 
			
		||||
  this.modelSim=null;
 | 
			
		||||
  this.children=[];
 | 
			
		||||
  this.streets=[];
 | 
			
		||||
  
 | 
			
		||||
  this.act = {
 | 
			
		||||
    init: function () {
 | 
			
		||||
      var self=this, row , patches, i,j,s,st;
 | 
			
		||||
      this.modelSim = simu.model();
 | 
			
		||||
      this.streets=net.ask('resources-street','*');
 | 
			
		||||
      patches = net.ask('patches','*');
 | 
			
		||||
      for(s=0;s<this.streets.length;s++) {
 | 
			
		||||
        st=this.streets[s];
 | 
			
		||||
        for(j=st.y;j<st.y+st.h;j++)
 | 
			
		||||
          for(i=st.x;i<st.x+st.w;i++)
 | 
			
		||||
            patches[j][i].street=st.resource;
 | 
			
		||||
      }
 | 
			
		||||
      net.create('agent-vehicle',4,function (ag,index) {
 | 
			
		||||
          var st=self.streets[0];
 | 
			
		||||
          ag.street=st;
 | 
			
		||||
          ag.dir=DIR.WEST;
 | 
			
		||||
          net.turn(ag.dir);
 | 
			
		||||
          net.setxy(st.x+int(st.w/2)-3+index,st.y)
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    wait: function () {},
 | 
			
		||||
    end: function () {}
 | 
			
		||||
  }
 | 
			
		||||
  this.trans = {
 | 
			
		||||
    init:wait,
 | 
			
		||||
  }
 | 
			
		||||
  this.next=init
 | 
			
		||||
}
 | 
			
		||||
function vehicle() {
 | 
			
		||||
  this.group=null;
 | 
			
		||||
  this.passenger=[];
 | 
			
		||||
  this.dir=DIR.ORIGIN;
 | 
			
		||||
  this.sensors={}
 | 
			
		||||
  this.speed=0;
 | 
			
		||||
  this.street=null;
 | 
			
		||||
  this.todo={};
 | 
			
		||||
  this.last=null;
 | 
			
		||||
  
 | 
			
		||||
  this.act = {
 | 
			
		||||
    init: function () {
 | 
			
		||||
    },
 | 
			
		||||
    percept: function () {
 | 
			
		||||
      switch (this.dir) {
 | 
			
		||||
        case DIR.WEST:
 | 
			
		||||
          this.sensors.front = reverse(net.ask('patches',{dir:DIR.WEST,distance:4}))
 | 
			
		||||
          this.sensors.left  =         net.ask('patches',{dir:DIR.SOUTH,distance:4})
 | 
			
		||||
          this.sensors.right = reverse(net.ask('patches',{dir:DIR.NORTH,distance:4}))
 | 
			
		||||
          break;
 | 
			
		||||
        case DIR.EAST:
 | 
			
		||||
          this.sensors.front =         net.ask('patches',{dir:DIR.EAST,distance:4})
 | 
			
		||||
          this.sensors.left  = reverse(net.ask('patches',{dir:DIR.NORTH,distance:4}))
 | 
			
		||||
          this.sensors.right =         net.ask('patches',{dir:DIR.SOUTH,distance:4})
 | 
			
		||||
          break;
 | 
			
		||||
        case DIR.NORTH:
 | 
			
		||||
          this.sensors.front = reverse(net.ask('patches',{dir:DIR.NORTH,distance:4}))
 | 
			
		||||
          this.sensors.left  = reverse(net.ask('patches',{dir:DIR.WEST,distance:4}))
 | 
			
		||||
          this.sensors.right =         net.ask('patches',{dir:DIR.EAST,distance:4})
 | 
			
		||||
          break;
 | 
			
		||||
        case DIR.SOUTH:
 | 
			
		||||
          this.sensors.front =         net.ask('patches',{dir:DIR.SOUTH,distance:4})
 | 
			
		||||
          this.sensors.left  =         net.ask('patches',{dir:DIR.EAST,distance:4})
 | 
			
		||||
          this.sensors.right = reverse(net.ask('patches',{dir:DIR.WEST,distance:4}))
 | 
			
		||||
          break;
 | 
			
		||||
        
 | 
			
		||||
      }
 | 
			
		||||
      if (this.sensors.front[0].street != this.street.resource) 
 | 
			
		||||
        net.die();       // vehicle left the road!
 | 
			
		||||
      log(simu.inspect(this.sensors.right))
 | 
			
		||||
      if (this.sensors.right[1].street &&
 | 
			
		||||
          this.sensors.right[1].street != this.street.resource &&
 | 
			
		||||
          this.last != this.sensors.right[1].street) {
 | 
			
		||||
        var next=net.ask('resource',this.sensors.right[1].street)
 | 
			
		||||
        log(next.resource)
 | 
			
		||||
        this.todo={right:next};
 | 
			
		||||
      }
 | 
			
		||||
      if (this.sensors.front[1].street &&
 | 
			
		||||
          this.sensors.front[1].street != this.street.resource &&
 | 
			
		||||
          this.last != this.sensors.front[1].street) {
 | 
			
		||||
        var next=net.ask('resource',this.sensors.front[1].street)
 | 
			
		||||
        log(next.resource)
 | 
			
		||||
        this.todo={forward:1,right:next};
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    move: function () {
 | 
			
		||||
      if (this.todo.forward) net.forward(this.todo.forward);
 | 
			
		||||
      if (this.todo.right) {
 | 
			
		||||
        // change street by right turn
 | 
			
		||||
        this.last=this.street.resource;
 | 
			
		||||
        this.street=this.todo.right;
 | 
			
		||||
        net.turn(90);
 | 
			
		||||
        switch (net.get('heading')) {
 | 
			
		||||
          case 0:   this.dir=DIR.NORTH; break;
 | 
			
		||||
          case 90:  this.dir=DIR.EAST; break;
 | 
			
		||||
          case 180: this.dir=DIR.SOUTH; break;
 | 
			
		||||
          case 270: this.dir=DIR.WEST; break;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      if (!this.todo.forward) net.forward(1);
 | 
			
		||||
      this.todo={}
 | 
			
		||||
    },
 | 
			
		||||
    wait: function () {
 | 
			
		||||
      sleep(5)
 | 
			
		||||
    },
 | 
			
		||||
    end: function () {}
 | 
			
		||||
  }
 | 
			
		||||
  this.trans = {
 | 
			
		||||
    init:percept,
 | 
			
		||||
    percept:wait,
 | 
			
		||||
    wait:move,
 | 
			
		||||
    move:percept,
 | 
			
		||||
  }
 | 
			
		||||
  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
 | 
			
		||||
          }
 | 
			
		||||
      } 
 | 
			
		||||
    },
 | 
			
		||||
    vehicle : {
 | 
			
		||||
      behaviour : vehicle,
 | 
			
		||||
      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
 | 
			
		||||
            }
 | 
			
		||||
          },
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    vehicle : 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 : {
 | 
			
		||||
    street : function (id,x,y,w,h) {
 | 
			
		||||
        return {
 | 
			
		||||
          id:id,
 | 
			
		||||
          class:'street',
 | 
			
		||||
          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,
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        };
 | 
			
		||||
      }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  parameter : {
 | 
			
		||||
    streets:{}
 | 
			
		||||
  },
 | 
			
		||||
  
 | 
			
		||||
  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!!
 | 
			
		||||
      var i,j,x,y;
 | 
			
		||||
      // construct street map
 | 
			
		||||
      var streets=[];
 | 
			
		||||
      i=1;
 | 
			
		||||
      for(y=3;y<model.world.patchgrid.rows-5;y+=7,i++) {
 | 
			
		||||
        model.parameter.streets['street'+i] = [
 | 
			
		||||
            2,y,(model.world.patchgrid.cols-4),3
 | 
			
		||||
        ]
 | 
			
		||||
        i++;
 | 
			
		||||
        if (y<model.world.patchgrid.rows-10) 
 | 
			
		||||
          for(x=3;x<model.world.patchgrid.cols-5;x+=10,i++) {
 | 
			
		||||
            model.parameter.streets['street'+i] = [
 | 
			
		||||
              x,(y+3),3,4
 | 
			
		||||
            ]
 | 
			
		||||
          }
 | 
			
		||||
      }
 | 
			
		||||
      // construct
 | 
			
		||||
      for(var p in model.parameter.streets) {
 | 
			
		||||
        var coord = model.parameter.streets[p];
 | 
			
		||||
        streets.push(model.resources.street(p,coord[0],coord[1],coord[2],coord[3]))
 | 
			
		||||
      }
 | 
			
		||||
      return streets;
 | 
			
		||||
    },
 | 
			
		||||
    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