我曾经有以下有效的代码:
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也不起作用。我可以禁用此问题向导吗?谢谢!
最大
答案 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的变量,然后对该变量进行排序。