生态模拟,如何比较矩阵中的多个数字来做出决策

时间:2012-05-16 18:37:50

标签: r matrix

在我正在开发的生态模拟过程中,我遇到了一个问题。我在下面附上了一些代码来强调这个问题。总之,我们说我有3个不同质量的地点。动物想要移动到最高质量的位置(数字越高,质量越高),但无法区分相差小于或等于0.1的质量(这是较大循环的一部分,因此这个过程将得到重复了数千次。)

例如,在这种情况下(个人从位置#2开始):

a<-matrix(c(1,2,3,.6,.9,.7),nrow=2,ncol=3,byrow=TRUE)
attributes(a)$dimnames<-list(c("Location","Quality"),c())
a

          [,1] [,2] [,3]
Location  1.0  2.0  3.0
Quality   0.6  0.9  0.7

个人会清楚地将2号位置视为最佳位置,并留在那里。

在这种情况下(个人从位置#2开始):

a<-matrix(c(1,2,3,.5,.7,.8),nrow=2,ncol=3,byrow=TRUE)
attributes(a)$dimnames<-list(c("Location","Quality"),c())
a

          [,1] [,2] [,3]
Location  1.0  2.0  3.0
Quality   0.5  0.7  0.8

个人无法清楚地辨别位置#2和#3的质量(因为差异需要至少检测到0.1),这将触发替代行为(可能涉及到个人)留在#2,或评估此示例中不存在的更多位置)。但是,我需要知道位置#2和#3的质量接近,而位置#1作为选项被淘汰。

在这种情况下(再次,从位置#2开始)

a<-matrix(c(1,2,3,.9,.7,.6),nrow=2,ncol=3,byrow=TRUE)
attributes(a)$dimnames<-list(c("Location","Quality"),c())
a
         [,1] [,2] [,3]
Location  1.0  2.0  3.0
Quality   0.9  0.7  0.6

个人将从位置2移动到位置1.

在这种情况下(再次,从位置#2开始)

a<-matrix(c(1,2,3,.8,.7,.6),nrow=2,ncol=3,byrow=TRUE)
attributes(a)$dimnames<-list(c("Location","Quality"),c())
a
         [,1] [,2] [,3]
Location  1.0  2.0  3.0
Quality   0.8  0.7  0.6

个人将根据其与位置#1的差异消除位置#3,并且无法选择停留在#2或移至#1

我试图弄清楚如何编写一个代码来比较位置的相对质量,如果个人无法区分位置(如果是,哪些是在两者之间选择),或者如果一个位置显然更大(如果是这样,它需要返回位置编号,以便我可以将个人移动到另一个矩阵中的该位置)。

1 个答案:

答案 0 :(得分:0)

我建议为Location创建一个类。我不知道你怎么会在r中这样做,但我相信你可以把这部分搞清楚。

这是我建议的算法:

  • 对于每个位置,对于每个其他位置,如果有机体可以判断质量的差异,则将排名较低的一个标记为“坏”(可能使用布尔数组;不要在对象内使用标记,因为这违反了良好的设计)
  • 在for循环中,如果您抓住标有标记的位置,请使用continue语句,以节省时间。
  • 现在,再次浏览列表,并将所有没有标记标记的列表复制到新列表中。
  • 检查列表的长度并在决策中使用它。