【问题标题】:transport optimization R studio交通优化R工作室
【发布时间】:2018-12-31 04:38:40
【问题描述】:

我正在尝试建立一个关于商品如何在各州之间移动的线性程序。我正在与 R studio 合作,使用 lpSolve 包。我对 R 很陌生,所以请原谅基本语言!但是我查看了帮助文件,似乎无法找出问题所在。

国家既是“供应者”(m)又是“需求者”(n)。我想要一个运输单位的矩阵,这意味着我的矩阵的对角线元素将为 0。需求必须等于供给,需求首先由各州自己的供应满足,然后是其他州的过剩供应。我的需求和供应总量是相等的。目标函数是成本矩阵——我认为这只是一个典型的“运输问题”。有 5 个州,为了方便起见,我刚刚给出了“供应过剩”和“需求未满足”的数据,即不包括供应约束必须等于需求。对于等于供给/需求总量,只有两组约束。

我在 Sallan 等人的 Modeling and Solveving Linear Programming with R 中找到了以下代码。

obj.fun <- c(0, 1706.7028, 1916.6580, 2136.8103, 2022.6844, 1700.9534, 0, 
 1975.2873, 2274.0058, 1351.2115, 1909.6172, 1973.9959, 0, 310.3474, 
 851.0575, 2129.6639, 2272.6088, 310.2418, 0, 1101.0733, 2013.8803, 
 1348.1568, 849.2942, 1099.4156, 0)
 m <- 5
 n <- 5
 constr <- matrix (0 , n +m , n*m )
 for(i in 1:m){ 
 for(j in 1:n){ 
    constr[i, n*(i-1) + j] <- 1
   constr[m+j, n*(i-1) + j] <- 1
   }
   }

 constr.dir <- c(rep("=",m ), rep("=", n))
   rhs <- c(0, 0, 0, 528534585, 5181690936, 2446322302, 412720974, 
  2851182245, 0 , 0)

   prod.trans <- lp ("min", obj.fun, constr, constr.dir, rhs,
                   compute.sens = TRUE )
  prod.trans$obj.val
  sol<-matrix (prod.trans$solution, m, n, byrow=TRUE)
  prod.trans$duals

但是,当我运行它时,我只得到一个零矩阵:

> prod.trans$obj.val
> NULL 
> sol<-matrix (prod.trans$solution, m, n, byrow=TRUE)
> prod.trans$duals
> [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

我假设矩阵中的对角线元素不能为 0?

任何建议都非常感谢 - 即使只是指出我在哪里可以获得帮助!

谢谢! F

【问题讨论】:

    标签: r matrix linear-programming transport


    【解决方案1】:
    1. rhs 除以 1e9。这种缩放将有助于将数字保持在正常范围内。您可以将此解释为单位的变化(例如从克到千吨)。
    2. prod.trans$obj.val 替换为prod.trans$objval

    你会看到:

    > prod.trans$objval
    [1] 7619.598
    > sol<-matrix (prod.trans$solution, m, n, byrow=TRUE)
    > prod.trans$duals
     [1] -1164.5861  -498.8626     0.0000   310.2418   849.2942  1164.5861   498.8626     0.0000  -310.2418  -849.2942
    [11]     0.0000  2372.4263  3081.2441  3611.6382  4036.5647  1035.2299     0.0000  2474.1499  3083.1102  2699.3683
    [21]   745.0311  1475.1333     0.0000   620.5892  1700.3517   654.8360  1463.5044     0.0000     0.0000  1640.1257
    [31]     0.0000     0.0000     0.0000   560.3632     0.0000
    >
    

    【讨论】:

    • 您好 - 我在休息一段时间后才回到这个分析,我遇到了更多问题。实际分析涉及 35:35 矩阵,而不是 5。我检查了 5 并且代码有效,但是当我使用 35 运行时,我再次得到 0。模型是否有可能找不到最佳解决方案,或者这会是另一个编码问题吗?供需总量不太匹配,所以我想知道是否可能是这样。
    • 检查结果并检查它是否不可行。所述模型假设这是一个平衡运输问题。您始终可以通过添加虚拟节点来使事情平衡。
    【解决方案2】:

    如果其他人也遇到这样的运输问题:

    lpSolve 中有一个非常方便的内置函数,叫做 lp.transport,它和上面的 lp 的解决方案做的事情一样,但是直接需要一个成本矩阵和单独的约束向量作为参数的行和列。

    # set up the matrix of transport costs
    m <- 5
    n <- 5
    cost_mat <- matrix(c(0, 1706.7028, 1916.6580, 2136.8103, 2022.6844, 1700.9534, 0, 
                         1975.2873, 2274.0058, 1351.2115, 1909.6172, 1973.9959, 0, 310.3474, 
                         851.0575, 2129.6639, 2272.6088, 310.2418, 0, 1101.0733, 2013.8803, 
                         1348.1568, 849.2942, 1099.4156, 0),
                       nrow = m, ncol = n, byrow = TRUE)
    
    # constraints for rows and columns, devided by 1e9
    row_rhs <- c(0, 0, 0, 528534585, 5181690936)/1e9
    col_rhs <- c(2446322302, 412720974, 2851182245, 0 , 0)/1e9
    
    # solve
    prod_trans <- lp.transport(cost.mat = cost_mat, direction = "min", row.signs = rep("=", m), row.rhs = row_rhs,  col.signs = rep("=", m), col.rhs = col_rhs, compute.sens = TRUE, integers = NULL)
    

    这产生与Erwin's 解决方案相同的结果。

    > prod_trans
    Success: the objective function is 7619.598 
    
    > prod_trans$solution
             [,1]     [,2]      [,3] [,4] [,5]
    [1,] 0.000000 0.000000 0.0000000    0    0
    [2,] 0.000000 0.000000 0.0000000    0    0
    [3,] 0.000000 0.000000 0.0000000    0    0
    [4,] 0.000000 0.000000 0.5285346    0    0
    [5,] 2.446322 0.412721 2.3226477    0    0
    
    > prod_trans$duals 
              [,1]      [,2]      [,3]      [,4]      [,5]
    [1,] -1164.586 -498.8626    0.0000  310.2418  849.2942
    [2,]  1164.586  498.8626    0.0000 -310.2418 -849.2942
    [3,]     0.000 1035.2299  745.0311  654.8360    0.0000
    [4,]  2372.426    0.0000 1475.1333 1463.5044    0.0000
    [5,]  3081.244 2474.1499    0.0000    0.0000    0.0000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多