Причина, по которой ваша модель вычитает 12-кратную стоимость конвейера, заключается в том, что она создает 12 расширений конвейера, как только появляется доступный капитал. Вы не вычитаете стоимость до второго foreach
, но вы указываете, будет ли расширение построено в первом foreach
.
Я думаю, что вы хотите это (оно помещает изменение стоимости в то же самое [], что произойдет до тестирования следующего возможного расширения):
to build-pipeline
foreach sort-on [who] storages
[ ifelse subsidy-port - pipeline-cost-extensible > 0
[ set pipeline 1
set subsidy-port subsidy-port - pipeline-cost-extensible
create-link-from port 25
[ set pipeline 0
set subsidy-port subsidy-port ; has no effect, can be deleted
]
]
end
Кроме того, если единственной целью переменной конвейера является значение 1 или 0, указывающее, должно ли быть построено расширение, это еще проще:
to build-pipeline
foreach sort-on [who] storages
[ if subsidy-port - pipeline-cost-extensible > 0
[ set subsidy-port subsidy-port - pipeline-cost-extensible
create-link-from port 25
]
end
В своих комментариях вы указали, что существует ряд достоинств расширений конвейера. Почти всегда плохое кодирование использовать who
в NetLogo. Переменная who
- это просто порядок, в котором создаются хранилища, привязка к которому заслуживает, устраняет всю гибкость. Что произойдет, если позже вы захотите другой расчет заслуг? who
не может быть изменено. Вероятно, вам нужно назначить переменную с именем merit для каждого хранилища и вместо этого отсортировать по этой переменной.