If statement Netlogo:通过对其他行/列进行条件化来替换矩阵元素
我在Netlogo工作,负责制作大量使用矩阵的一系列模型。简单地说,这些模型包括不同品种的许多状态变量,其中状态变量通常是类似股票的项目。作为一个简单的例子,考虑模型:If statement Netlogo:通过对其他行/列进行条件化来替换矩阵元素,if-statement,matrix,netlogo,If Statement,Matrix,Netlogo,我在Netlogo工作,负责制作大量使用矩阵的一系列模型。简单地说,这些模型包括不同品种的许多状态变量,其中状态变量通常是类似股票的项目。作为一个简单的例子,考虑模型: extensions [ matrix ] globals [ ] turtles-own [ n-items stock-list ] to setup clear-all reset-ticks create-turtles 2 ask turtles [ setxy rando
extensions [ matrix ]
globals
[
]
turtles-own
[
n-items
stock-list
]
to setup
clear-all
reset-ticks
create-turtles 2
ask turtles
[
setxy random-xcor random-ycor
set n-items 10
let n-vars 3
set stock-list matrix:make-constant n-items n-vars [0] ; empty matrix
let stock-item n-values n-items [i -> i]
let stock-cost n-values n-items [ random-normal 10 2 ]
let stock-age n-values n-items [ random 50 ]
matrix:set-column stock-list 0 stock-item
matrix:set-column stock-list 1 stock-cost
matrix:set-column stock-list 2 stock-age
]
end
在这里,每个海龟的矩阵库存列表
被初始化为一个空矩阵,然后根据变量库存项目
(库存id)、库存成本
和库存年龄
填充其列
想象一个go
过程,每一个时间步增加一个库龄:
to go
ask turtles
[
let current-age matrix:get-column stock-list 1
let new-age map [x -> x + 1] current-age
matrix:set-column stock-list 2 new-age
]
tick
end
我想做的是,仅当年龄大于某个值(例如10)时,才对库存成本进行操作
;; pseudo-code
for( i = 1 to I = number of items )
{
if ( stock-age[i] > 10 )
{
stock-cost[i] - 1
}
}
我知道如何使用映射
原语,以自身的值为条件更改库存成本列表,例如:
to decrease-stock-value
ask turtles
[
let current-cost matrix:get-column stock-list 1
set current-cost map [[?] -> ifelse-value (? > 10) [? - 1][?]] current-cost
matrix:set-column stock-list 1 current-cost
]
但我将其推广到使用不同列表中的值作为条件的努力失败了
谢谢你的帮助!此外,任何关于这是否是建模股票等状态变量的好方法的见解都是有用的 我想我是用以下方法整理出来的:
to decrease-stock-value
ask turtles
[
let current-cost matrix:get-column stock-list 1
let current-age matrix:get-column stock-list 2
let new-cost ( map [ [ a b ] ->
ifelse-value ( a > 10 ) [ b - 1 ] [ b ] ]
current-age current-cost
)
matrix:set-column stock-list 1 new-cost
]
end