Skip to content

Commit

Permalink
Addition of models for the BDI tutorial
Browse files Browse the repository at this point in the history
  • Loading branch information
benoitgaudou committed Aug 29, 2019
1 parent 2e948dd commit ae1286d
Show file tree
Hide file tree
Showing 5 changed files with 814 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/***
* Name: BDItutorial1
* Author: Mathieu Bourgais
* Description: The skeleton model of the Goldminer BDI tutorial.
* Tags: species
***/

model BDItutorial1

global {
int nb_mines <- 10;
market the_market;
geometry shape <- square(20 #km);
float step <- 10#mn;

init {
create market {
the_market <- self;
}
create gold_mine number: nb_mines;
}
}

species gold_mine {
int quantity <- rnd(1,20);
aspect default {
draw triangle(200 + quantity * 50) color: (quantity > 0) ? #yellow : #gray border: #black;
}
}

species market {
int golds;
aspect default {
draw square(1000) color: #black ;
}
}

experiment GoldBdi type: gui {

output {
display map type: opengl {
species market ;
species gold_mine ;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
/***
* Name: BDItutorial2
* Author: Mathieu Bourgais
* Description: Description of gold miner behaviors using BDI architecture
* Tags: BDI, plan, intention
***/

model BDItutorial2

global {
int nb_mines <- 10;
int nb_miners <-5;
market the_market;
geometry shape <- square(20 #km);
float step <- 10#mn;

string mine_at_location <- "mine_at_location";
string empty_mine_location <- "empty_mine_location";

//possible predicates concerning miners
predicate mine_location <- new_predicate(mine_at_location) ;
predicate choose_gold_mine <- new_predicate("choose a gold mine");
predicate has_gold <- new_predicate("extract gold");
predicate find_gold <- new_predicate("find gold") ;
predicate sell_gold <- new_predicate("sell gold") ;

float inequality <- 0.0 update:standard_deviation(miner collect each.gold_sold);

init {
create market {
the_market <- self;
}
create gold_mine number:nb_mines;
create miner number:nb_miners;
}

reflex end_simulation when: sum(gold_mine collect each.quantity) = 0 and empty(miner where each.has_belief(has_gold)){
do pause;
}
}

species gold_mine {
int quantity <- rnd(1,20);
aspect default {
draw triangle(200 + quantity * 50) color: (quantity > 0) ? #yellow : #gray border: #black;
}
}

species market {
int golds;
aspect default {
draw square(1000) color: #black ;
}
}

species miner skills: [moving] control:simple_bdi {

float view_dist<-1000.0;
float speed <- 2#km/#h;
rgb my_color <- rnd_color(255);
point target;
int gold_sold;

init {
do add_desire(find_gold);
}

perceive target: gold_mine where (each.quantity > 0) in: view_dist {
focus id:mine_at_location var:location;
ask myself {
do remove_intention(find_gold, false);
}
}

rule belief: mine_location new_desire: has_gold strength: 2.0;
rule belief: has_gold new_desire: sell_gold strength: 3.0;


plan lets_wander intention: find_gold {
do wander;
}

plan get_gold intention: has_gold {
if (target = nil) {
do add_subintention(get_current_intention(),choose_gold_mine, true);
do current_intention_on_hold();
} else {
do goto target: target ;
if (target = location) {
gold_mine current_mine<- gold_mine first_with (target = each.location);
if current_mine.quantity > 0 {
do add_belief(has_gold);
ask current_mine {quantity <- quantity - 1;}
} else {
do add_belief(new_predicate(empty_mine_location, ["location_value"::target]));
}
target <- nil;
}
}
}

plan choose_closest_gold_mine intention: choose_gold_mine instantaneous: true {
list<point> possible_mines <- get_beliefs_with_name(mine_at_location) collect (point(get_predicate(mental_state (each)).values["location_value"]));
list<point> empty_mines <- get_beliefs_with_name(empty_mine_location) collect (point(get_predicate(mental_state (each)).values["location_value"]));
possible_mines <- possible_mines - empty_mines;
if (empty(possible_mines)) {
do remove_intention(has_gold, true);
} else {
target <- (possible_mines with_min_of (each distance_to self)).location;
}
do remove_intention(choose_gold_mine, true);
}

plan return_to_base intention: sell_gold {
do goto target: the_market ;
if (the_market.location = location) {
do remove_belief(has_gold);
do remove_intention(sell_gold, true);
gold_sold <- gold_sold + 1;
}
}

aspect default {
draw circle(200) color: my_color border: #black depth: gold_sold;
}
}

experiment GoldBdi type: gui {

output {
display map type: opengl {
species market ;
species gold_mine ;
species miner;
}
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
/***
* Name: BDItutorial3
* Author: Mathieu Bourgais
* Description: Addition of social relationship and information exchange.
* Tags: social link, information sharing, socialize
***/

model BDItutorial3

global {
int nb_mines <- 10;
int nb_miners <-5;
market the_market;
geometry shape <- square(20 #km);
float step <- 10#mn;

string mine_at_location <- "mine_at_location";
string empty_mine_location <- "empty_mine_location";

//possible predicates concerning miners
predicate mine_location <- new_predicate(mine_at_location) ;
predicate choose_gold_mine <- new_predicate("choose a gold mine");
predicate has_gold <- new_predicate("extract gold");
predicate find_gold <- new_predicate("find gold") ;
predicate sell_gold <- new_predicate("sell gold") ;
predicate share_information <- new_predicate("share information") ;

float inequality <- 0.0 update: standard_deviation(miner collect each.gold_sold);

init {
create market {
the_market <- self;
}
create gold_mine number: nb_mines;
create miner number: nb_miners;
}

reflex end_simulation when: sum(gold_mine collect each.quantity) = 0 and empty(miner where each.has_belief(has_gold)){
do pause;
}
}

species gold_mine {
int quantity <- rnd(1,20);
aspect default {
draw triangle(200 + quantity * 50) color: (quantity > 0) ? #yellow : #gray border: #black;
}
}

species market {
int golds;
aspect default {
draw square(1000) color: #black ;
}
}

species miner skills: [moving] control:simple_bdi {

float view_dist<-1000.0;
float speed <- 2#km/#h;
rgb my_color<-rnd_color(255);
point target;
int gold_sold;

bool use_social_architecture <- true;

init {
do add_desire(find_gold);
}

perceive target: miner in: view_dist {
socialize liking: 1 - point(my_color.red, my_color.green, my_color.blue) distance_to point(myself.my_color.red, myself.my_color.green, myself.my_color.blue) / 255;
}

perceive target: gold_mine where (each.quantity > 0) in: view_dist {
focus id: mine_at_location var:location;
ask myself {
do add_desire(predicate:share_information, strength: 5.0);
do remove_intention(find_gold, false);
}
}

rule belief: mine_location new_desire: has_gold strength: 2.0;
rule belief: has_gold new_desire: sell_gold strength: 3.0;


plan lets_wander intention: find_gold {
do wander;
}

plan get_gold intention:has_gold
{
if (target = nil) {
do add_subintention(get_current_intention(),choose_gold_mine, true);
do current_intention_on_hold();
} else {
do goto target: target ;
if (target = location) {
gold_mine current_mine<- gold_mine first_with (target = each.location);
if current_mine.quantity > 0 {
do add_belief(has_gold);
ask current_mine {quantity <- quantity - 1;}
} else {
do add_belief(new_predicate(empty_mine_location, ["location_value"::target]));
}
target <- nil;
}
}
}

plan choose_closest_gold_mine intention: choose_gold_mine instantaneous: true {
list<point> possible_mines <- get_beliefs_with_name(mine_at_location) collect (point(get_predicate(mental_state (each)).values["location_value"]));
list<point> empty_mines <- get_beliefs_with_name(empty_mine_location) collect (point(get_predicate(mental_state (each)).values["location_value"]));
possible_mines <- possible_mines - empty_mines;
if (empty(possible_mines)) {
do remove_intention(has_gold, true);
} else {
target <- (possible_mines with_min_of (each distance_to self)).location;
}
do remove_intention(choose_gold_mine, true);
}

plan return_to_base intention: sell_gold {
do goto target: the_market ;
if (the_market.location = location) {
do remove_belief(has_gold);
do remove_intention(sell_gold, true);
gold_sold <- gold_sold + 1;
}
}

plan share_information_to_friends intention: share_information instantaneous: true {
list<miner> my_friends <- list<miner>((social_link_base where (each.liking > 0)) collect each.agent);
loop known_gold_mine over: get_beliefs_with_name(mine_at_location) {
ask my_friends {
do add_belief(known_gold_mine);
}
}
loop known_empty_gold_mine over: get_beliefs_with_name(empty_mine_location) {
ask my_friends {
do add_belief(known_empty_gold_mine);
}
}

do remove_intention(share_information, true);
}

aspect default {
draw circle(200) color: my_color border: #black depth: gold_sold;
}
}


experiment GoldBdi type: gui {
output {
display map type: opengl {
species market ;
species gold_mine ;
species miner;
}
}
}
Loading

0 comments on commit ae1286d

Please sign in to comment.