2017-09-04 96 views
1

我对Netlogo非常陌生,这是我在论坛中的第一篇文章。 我需要创建在栖息地或领土上移动的动物代理组。领土可以重叠。更确切地说,我需要在不同地区活动的男性特务和在其他地区活动的几组女性特务。如何在netlogo中为几组代理创建区域?

这是我到目前为止所做的。我为一组女性和一组男性创造了一个领土。那不完全是我需要的。

globals [fragments] 
breed [preys prey] 
breed [femaletigers femaletiger] 
breed [kids kid] 
breed [maletigers maletiger] 

turtles-own 
[ 
    energy 
    age 
    gender 
    territory 
] 

to setup 
    clear-all 
    setup-fragments 
    ;setup-habitats 
    setup-turtles 
    reset-ticks 
end 

to setup-fragments 

    ask patches[set pcolor 67] 
    repeat 50 
    [ 
    ask one-of patches 
    [ 
     set pcolor brown 
     repeat 30 
     [ 
     let a random 360 
     let b random 5 
     ask patch-at-heading-and-distance a b 
     [ 
      ask neighbors [ set pcolor brown] 
      set pcolor brown 
     ] 
     ] 
    ] 
    ] 
end 

to setup-turtles 

    set-default-shape femaletigers "default" ; default shape (dreieck) 
    create-femaletigers 10 
    [ 

    set color red 
    set size 1.5 
    set energy 100 
    set age random 20 
    set gender "female" 
    set territory patches-in-territory patch 10 6 15 
    move-to one-of territory with [pcolor = 67 ] ; tigers start in territory but not on fragmented areas 
    ] 

    set-default-shape maletigers "default" ; default shape (dreieck) 
    create-maletigers 10 
    [ 
    set color blue 
    set size 1.5 
    set energy random 100 
    set age random 20 
    set gender "male" 
    set territory patches-in-territory patch 40 15 10 
    move-to one-of territory with [pcolor = 67 ] ; tigers start in territory but not on fragmented areas 

    ] 


    set-default-shape preys "circle" 
    create-preys 100 
    [ 
    move-to one-of patches with [pcolor = 67] ;preys don't start in fragmented areas 
    set color 114 
    set size 0.75 
    ] 
end 

to-report patches-in-territory [Center rd] 
    let ptr [] 
    ask Center [set ptr patches in-radius 20] 
    report ptr 
end 

我很感激任何帮助。 Maria

回答

2

欢迎来到Stack Overflow。在此处发布时,通常将您的代码限制在证明您的问题所需的最低限度内(参见MCVE指南here);例如,你可以删除你的to-reportprey品种,只是为了使你很明显想要解决什么。

我没有完全遵循你的代码,因为我不确定你的总体目标 - 相反,我给出了另一个例子,希望能够说明一种方法来实现你的目标。在本例中,我将举例说明在这个例子中女性可以重叠的区域,以及在这个例子中男性不能重叠的区域。使用这些变量和设置:

breed [ femaletigers femaletiger ] 
breed [ maletigers maletiger ] 

turtles-own [ territory ] 
patches-own [ maleclaimed? ] 

to setup 
    ca 
    ask patches [ 
    set maleclaimed? false 
    ] 

    create-maletigers 3 [ 
    set shape "triangle" 
    set size 1.5 
    move-to one-of patches with [ maleclaimed? = false ] 
    pd 
    set territory patches in-radius 5 with [ maleclaimed? = false ] 
    ask territory [ 
     set maleclaimed? true 
    ] 
    ] 

    create-femaletigers 3 [ 
    set shape "square" 
    setxy random-xcor random-ycor 
    pd 
    set territory patches in-radius 3 
    hatch 1 + random 3 [ 
     rt random 360 
     fd 1 
    ] 
    ] 

    reset-ticks 
end 

在设置中,patches-own布尔表示,如果补丁已经成为一个以男性设置为false声称开始让男性可以检查的,因为它建立在其领土,补丁是否已被声明。然后,老虎们将自己的领土与您的做法相似,只有男性不会选择其他男性的领土。女性建立他们的领土,然后hatch更多的女性将分享“母亲”的领土。

在其领土内动,只是限制龟,使得他们只能搬到这里其领土patches-的一个是做的一个方法:

to go 
    ask turtles [ 
    let target one-of territory in-radius 1.5 
    if target != nobody [ 
     face target 
     fd 1 
    ] 
    ] 
    tick 
end 

如果你想确认海龟留在一个领土内运行类似于:

to territory-check 

    ask turtles [ 
    let col color + 2 + random 3 
    ask territory [ 
     set pcolor col 
    ] 
    ]  

end 
+0

非常感谢。迄今为止,这帮助很大。 但是现在女性用户在他们的领土上移动为“一个单位”。我需要他们在他们的领土上随意移动。 –

+0

你的意思是你的模型还是我的例子?在我的例子中,'femaletigers'为我独立移动。 –

+0

好的,这是我的模型中的一个错误,我可以修复它。谢谢。 –

0

再次感谢。什么时候老虎复制,我希望他们的孩子创造一个新territoy和领土不应该重叠?

to move-male 

    ask maletigers [ 
    let target1 one-of territory in-radius 2 
    if target1 != nobody [ 
    face target1 
    fd 1]] 

end 

to reproduce-tiger 

    if age >= 48 and any? maletigers-on patch-here and pcolor = 67 [ 
    hatch random 1 + random (5 - 1) [ 
    set gender one-of [ "male" "female" ] 
    set breed kids 
    fd random-float 2 ]] 

end 

to search-territory-male 

ask maletigers with [ territory = nobody ] [ 
    if maleclaimed? = false [ 
    set territory patches in-radius 18 with [ maleclaimed? = false ] 
    ask territory [ set maleclaimed? true ]]] 

end