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