Как избежать ошибки времени выполнения nobody в netlogo?

#runtime #netlogo

#время выполнения #netlogo

Вопрос:

Я проверяю взаимодействие между свойствами трех типов исправлений с помощью команды «один из соседей». Проблема возникает, когда в некоторых случаях два патча не соседствуют друг с другом и появляется объект NOBODY. Есть ли какой-либо способ избежать этого. Мне необходимо использовать команду ‘one-of neighbors’. Могу ли я дать команду, указывающую, что если никто не обнаружен, то значение свойства этого патча равно 0.1. В моем коде, приведенном ниже, проблема возникает при взаимодействии черно-желтого пятна и красного пятна, поскольку в некоторых местах красное не соседствует с желтым.

Я попытался написать команду Nobody, это было неправильно.Я ценю ваш совет.

 globals [ k ] ; interaction constant
patches-own [ a b c d' e' eeep deep ] ; state variables of properties
                       ; a is the Proportion and variety of Blend of land 
use
                       ; b is the Land uses with supportiveness for 
complimentary  activities
                       ; c is the Vehicular and Pedestrian Intensity
                       ; d is the Intensity of Nodes in urban web
                       ; e' is the Frequency of Enforced Vigilance
to setup
  clear-all
  set k initial-k
  setup-patches
  reset-ticks
end
to setup-patches
  ask patches [ set pcolor yellow ] ; defines the patches as built up in an area

  ; to define yellow patches without a and b
  ask patches [ if (pycor > 1) and (pycor < 8) and (pxcor = -3 ) [ set pcolor 46 ] ]
  ask patches [ if (pycor > 1) and (pycor < 8) and (pxcor = -2 ) [ set pcolor 46 ] ]
  ask patches [ if (pycor < -1) and (pxcor = -10 ) [ set pcolor 46 ] ]
  ask patches [ if (pycor < -1) and (pxcor = -9 ) [ set pcolor 46 ] ]
  ask patches [ if (pycor < -1) and (pxcor = -5 ) [ set pcolor 46 ] ]
  ask patches [ if (pycor < -1) and (pxcor = 2 ) [ set pcolor 46 ] ]
  ask patches [ if (pycor < -2) and (pxcor = 6 ) [ set pcolor 46 ] ]
  ask patches [ if (pycor > 1) and (pycor < 8) and (pxcor = 2 ) [ set pcolor 46 ] ]
  ask patches [ if (pycor = 2) and (pxcor > 8 ) [ set pcolor 46 ] ]
  ask patches [ if (pycor = -2) and (pxcor > 2 ) [ set pcolor 46 ] ]
  ask patches [ if (pycor = -3) and (pxcor > 6 ) [ set pcolor 46 ] ]
  ask patches [ if (pycor = -4) and (pxcor > 6 ) [ set pcolor 46 ] ]
  ask patches [ if (pycor = -8) and (pxcor > 6 ) [ set pcolor 46 ] ]
  ask patches [ if (pycor = -9) and (pxcor > 6 ) [ set pcolor 46 ] ]
  ask patches [ if (pycor = 7) and (pxcor > 8 ) [ set pcolor 46 ] ]
  ask patches [ if (pycor = 6) and (pxcor > 8 ) [ set pcolor 46 ] ]
  ask patches [ if (pycor = 2) and (pxcor > 2 ) and (pxcor < 6) [ set pcolor 46 ] ]

  ; to define road patches (horizontal)
 ask patches [ if pycor = 0 [ set pcolor grey ] ]
 ask patches [ if pxcor = 0 [ set pcolor grey ] ]
 ask patches [if pycor = 9 [ set pcolor grey ] ]
 ask patches [ if (pycor = 6) and (pxcor < -4 )[ set pcolor grey ] ]
  ask patches [ if (pycor = 3) and (pxcor < -4 ) [ set pcolor grey ] ]
  ask patches [ if (pycor = 4) and (pxcor > 3 ) [ set pcolor grey ] ]
  ask patches [ if (pycor = -6) and (pxcor > 7 ) [ set pcolor grey ] ]

  ; to define road patches (vertical)
  ask patches [ if (pycor > 0) and (pxcor = -10 ) [ set pcolor grey ] ]
  ask patches [ if (pycor > 0) and (pxcor = -5 ) [ set pcolor grey ] ]
  ask patches [ if (pycor < 0) and (pxcor = -7 ) [ set pcolor grey ] ]
  ask patches [ if (pycor < 0) and (pxcor = -3 ) [ set pcolor grey ] ]
  ask patches [ if (pycor < -3) and (pxcor = 4 ) [ set pcolor grey ] ]
  ask patches [ if (pycor > 3) and (pxcor = 4 ) [ set pcolor grey ] ]
  ask patches [ if (pycor > 0) and (pxcor = 7 ) [ set pcolor grey ] ]

  ; to define nodes as patches
  ask patches [ if pxcor = 0 and pycor = 0 [ set pcolor red ] ]
  ask patches [ if pxcor = 7 and pycor = 0 [ set pcolor red ] ]
  ask patches [ if pxcor = -3 and pycor = 0 [ set pcolor red ] ]
  ask patches [ if pxcor = -5 and pycor = 0 [ set pcolor red ] ]
  ask patches [ if pxcor = -7 and pycor = 0 [ set pcolor red ] ]
  ask patches [ if pxcor = -10 and pycor = 0 [ set pcolor red ] ]
  ask patches [ if pxcor = 4 and pycor = 4 [ set pcolor red ] ]
  ask patches [ if pxcor = 7 and pycor = 4 [ set pcolor red ] ]
  ask patches [ if pxcor = 7 and pycor = 9 [ set pcolor red ] ]
  ask patches [ if pxcor = 4 and pycor = 9 [ set pcolor red ] ]
  ask patches [ if pxcor = 0 and pycor = 9 [ set pcolor red ] ]
  ask patches [ if pxcor = -5 and pycor = 9 [ set pcolor red ] ]
  ask patches [ if pxcor = -10 and pycor = 9 [ set pcolor red ] ]
  ask patches [ if pxcor = -10 and pycor = 6 [ set pcolor red ] ]
  ask patches [ if pxcor = -10 and pycor = 3 [ set pcolor red ] ]
  ask patches [ if pxcor = -5 and pycor = 6 [ set pcolor red ] ]
  ask patches [ if pxcor = -5 and pycor = 3 [ set pcolor red ] ]

  ; to set intial values of properties for patches
  ask patches with [pcolor = yellow] [ set a random-float 0.9] ; initial a
  ask patches with [pcolor = yellow] [ set b random-float 0.9] ; initial b
  ask patches with [pcolor = grey] [ set c random-float 0.9] ; initial c
  ask patches with [pcolor = red] [ set d' random-float 0.9] ; initial d'
  ask patches with [pcolor = grey] [ set e' random-float 0.9] ; initial e'
end
to go
  tick
  if ticks >= 52 [ stop ]
  ask patches with [pcolor = yellow]
  [
    let fc [c] of one-of neighbors with [pcolor = grey] ; reports c of any 
 one grey patch of neighbours
    let fe' [e'] of one-of neighbors with [pcolor = grey] ; reports e' of any one grey patch of neighbours
    let fd' [d'] of one-of neighbors with [pcolor = red]; reports d' of any one red patch of neighbours
    if a < 0.1 [ set a 0.1
    if a > 0.9 [ set a 0.9 ] ]
    if b < 0.9 [ set b b   (k * a)   (k * fc)   (k * fd')
    if b > 0.9 [ set b 0.9 ] ]
    if b > 0.1 [ set b b - (k * fe')
    if b < 0.1 [ set b 0.1 ] ]
  ]
 end
  

Ответ №1:

Я предполагаю, что часть кода, вызывающая ошибку, является (для дальнейшего использования полезно, если вы попытаетесь сосредоточиться на части кода, которая вызывает проблему):

 ask patches with [pcolor = yellow]
  [ let fc [c] of one-of neighbors with [pcolor = grey]
    let fe' [e'] of one-of neighbors with [pcolor = grey]
    let fd' [d'] of one-of neighbors with [pcolor = red]
    ...
  ]
 end
  

Вам нужен примитив any? . Итак, вы могли бы переписать:

 let fc [c] of one-of neighbors with [pcolor = grey] 
  

как

 let greys neighbors with [pcolor = grey]
let fc 0.1
if any? greys
[ set fc [c] of one-of greys ]
  

В качестве альтернативы

 let greys neighbors with [pcolor = grey]
let fc ifelse-value any? greys
[ [c] of one-of greys ]
[ 0.1 ]
  

Обратите внимание, что ни один из этих фрагментов кода не тестируется.

Комментарии:

1. Большое вам спасибо. Я попробую. 🙂