NetLo go - расчет и составление отчетов об аренде участков в определенном радиусе вокруг радиуса движения агента - PullRequest
2 голосов
/ 11 марта 2020

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

Резюме

Я разрабатываю модель землепользования с лесным миром и черепахами, которые способны превращать лес в урожай земельные участки. Черепахи (в данном конкретном случае c компаний) могут перемещаться к месту назначения в пределах своего диапазона мобильности и очищать лес в радиусе вокруг себя (чтобы превратить его в пахотную землю). Цель состоит в том, чтобы компании выбирали свои патчи назначения на основе прогнозируемой прибыли от преобразования патчей вокруг них, то есть, принимая экономические решения относительно того, куда двигаться в ландшафте. Прибыль (или арендная плата за землю в моей модели) является функцией стоимости конверсии, затрат на обслуживание и потенциальных штрафов, вычитаемых из доходности патча. Таким образом, идеальный патч назначения - это патч, кластер патчей вокруг которого имеет наибольшую сумму прогнозируемой прибыли. Я сделал небольшую цифру, чтобы помочь визуализировать концепцию: концепция кластерной прибыли в радиусе

Что я делал до сих пор Пока у меня есть следующие процедуры, относящиеся к поиск максимального размера платы за аренду земли: 1) перемещение компаний к участку с максимальной прогнозируемой арендной платой за землю 2) представление отчета о максимальной прогнозируемой арендной плате за землю с использованием функции отчета. Я также попытался использовать функцию ask-patches, но безрезультатно. Патчи имеют штраф, связанный с ними, в зависимости от того, являются ли они частью защищенной области, и могут принадлежать определенному субъекту (в зависимости от того, где они находятся и кто их конвертирует).

Задача / цель Мне нужна структура, которая запрашивает каждый участок в пределах данного радиуса черепахи (компании) для расчета арендной платы за каждый участок в другом заданном радиусе. Другими словами, я хочу, чтобы черепаха могла сказать: если я go к этому патчу xy, который находится в моем радиусе движения, я получу максимальную арендную плату за конвертирование всех патчей вокруг этого патча xy. Приведенный ниже код не выдает никаких сообщений об ошибках, но из-за поведения черепах он тоже не работает правильно. Черепахи перемещаются по миру случайным образом и напрямую попадают в защищенные районы (налагают большие штрафы за вторжение), что приводит к их банкротству go.

Любые мысли и идеи очень ценятся!

patches-own
owned-by                  ;; "R" indicated it's unoccupied forest
protected-area            ;; whether the patch is part of a protected area 
encroachment-fine         ;; the $-amount a turtle is fined for converting this patch of forest

GUI inputs
company-conversion-radius ;in what radius around themselves companies can convert land


to move-to-max-rent-C
    ifelse any? patches in-radius (company-conversion-radius * 2 - 1) with [owned-by = "R"] [ ;here, companies 'scan' their environment for any patches that have forest (expressed through owned-by = "R"), if there are forested patches, companies move to the destination-patch that promises the highest profit (land-rent)   
      let destination-C max-rent-C
      move-to destination-C
    ]

;; if no forest patch within their scanning-radius, they face the nearest forest patch anywhere and move towards it
  [
    face min-one-of patches with [owned-by = "R"] [distance myself]
    move-to patch-ahead company-conversion-radius                                      
     ]                                                                                  
end

to-report max-rent-C
  ask patches in-radius (company-conversion-radius * 2 - 1) [
    let available-conversion-patches count patches in-radius company-conversion-radius with [owned-by = "R"]                  
    report max-one-of patches in-radius company-conversion-radius with [owned-by = "R"] [;;formula for calculating land rent] 
  ]
end

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

Большое спасибо уже!

Ура, Мариус

Ответы [ 2 ]

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

при условии, что радиус одинаков для всех компаний, я бы, вероятно, имел каждый патч со своим значением в качестве переменной. тогда вы можете просто выбрать тот, который имеет наибольшее значение в отдельной функции. Также кажется, что диапазон Movemtent для компаний теперь равен диапазону конверсии. Я ожидал бы, что это будут разные вещи, поэтому я бы использовал разные имена, даже если они имеют одинаковое значение. Я разделил это в своем коде, чтобы сделать его более понятным. Вы также должны знать, что то, что вы спрашиваете, может быть вычислительно дорогим. если N компаний спрашивают у M заплаток, каково объединенное значение P окружающих патчей, вы выполняете N * M * P вычислений. если ваша программа работает медленно, это, вероятно, является причиной этого.

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

to update-value
  ask turtles [ 
    ask patches in-radius company-movement-range [ 
      set HQ-value 0
      ask patches in-radius company-conversion-radius [ 
      ;...
1 голос
/ 11 марта 2020

Ты почти там (я думаю). Я не могу запустить ваш код, но после его прочтения процедура max-rent- C правильно идентифицирует патч в заданном радиусе, который возвращает наилучшую прибыль. Ваша проблема в том, что вы не правильно называете эту процедуру. Представьте, что черепаха находится в патче A и имеет возможность перейти к патчу B, но хочет выбрать B, который приносит наибольшую прибыль. Что нужно сделать этой черепахе, так это представить себя на всех возможных патчах B и рассчитать прибыль от всех патчей вокруг нее, находясь в этом месте. Это то, что вы сказали в своем вопросе, но повторяя его для ясности.

Таким образом, вместо того, чтобы спрашивать у А о максимуме, он должен найти максимум, который дает максимум.

Вместо :

let destination-C max-rent-C

попробовать:

let potential-destinations patches in-radius (company-conversion-radius * 2 - 1) with [owned-by = "R"]
let destination-C max-one-of potential-destinations [max-rent-C]
...