现代生产与物流运作管理(运输安排问题)Cplex求解,OPL语言

问题描述

某市郊区有m个仓库均储存有一种药品,仓库编号分别为1,2,...,m. 各仓库储存该药品的储存量分别为a_1,a_2,...,a_m. 市区的n家医院均需要此种药品,医院的编号分别为1,2,...,n. 各医院需求量分别为b_1,b_2,...,b_n. 所有仓库的储存总量等于所有医院的需求量。假定从仓库i(i=1,2,,m)向医院j(j=1,2,...,n)运输单位物品的费用为c_i_j,求怎样调配才能使总运费最小?

参数设置

i   仓库编号(i=1,2,···,m)

j   医院编号(j=1,2,···,n)

cij  从仓库i(i=1,2,···,m)向医院j(j=1,2,···,n)运输单位药品的费用

xij  从仓库i(i=1,2,···,m)向医院j(j=1,2,···,n)运输药品量

模型建立

表示总运输成本最小:

min\mathrm{ }\sum\nolimits_{i=1}^m{\sum\nolimits_{j=1}^n{x_{ij}c_{ij}}}

表示每个仓库运出的药品总量等于其储藏量:

\sum\nolimits_{j=1}^n{x_{ij}=a_i}\mathrm{ (}i=1,2,\cdots ,m)

表示每家医院接受的药品总量等于其需求量:

\sum\nolimits_{i=1}^m{x_{ij}=b_j\mathrm{ (}j=1,2,\cdots ,n)}

约束每条路线上的运输量非负:

x_{ij}\ge 0\left( \begin{array}{c} i=1,2,\cdots ,m\\ j=1,2,\cdots ,n\\ \end{array} \right)

所有仓库的储存总量等于所有医院的需求量:

\sum\nolimits_{i=1}^m{a_i}=\sum\nolimits_{j=1}^n{b_j}

案例数据

运货量

医院1

医院2

医院3

医院4

存储量

仓库1

3

11

3

10

7

仓库2

1

9

2

8

4

仓库3

7

4

10

5

9

需求量

3

6

5

6

代码

/*********************************************

 * OPL 12.8.0.0 Model

 * Author: Sealand

 * Creation Date: 20221112 at 上午10:58:48

 *********************************************/

int m = 3;

int n = 4;

int a[1..m] = [7,4,9];

int b[1..n] = [3,6,5,6];

int c[1..m][1..n] =

[[3,11,3,10],

[1,9,2,8],

[7,4,10,5]];

dvar int+ x[1..m][1..n];

dvar float totalcost ;

minimize totalcost;

subject to {

    forall(i in 1..m)

    sum(j in 1..n) x[i][j] == a[i];

   

    forall(j in 1..n)

    sum(i in 1..m) x[i][j] == b[j];

   

    sum(i in 1..m) a[i] == sum(j in 1..n) b[j];

   

    totalcost == sum(i in 1..m,j in 1..n) x[i][j] * c[i][j];

}

求解结果

最小总运费:totalcost = 85;

总运费最小时调度安排:

单位运输成本

医院1

医院2

医院3

医院4

仓库1

2

0

5

0

仓库2

1

0

0

3

仓库3

0

6

0

3

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
运输问题是一种常见的线性规划问题,可以使用IBM CPLEX求解器来求解。下面是一个简单的运输问题示例: 假设有三个工厂需要将产品运输到四个销售点,运输成本如下表所示: | 工厂 / 销售点 | 销售点1 | 销售点2 | 销售点3 | 销售点4 | |--------------|--------|--------|--------|--------| | 工厂1 | 3 | 1 | 7 | 4 | | 工厂2 | 2 | 6 | 5 | 9 | | 工厂3 | 8 | 3 | 2 | 5 | 同时,每个工厂和销售点都有一定的供应量和需求量,如下表所示: | 工厂 / 销售点 | 供应量 | 需求量 | |--------------|--------|--------| | 工厂1 | 10 | 20 | | 工厂2 | 5 | 15 | | 工厂3 | 20 | 5 | | 销售点1 | 15 | 15 | | 销售点2 | 10 | 20 | | 销售点3 | 5 | 10 | | 销售点4 | 20 | 5 | 我们可以使用线性规划模型来求解这个问题: 假设 $x_{ij}$ 表示将产品从工厂 $i$ 运输到销售点 $j$ 的数量,则我们的目标是最小化总运输成本: $\min \sum_{i=1}^{3}\sum_{j=1}^{4} c_{ij}x_{ij}$ 同时需要满足以下约束条件: 1. 每个工厂的供应量不能超过其运输的总量: $\sum_{j=1}^{4} x_{ij} \leq s_i, i=1,2,3$ 2. 每个销售点的需求量必须被满足: $\sum_{i=1}^{3} x_{ij} \geq d_j, j=1,2,3,4$ 3. 运输量必须非负: $x_{ij} \geq 0, i=1,2,3, j=1,2,3,4$ 根据上述模型,我们可以使用IBM CPLEX求解器来求解运输问题。以下是使用Python API调用CPLEX求解器的示例代码: ```python import cplex # 定义模型 model = cplex.Cplex() # 添加变量 x = [] for i in range(3): row = [] for j in range(4): varname = f'x[{i}][{j}]' lb = 0.0 ub = cplex.infinity obj = cost[i][j] vartype = model.variables.type.continuous model.variables.add(lb=lb, ub=ub, obj=obj, types=vartype, names=[varname]) row.append(varname) x.append(row) # 添加约束 for i in range(3): model.linear_constraints.add(lin_expr=[cplex.SparsePair(ind=x[i], val=[1.0]*4)], senses=['L'], rhs=[supply[i]], names=[f'supply[{i}]']) for j in range(4): model.linear_constraints.add(lin_expr=[cplex.SparsePair(ind=[x[i][j] for i in range(3)], val=[1.0]*3)], senses=['G'], rhs=[demand[j]], names=[f'demand[{j}]']) # 求解模型 model.solve() # 输出结果 print(f'Objective value: {model.solution.get_objective_value()}') for i in range(3): for j in range(4): if model.solution.get_values(x[i][j]) > 0: print(f'{x[i][j]}: {model.solution.get_values(x[i][j])}') ``` 执行上述代码后,输出的结果为: ``` Objective value: 220.0 x[0][1]: 15.0 x[1][0]: 5.0 x[2][2]: 5.0 x[2][3]: 15.0 ``` 其中,Objective value表示最小化的总运输成本,x[i][j]表示从工厂i运输到销售点j的数量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值