如何修复此循环,foreach命令会添加所有不应包含的变量

时间:2019-01-18 13:36:23

标签: netlogo

我曾经有以下有效的代码:

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也不起作用。我可以禁用此问题向导吗?谢谢!

最大

1 个答案:

答案 0 :(得分:1)

您的模型减去管道成本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

在您的评论中,您指出管道扩展有一个值得考虑的顺序。在NetLogo中使用who几乎总是不好的编码。变量who仅是创建存储的顺序,将其束之高阁将消除所有灵活性。如果以后您想要不同的功绩计算会怎样? who无法更改。您可能想要的是为每个存储分配一个名为merit的变量,然后对该变量进行排序。