Переместите черепаху на участок с соседями из той же черепахи и оставайтесь там - PullRequest
1 голос
/ 02 марта 2020

Я пытался переместить черепаху к участку, где есть 2 черепахи того же типа (например, доход), что и их сосед, и остался там. Я сделал следующий код

 to set-move
let target []

 ask turtles with [income = "low"]
 [ let potential-target1 patches with [value < buymiddle and any? turtles-here = false]
   set target potential-target1 with [length remove-duplicates [any? turtles-here with [income = "low"]] of neighbors = 2]
   set target min-one-of potential-target1 [value]
    if target != nobody and any? turtles-on neighbors 
    [ move-to target ask patch-here [set empty false]]]

, но, похоже, не работает. Некоторые черепахи все еще передвигаются после выбора патча. Некоторые черепахи не выбирают патч, где есть два соседа его группы. Как указать патч с двумя соседями определенных групп черепах?

breed [agens agen]

patches-own [value
empty]
turtles-own [income
            myHouses
            ]
to setup
ca


 ;;Check inputs
 let total-prob prob-low + prob-mid + prob-high
 if (total-prob != 100 )
 [
     print (word "Adoption types must sum to 100, but instead sum to " total-prob)
     stop
 ]

   ask patches [set value random-normal 10 3]

   ask patches [ifelse (value < 8)[ set pcolor green  ]
 [ifelse (value < 11)[ set pcolor blue]
[if value < 15[ set pcolor gray]]]]



end

to go
 ask patches [
 if random 100 < 3 [sprout-agens 1 [set color red
     set shape "default"
     set size 1
     set-income
     set-move]]]

 end

 to set-move
let target []

 ask turtles with [income = "low"]
 [ let potential-target1 patches with [value < buymiddle and any? turtles-here = false]
   set target potential-target1 with [length remove-duplicates [any? turtles-here with [income = "low"]] of neighbors = 2]
   set target min-one-of potential-target1 [value]
    if target != nobody and any? turtles-on neighbors 
    [ move-to target ask patch-here [set empty false]]]


ask turtles with [income = "middle"]
 [ let potential-target2 patches with [(value > buymiddle and value < buyhigh) and any? turtles-here = false]
   let target2 potential-target2 with [length remove-duplicates [any? turtles-here with [income = "middle"]] of neighbors = 2]
   set target2 min-one-of potential-target2 [value]
    if target2 != nobody and any? turtles-on neighbors 
    [ move-to target2 ask patch-here [set empty false]]]


ask turtles with [income = "high"]
 [ let potential-target3 patches with [(value > buyhigh) and any? turtles-here = false]
   let target3 potential-target3 with [length remove-duplicates [any? turtles-here with [income = "high"]] of neighbors = 2]
   set target3 min-one-of potential-target3 [value]
    if target3 != nobody and any? turtles-on neighbors 
    [ move-to target ask patch-here [set empty false]]]



end

to set-income
 let kind-prob (random 100)
 let cumulative-prob prob-low
 ifelse (kind-prob < cumulative-prob)[set income "low" set color red]
 [set cumulative-prob cumulative-prob + prob-mid
 ifelse (kind-prob < cumulative-prob)[set income "middle" set color pink ]
    [set cumulative-prob cumulative-prob + prob-high
      if income < cumulative-prob [set income "high" set color blue]
]]
end

1 Ответ

1 голос
/ 03 марта 2020

Давайте посмотрим на первую строку в блоке ask вашего первого сегмента кода.

let potential-target1 patches with [value < buymiddle and any? turtles-here = false]

совпадает с

let potential-target1 patches with [value < buymiddle and not any? turtles-here]

, так что ваш potential-target1 набор патчей не будет черепах. Это сделает последующие строки неактуальными. Но допустим, что мы делаем эту строку

let potential-target1 patches with [value < buymiddle and any? turtles-here]

В следующей строке

set target potential-target1 with [length remove-duplicates [any? turtles-here with [income = "low"]] of neighbors = 2]

[any? turtles-here with [income = "low"]] of neighbors выдает список из восьми значений true / false, true если соседний патч имеет какие-либо черепахи с income = low и ложью, если это не так. Затем вы уменьшаете количество дубликатов в этом списке и в итоге получаете либо один [true] (если все верно), либо один [false] (если все ложно), либо true и false [true false] или [false true] если некоторые верны, а некоторые ложны. Затем вы смотрите на число записей в этом сокращенном списке и сравниваете его с 2. Это произойдет, когда хотя бы у одного соседа есть такие черепахи, а у одного - нет. Я подозреваю, что это не то, что вы хотите. Если вы хотите, чтобы ровно в двух соседних заплатах была хотя бы одна черепаха с income = low, то что-то вроде

count neighbors with [any? turtles-here with [income = low]] = 2

должно сделать это. Если, с другой стороны, вы хотите, чтобы у соседей было ровно две черепахи с income = low, то вы бы хотели

neighbors with [count turtles-here with [income = low] = 2]

Мне не понятно, за кем вы находитесь.

Увидев вопрос ниже я понимаю, что Дуди ищет первую интерпретацию. Если это так, то поиск среди всех кандидатов патча с наименьшим value будет (как они сделали в своем исходном коде)

let potential-targets patches with [count neighbors with [any? turtles-here with [income = low]] = 2]
let target min-one-of potential-targets [value]

Надеюсь, это поможет вам начать, Чарльз

...