3

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

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

4

1 回答 1

0

我建议为位置创建一个类。我不知道您将如何在 r 中执行此操作,但我相信您可以解决这个问题。

这是我建议的算法:

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