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