如何在 netlogo 中构造一个字符串输入到方程中

How to construct a string input into equation in netlogo

我需要解析字符串以从列表中获取值。即假设我有三个列表,L-utility、g-utility、grp-utility。这些列表中的每一个都包含代理在时间点 i 的本地、全局和组级别属性的值。我希望用户输入效用随时间变化的方程式,例如变化方程式可以是 L1 + L3*L4/G3。为了评估这个字符串,L1 应该是 l-utility 的第 1 项,L3 应该是 l-utility 的第 3 项,G3 应该是 g-utility 列表的第 3 项。请指导我该怎么做。解析此字符串后,我可以使用 运行-result 进行评估。

这很棘手,这是一种应该有效但非常不灵活的方法。最重要的是,它依赖于字符串 space 间隙 (" ") 来解析字符串输入中的不同单位,因此您的输入格式必须是 "L1 + G2 + GRP3"- 您不能缺少 spaces 或字母和数字之间额外的 spaces。

globals [ L-utility G-utility GRP-utility calc-val ]

to setup
  ca
  reset-ticks
  set L-utility [ 1 2 3 4 5]
  set G-utility [ 40 50 60 70 80 ]
  set GRP-utility [ 777 889 999 1111 2222 ]

end

to splitstring-calc 

  let tokens.list []
  let to.parse string-input
  let built.string "" 

  let full.len length to.parse
  let shortened length remove " " to.parse
  let space.count full.len - shortened
  let token.count ( space.count + 1 )
  let items.list ( range 0 token.count )
  let substart 0
  let subend position " " string-input

  foreach ( range 0 token.count ) [ 
    i ->
    ifelse position " " to.parse != false [
      set subend position " " to.parse
    ]
    [
      set subend length to.parse
    ]
    let cur.token substring to.parse substart subend
    set tokens.list lput ( remove " " cur.token ) tokens.list
    set to.parse substring to.parse ( subend ) ( length to.parse )
    if length to.parse > 0 and item 0 to.parse = " " [
      set to.parse remove-item 0 to.parse
    ]      
  ]

  foreach tokens.list [
    i -> 
    ifelse member? i "+ - / * ( ) " [
      set built.string ( word built.string " " i " " )
    ]
    [
      let l.name substring i 0 (length i - 1)
      let l.num last i
      set built.string ( word built.string " item " l.num " " l.name "-utility " )
    ]
  ]

  set built.string remove-item 0 built.string
  print built.string
  set calc-val run-result built.string    

end

然后您可以使用 "string" 类型的输入框来编写方程式,它应该可以工作:

请注意,如果您想添加比我更多的运算符,您应该能够将它们添加到 "+ - / * ( )" 字符串中。