如何在 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" 类型的输入框来编写方程式,它应该可以工作:
请注意,如果您想添加比我更多的运算符,您应该能够将它们添加到 "+ - / * ( )"
字符串中。
我需要解析字符串以从列表中获取值。即假设我有三个列表,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" 类型的输入框来编写方程式,它应该可以工作:
请注意,如果您想添加比我更多的运算符,您应该能够将它们添加到 "+ - / * ( )"
字符串中。