R语言-运筹学虚拟变量运输问题实例

这是我自己的运筹学笔记,由于老师讲的实在一言难尽,导致自己不得不对着英文教材自学,以下的例子就出自英文教材。

问题介绍

有3条河流向4个城市供水,表格9.10中显示了运费,没有运费则表示无法供水。城市有其最小需求(刚需,第一行),还有奢侈性需求(刚需+额外需求,第二行),首先满足城市的刚需,在此基础上尽量满足其奢侈性需求,并使得费用最小化。

难点在于每个城市的需求是不确定的,有一个上界和下界,上界为其他城市的刚需满足后剩下的,下界即为刚需。因此Hollyglass的上界就是(50+60+50)-(30+70+0)=60而非无穷大。

然而在运输问题中需求得是常数而不能是变量,因此要对问题做一些变形。引入一个虚拟产地用来满足奢侈性需求。虚拟产地的产量即为需求的上界减去真实的产量:(50+70+30+60)-(50+60+50)=50。注意虚拟产地的运费都是0,并且由于Calorie不能运到Hollyglass, 故将其运费设为一个极大值M。

接下来对模型做出调整以便把奢侈性需求纳入考虑。

Hollyglass不需要调整,因为它的奢侈性需求减去虚拟产量等于10,正好为它的刚需,即这部分刚需一定能由真实产量提供。Los Devils的刚需等于奢侈性需求,即必须全部由真实产量提供,因此在虚拟产量中将它的运费设为M。对于Berdo,虚拟产量在满足奢侈性需求的前提下还能满足部分刚需,由于其刚需是30,上界是50,故虚拟产量提供不能超过20。因此将Berdo分成2块,一块需求为30,虚拟产地运费为M,另一块需求为20,虚拟产地运费为0。

在这里插入图片描述

R语言解决

library(lpSolve)
M = 10000
a1 = c(16,16,13,22,17)
a2 = c(14,14,13,19,15)
a3 = c(19,19,20,23,M)
a4 = c(M,0,M,0,0)
a = rbind(a1,a2,a3,a4)    #系数矩阵
row.rhs = c(50,60,50,50)     #供给约束值
row.dir = rep('=',4)     #约束方向
col.rhs = c(30,20,70,30,60)    #需求约束值
col.dir = rep("=",5)     #约束方向
solution = lp.transport(a, row.signs = row.dir, row.rhs = row.rhs, col.signs = col.dir, col.rhs = col.rhs)
solution$solution

结果为

忽略最后一行虚拟产量的结果,该矩阵即为运输量矩阵。

参考教材:Introduction to Operations Research,Frederick S. Hillier • Gerald J. Lieberman

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
以下是使用R语言进行运筹学计算的代码示例: 1. 线性规划 使用R语言求解线性规划可以使用lpSolve包。以下是一个简单的例子: ```R library(lpSolve) # 构建问题 f.obj <- c(5, 6, 7) # 目标函数系数 f.con <- matrix(c(2, 3, 1, 4, 1, 2), nrow = 2, byrow = TRUE) # 约束条件系数矩阵 f.dir <- c("<=", "<=") # 约束条件类型 f.rhs <- c(10, 8) # 约束条件右端向量 # 求解 sol <- lp("max", f.obj, f.con, f.dir, f.rhs) # 输出结果 sol ``` 这个例子中,我们求解的是以下线性规划问题: ``` max 5x1 + 6x2 + 7x3 s.t. 2x1 + 3x2 + x3 <= 10 4x1 + x2 + 2x3 <= 8 x1, x2, x3 >= 0 ``` 求解结果为: ``` Success: the objective function is 32 > sol Success: the objective function is 32 > sol$solution [1] 1.6 0.8 0.0 ``` 2. 整数规划 使用R语言求解整数规划可以使用lpSolve包。以下是一个简单的例子: ```R library(lpSolve) # 构建问题 f.obj <- c(5, 6, 7) # 目标函数系数 f.con <- matrix(c(2, 3, 1, 4, 1, 2), nrow = 2, byrow = TRUE) # 约束条件系数矩阵 f.dir <- c("<=", "<=") # 约束条件类型 f.rhs <- c(10, 8) # 约束条件右端向量 f.int <- 1:3 # x1, x2, x3是整数变量 # 求解 sol <- lp("max", f.obj, f.con, f.dir, f.rhs, int.vec = f.int) # 输出结果 sol ``` 这个例子中,我们求解的是以下整数规划问题: ``` max 5x1 + 6x2 + 7x3 s.t. 2x1 + 3x2 + x3 <= 10 4x1 + x2 + 2x3 <= 8 x1, x2, x3是整数变量 ``` 求解结果为: ``` Success: the objective function is 29 > sol Success: the objective function is 29 > sol$solution [1] 2 1 0 ``` 3. 网络流 使用R语言求解网络流问题可以使用igraph包。以下是一个简单的例子: ```R library(igraph) # 构建网络 g <- graph(edges = c(1, 2, 1, 3, 2, 3, 2, 4, 3, 4), n = 4, directed = TRUE) E(g)$capacity <- c(4, 2, 5, 3, 6) # 设置边的容量 # 求解最大流 maxflow <- max_flow(g, 1, 4) # 输出结果 maxflow$value # 最大流量 maxflow$flow # 边的流量 ``` 这个例子中,我们求解的是以下网络流问题: ``` 求解从1到4的最大流 ``` 求解结果为: ``` [1] 7 > maxflow$flow [1] 4 2 1 2 0 ``` 以上是使用R语言进行运筹学计算的代码示例,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值