Как исправить этот цикл, команда foreach добавляет все переменные, которые не должны - PullRequest
0 голосов
/ 18 января 2019

Раньше у меня работал следующий код:

to build-pipeline-32
    ask storage 32
  [ifelse subsidy-port - pipeline-cost-extensible > 0
    [set pipeline 1]
    [set pipeline 0]
  ]
  ask storage 32
  [ifelse pipeline > 0
    [set subsidy-port subsidy-port - pipeline-cost-extensible]
    [set subsidy-port subsidy-port]
  ]
  ask storage 32
  [if pipeline = 1
    [create-link-from port 25]
 ]
end

to build-pipeline-33
    ask storage 33
  [ifelse subsidy-port - pipeline-cost-extensible > 0
    [set pipeline 1]
    [set pipeline 0]
  ]
  ask storage 33
  [ifelse pipeline > 0
    [set subsidy-port subsidy-port - pipeline-cost-extensible]
    [set subsidy-port subsidy-port]
  ]
  ask storage 33
  [if pipeline = 1
    [create-link-from port 25]
  ]
end

Теперь я попытался сократить это, потому что это заняло так много строк кода:

to build-pipeline
  foreach sort-on [who] storages
  [ifelse subsidy-port - pipeline-cost-extensible > 0
    [set pipeline 1]
    [set pipeline 0]
  ]
  foreach sort-on [who] storages
  [ifelse pipeline > 0
    [set subsidy-port subsidy-port - pipeline-cost-extensible]
    [set subsidy-port subsidy-port]
  ]
  foreach sort-on [who] storages
  [if pipeline = 1
    [create-link-from port 25]
  ]
end

По какой-то причине это полностью портит значения субсидий. Верхняя часть (настройка значения конвейера) и нижняя часть (создание ссылки) работают. Как я могу это исправить?

Еще один вопрос: по какой-то причине переполнение стека заставляет меня использовать мастер справки по вопросам, который очень раздражает, потому что я не могу просто выбрать кусок скопированного кода и отформатировать его как код в вопросе (с параметром {}). Для этого вопроса мне пришлось сделать отступы 4 пробела вручную для каждой строки ... Взял навсегда. Cmd + K тоже не работает. Могу ли я отключить этот вопрос мастера? Спасибо !!

Max

1 Ответ

0 голосов
/ 21 января 2019

Причина, по которой ваша модель вычитает 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 для каждого хранилища и вместо этого отсортировать по этой переменной.

...