用R(西北角法)建模运输算法

时间:2014-10-11 16:22:42

标签: r

我是R的新手,我使用R(西北角法)编码运输问题如下。每次我运行R脚本给我

Error in if (requir[y] > supply[x]) { : 
missing value where TRUE/FALSE needed
In addition: Warning message:
In unit[x][y] = supply[x] :
number of items to replace is not a multiple of replacement length

错误消息和警告消息。请帮我调试代码。

#cost data
cost=matrix(c(6,11,16,9,10,12,16,7,10),nrow=3,ncol=3)

#matrix to store amount flow between destinations
unit=matrix(c(0,0,0,0,0,0,0,0,0),nrow=3,ncol=3)
supply=c(200,200,200)

requir=c(150,200,250)

cost_minimum=0

x=1
y=1
while(x<4 & y<4){
    if(requir[y]>supply[x]){
        unit[x][y]=supply[x]
        requir[y]=requir[y]-unit[x][y]
        supply[x]=supply[x]-unit[x][y]
        cost_minimum=cost_minimum+unit[x][y]*cost[x][y]
        x=x+1
    }

   if(requir[y]<supply[x]){
      unit[x][y]=requir[y]
      requir[y]=requir[y]-unit[x][y]
      supply[x]=supply[x]-unit[x][y]
      cost_minimum=cost_minimum+unit[x][y]*cost[x][y]
       y=y+1
   }

  if(requir[y]==supply[x]){
      unit[x][y]=requir[y]
      requir[y]=requir[y]-unit[x][y]
      supply[x]=supply[x]-unit[x][y]
      cost_minimum=cost_minimum+unit[x][y]*cost[x][y]
      y=y+1
      x=x+1
   }
} 

2 个答案:

答案 0 :(得分:2)

首先,Stack Overflow不是一般的代码调试服务。您应该询问一个特定的编程问题,并提供一个最小的示例,清楚地重新创建并演示您所面临的问题。你显然还没有发现错误。

但是你的问题与任何流量算法无关;你只是有基本的语法和逻辑问题。你正在索引matirixes错误

#wrong
unit[x][y]
#right
unit[x, y]

其次,在if条件中,您可以增加xy。然后,在同一循环中的后续if语句中,您将查找那些现在可能超出范围1-3的新值。看起来您应该将它们设置为if/else块,这样您就不会走到数组的末尾。例如

while(x<4 & y<4){
    if(requir[y]>supply[x]){
        ...
        x=x+1
    } else if(requir[y]<supply[x]){
        ...
        y=y+1
    } else  if(requir[y]==supply[x]){
        ...
        y=y+1
        x=x+1
    }
} 

答案 1 :(得分:0)

数据框不是矩阵。如果unit是数据框,则可以unit[[x]][y]代替unit[x, y]。这是因为数据帧实际上只是列表,其中数据框中的每一列都是列表的一个元素。因此,您可以使用它们上的列表语法来访问列。但是,矩阵不是列表。在内部,它们是按列“堆叠”的原子向量(“原子”基本上意味着“您无法访问具有$运算符的元素”)。因此,矩阵a <- matrix(100:103, nrow = 2)c(1, 2, 3, 4)一起存储,并附带特殊维度属性。要自己查看此内容,请键入dput(matrix(100:103, nrow = 2)),并记下属性.Dim。因此a[3]a[1,2]都会返回102

请注意,即使unit是数据框,unit[x][y]仍然会给您错误的信息。 [[[不是同义词。有几个不同之处,但最重要的是它们在列表中调用时会返回不同的内容。 [将返回一个列表,在这种情况下长度为1,其元素是向量。 [[返回向量本身。要帮助理解差异,请尝试以下代码:

data(iris)  # "Iris" is one of R's built-in data sets.
sprintf("class of iris[1]: %s\nclass of iris[[1]]: %s\n",
        class(iris[1]), class(iris[[1]]))
sprintf("length of iris[1]: %s\nlength of iris[[1]]: %s\n",
        length(iris[1]), length(iris[[1]]))

对于作业:如果在矩阵上调用[[会发生什么?为什么与在数据框上调用[[不同?