【问题标题】:Ecological simulation, how to compare multiple numbers in a matrix to make a decision生态模拟,如何比较矩阵中的多个数字做出决策
【发布时间】:2012-05-16 18:37:49
【问题描述】:

我在开发生态模拟时遇到了一个问题。我在下面附上了一些代码来突出这个问题。总之,假设我有 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

个人会根据位置 #3 与位置 #1 的差异来消除位置 #3,并且无法选择留在 #2 还是搬到 #1

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

【问题讨论】:

  • 您需要查看cran.r-project.org/web/views/Spatial.html 并学习如何创建空间数据框架。矩阵不是将此任务推广到二维或更多维度的好选择。
  • 从问题来看,尚不清楚这是否是一个明确的空间模型。如果动物可以评估并移动到景观中的任何单元格,那么它们的空间排列就无关紧要了。另一方面,如果动物仅限于评估和在相邻细胞之间移动,那么位置确实很重要。了解每个位置的质量是否发生变化,或者它们的排名是否在整个模拟过程中保持不变也很有用。仅凭这个 sn-p 很难提供明确的建议。
  • 泰勒,感谢您的评论。这在空间上是明确的(目前有 20 个位置,但这可能会改变),并且随着个体在栖息地之间移动,“质量”衡量标准会经常变化。个人只能对相邻的补丁进行采样,而我对构建良好的所有问题都存在疑问。我现在可以确定一个人要比较的位置,并且可以以上述方式提取这些位置和质量。现在我已经确定了个人可以比较哪些补丁,我需要做的就是找出一种方法来做出上述决定

标签: r matrix


【解决方案1】:

我建议为 Location 创建一个类。我不知道你会如何在 r 中做到这一点,但我相信你可以弄清楚那部分。

这是我建议的算法:

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

【讨论】:

    猜你喜欢
    • 2013-08-08
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多