Netlogo: идентифицировать все исправления за пределами линейной функции

Предпосылки. Я моделирую выбор территории в NetLogo. Черепахи занимают ландшафт, разделенный дорогами. Каждая черепаха выбирает центр своей территории, а затем строит территорию. Черепаха выбирает участки для своей территории по стоимости владения, которая основывается на расходах на еду и дорожных расходах. Транспортные расходы включают расстояние, а также необходимость перехода дороги для достижения участка.

Цель: я хочу, чтобы каждая черепаха идентифицировала все участки, на которых необходимо перейти дорогу, чтобы добраться до участка из центра территории. Затем черепаха должна назначить этим заплатам более высокую стоимость. Каждая черепаха будет занимать отдельную часть ландшафта, поэтому эти затраты будут индивидуальными для каждой черепахи. Как это можно сделать?

Пример: это пейзаж с двумя черепахами:  введите описание изображения здесь

Пример кода: я добавил несколько строк, чтобы понять, как можно приблизиться к способу удержания дорожных расходов для каждой черепахи, но не знаю, как они будут рассчитаны и есть ли лучший способ удерживать эту информацию при застройке территорий:

patches-own
[ owner  ;; turtle who claims patch for territory
  benefit  ;; i.e., food 
  primary-feature  ;; either "road" or null

  ;; Need a way to calculate and remember road-related patch costs for each turtle,
  ;; which are based on whether the turtle must cross a road to reach the patch. 
  ;; Perhaps this could be a patch variable tied to each turtle as follows:
  road-costs-to-turtle-1 
  road-costs-to-turtle-2 
  ;; etc...? If so, these would be calculated after turtle chooses a territory center.
]

turtles-own
[ start-patch  ;; my territory center
  destination  ;; my next patch to claim
  territory  ;; patches I own
]

to go
     pick-center
     pick-patch
end    

to pick-center
     setxy random-xcor random-ycor
     set start-patch (patch-here)
     ;; Turtle selects a patch for its territory center. Turtle will next need
     ;; to calculate costs for patches based on whether a patch requires crossing 
     ;; a road to reach it. I'm at a loss for how to identify all patches beyond 
     ;; roads from the turtle's perspective, however.
end

to pick-patch
    if patch-here = start-patch [ set destination highest-value ]
    ;; Turtle travels to and adds patches to its territory once reaches destination.
end

to-report highest-value            
     let available-destinations (patch-set [neighbors4] of territory) with [owner = nobody]   
     report max-one-of available-destinations ([benefit-to-me / cost-to-me]) 
end

to-report benefit-to-me
     report benefit ;; i.e., food value of patch
end

to-report cost-to-me
     let road-cost ;;<--??? 
     ;; Not sure how to identify if patches are past a road and thus costlier.
     ;; If this is a patches-own variable, then the coding may be something like:
     if who = 1 [let road-cost road-cost-to-turtle-1] ;; etc. 

     report distance [start-patch] of myself + road-cost
end

person User847462    schedule 11.07.2017    source источник
comment
Вы уже знакомы с расширением ГИС? Если вы работаете с полигонами, вы можете защитить то, что находится внутри и снаружи.   -  person delaye    schedule 12.07.2017


Ответы (1)


Хотя предложение использовать ГИС - хорошее предложение, я подумал, что вам также может понадобиться способ обойтись без этого. Один простой, но требовательный к вычислительным ресурсам способ сделать это - «выращивать» территорию черепахи до тех пор, пока она не перестанет двигаться дальше:

to-report claim-territory [ current-territory ]
  let territory-size count current-territory
  ; Combine all non-road neighbors of the current territory with the current territory
  set current-territory (patch-set
    current-territory
    ([ neighbors4 with [ primary-feature != "road" ] ] of current-territory)
  )
  ifelse count current-territory > territory-size [
    report claim-territory current-territory
  ] [
    report current-territory
  ]
end

Это сообщит обо всех исправлениях, связанных с теми в current-territory, которые не переходят дорогу. Затем вы вызываете это так, после вызова pick-center:

set territory claim-territory (patch-set start-patch)

Затем, чтобы узнать стоимость патча:

to-report cost [ target-patch ]
  ifelse member? target-patch territory [
    ; Compute and report cost of in territory patch
  ] [
    ; Compute and report cost of out of territory patch
  ]
end

Если это требует слишком больших вычислительных ресурсов, дайте мне знать, и я могу обсудить оптимизацию.

person Bryan Head    schedule 13.07.2017