CoRobat
Model was written in NetLogo 5.1.0
•
Viewed 240 times
•
Downloaded 18 times
•
Run 0 times
Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)
Comments and Questions
Please start the discussion about this model!
(You'll first need to log in.)
Click to Run Model
turtles-own [ robot-type ;; vision-radius ;; life ;; if-find-prey? ;; no-use prey-xcor ; no-use prey-ycor ; no-use prey-heading ; no-use ] to init clear-all set-patch-color create-Robots end to set-patch-color ask patches [ set pcolor 5 ] end to create-Robots ;;1) create captures create-turtles count-of-hunter [ set robot-type "hunter" set color 40 + random 100 set size 10 setxy random-xcor random-ycor set shape "butterfly" set vision-radius hunter-vision-radius set life 100 set if-find-prey? false ] ;; 2) create invades create-turtles count-of-prey [ set robot-type "prey" set color red set size 10 setxy random-xcor random-ycor set shape "bug" set vision-radius prey-vision-radius set life 100 ] end to escape ask turtles with [robot-type = "prey"] [ ifelse (life > 0 ) [ find-escape-direction adjust-heading-when-in-edge let Nearist-Turtles-List (turtles-on (patches in-radius prey-vision-radius)) with [(robot-type = "hunter") and (life > 0 )] draw-sensor-vision-field 5 ifelse ((count Nearist-Turtles-List) > 0) [ fd prey-escape-speed * (life / 100) ] [ ifelse ( (random 10) = 0 ) [ fd prey-escape-speed * (life / 100) ] [ fd prey-normal-speed * (life / 100) ] ] if (if-show-vision-filed? = true ) [ draw-sensor-vision-field 66 ] ] ;; else : life = 0 , when prey is dead [ set label "Die!" set label-color red set heading 90 ] ] end to capture ask turtles with [ (robot-type = "hunter") ] ;; [ ifelse (life > 0 ) [ find-capture-direction adjust-heading-when-in-edge ;;draw-sensor-vision-field 5 let count-prey-in-vision count ( (turtles in-radius hunter-vision-radius ) with [(robot-type = "prey") and (life > 0)] ) draw-sensor-vision-field 5 ifelse (count-prey-in-vision > 0 ) [ fd hunter-capture-speed * (life / 100) ] [ ifelse (random 10 = 0 ) [ fd hunter-capture-speed * (life / 100) ] [ fd hunter-normal-speed * (life / 100) ] ] if (if-show-vision-filed? = true ) [ draw-sensor-vision-field 66 ] ] [ set label "Die!" set label-color red set heading 90 ] ] end to find-capture-direction let temp-xcor 99999 let temp-ycor 99999 let temp-distance 99999 let tempHeading 99999 let capture-prey-distance 99999 let prey-who 99999 let count-prey-in-vision count ( (turtles in-radius hunter-vision-radius ) with [(robot-type = "prey") and (life > 0) ]) ifelse (count-prey-in-vision = 0 ) ;; if not find any prey or prey's life = 0 [ if ( (random 100) < 1 ) [ set heading ( heading + (-1)^(random 2) * 40) mod 360 ] set if-find-prey? false ] ;; else : select one active prey as capture target [ ask one-of (turtles in-radius hunter-vision-radius) with [(robot-type = "prey") and (life > 0 )] ;; select one prey randomly , rather than select the nearest;; ;may can be improved [ ;; //////////////////////;may can be improved///////// set temp-ycor ycor set tempHeading heading set capture-prey-distance distance turtle who set prey-who who ] set prey-xcor temp-xcor set prey-ycor temp-ycor set prey-heading tempheading set if-find-prey? true face turtle prey-who ] end to find-escape-direction let MinDistance 99999 let temp-heading heading let Nearist-Turtles-List (turtles-on (patches in-radius prey-vision-radius)) with [(robot-type = "hunter") and (life > 0 ) ] ;; judge if exists hunters in vision field ;; if the prey finds hunter(s) in it's vision field, find the nearist neighbor and learn its heading ifelse ((count Nearist-Turtles-List) > 1 ) [ ask Nearist-Turtles-List [ if ( (distance myself != 0 ) and (distance myself < MinDistance ) ) [ set MinDistance (distance myself) set temp-heading heading ] ] ] ;; else : if the prey can not find any hunter, flies freedomly [ if ((random 100) < 1) [ set temp-heading ( heading + (-1)^(random 2) * 40) mod 360] ] set heading temp-heading end to escape-and-capture escape Hunter-commincate Hunter-Coordinate capture life-change end to life-change let is-captured? false ask turtles with [robot-type = "prey"] [ ask patch-here [ ;; if in the patch where the prey is , there exists hunter, then the prey is caputured if (count (turtles-here with [(robot-type = "hunter") and (life > 0)]) > 0 ) [ set is-captured? true ask turtles-here with [(robot-type = "hunter") and (life > 0)] [ set life life - 1 ] ] ] if is-captured? [ set life life - 1 ] set is-captured? false ;; judge the next prey, so reset is-captured? to false ] end to draw-sensor-vision-field [ field-color ] let tempi 0 while [tempi <= 360] [ let temp-patch ( patch-at-heading-and-distance tempi vision-radius) if (temp-patch != nobody) [ask temp-patch [set pcolor field-color ] ] set tempi tempi + 10 ] end to Hunter-commincate ask turtles with [ (robot-type ="hunter") and (life > 0) ] [ ;; get active prey List in the hunter's vision field let preyList-in-vision-field (turtles in-radius hunter-vision-radius) with [(robot-type ="prey") and (life > 0)] ;; if there exists active preys in the hunter's vision field, if ( count preyList-in-vision-field > 0 ) [ let temp-prey-who 99999 ;; select one active prey from the preyList ask one-of preyList-in-vision-field [ set temp-prey-who who ] ;; broadcast the prey's infomation to the hunter's neighbors in it's vision field ask turtles in-radius hunter-vision-radius with [(robot-type ="hunter") and (life > 0)] [ set if-find-prey? true face turtle temp-prey-who ] ] ] end to adjust-heading-when-in-edge ;; when turtle in edge (left Boundary, right Boundary, up Boundary, down Boundary), adjust it's heading if (abs(xcor) < 0.5) and (heading > 179) ;; in left boundary and goes on to the left [ set heading random 180 ] if (xcor > Max-pxcor - 1) and (heading < 180) ;; ;; in right boundary and goes on to the right [ set heading ( 180 + random 180) ] if (abs(ycor)< 0.5 ) and (heading > 90 and heading < 270) ;; ;; ;; in down boundary and Continue to go down [ let tempi random 2 ifelse (tempi = 0 ) [ set heading random 90 ] [ set heading random (360 - random 90) ] ] if (ycor > Max-pycor - 1) and ( (heading >= 0 and heading < 90) OR ( heading > 270 and heading <= 360) ) [ ;; in up boundary and Continue to go up set heading (90 + random 180) ] end ; to Hunter-Coordinate end
There is only one version of this model, created over 9 years ago by zengzhen shao.
Attached files
File | Type | Description | Last updated | |
---|---|---|---|---|
CoRobat.png | preview | Preview for 'CoRobat' | over 9 years ago, by zengzhen shao | Download |
This model does not have any ancestors.
This model does not have any descendants.