用python调用CPLEX求解—— 装箱问题实例)

python调用CPLEX求解——装箱问题

由于论文需要,我刚接触学习python以及CPLEX,由于网上相关资源很少,所以想把自己学习的过程记录下来,有不对的地方欢迎大家批评指正,也希望能得到这方面大佬的指导,同时也欢迎刚接触这方面的小伙伴一起讨论交流。

前言

由于这是一个实例,所以假设各位伙伴已经会使用python了,也已经将cplex和docplex包安装好了,如果没有安装好的伙伴可以看看这个链接的文章(https://zhuanlan.zhihu.com/p/101713127
或者这篇https://blog.csdn.net/robert_chen1988/article/details/80946466)安装问题有很多大佬都已经写过了,大家多找找。
这个装箱问题是我在找例子练手的时候发现的,但是使用的代码和原文是不一样的,想了解不同方法的伙伴可以去看看
参考原文章–装箱问题的CPLEX求解

问题描述

假设现有m = 5 个装货空箱,每个装货空箱的最大载重量是W = 5000,现有n = 8个客户需要运送货物,每个客户的货物重量是 weight = [1050, 1730, 2575, 3540, 1220, 1340, 1530, 1270],如何用最少的箱子将这个货物都运出去呢?

建模

  1. 决策变量: 这里有两类决策变量,首先对于空箱 i ( i = 1,…,m, 集合 I ) 都要决策选还是不选,用 y i y_{i} yi 表示, 选为1, 不选为0; 还要决策每个空箱 i (i = 1,…,m)为哪一个顾客 j ( j = 1,…n , 集合J) 服务,用 x i , j x_{i, j} xi,j 表示, 服务为1, 不服务为0。所以这两类决策变量都是二元变量。

  2. 决策目标:使用的箱子数量最小, m i n ∑ i ∈ I y i min \sum \limits_{i\in I}y_{i} miniIyi

  3. 约束条件:
    每个客户的货物只能由一个空箱服务, 即
    m i n ∑ i ∈ I x i , j = 1 min \sum \limits_{i\in I}x_{i, j}=1 miniIxi,j=1 , for j = 1,…n (约束1)

    每个空箱的实际载重量不能超过最大载重量, 即
    m i n ∑ j ∈ J x i , j ∗ w e i g h t j < = W ∗ y i min \sum \limits_{j\in J}x_{i, j}* weight_{j}<= W*y_{i} minjJxi,jweightj<=Wyi, for i = 1,…,m, (约束2)

    另, 变量 y i , x i , j ∈ 0 , 1 y_{i}, x_{i, j}\in{0,1} yixi,j0,1

求解

下面附上python代码

#导入包
from docplex.mp.model import Model

# 相关数据和类型的简单处理
m = 5
n = 8
M = [i for i in range(1,m+1)]
N = [i for i in range(1,n+1)]
A = {(i,j) for i in M for j in N}
W = 5000
weight = [1050, 1730, 2575, 3540, 1220, 1340, 1530, 1270]
weight_dict = {i:weight[i-1] for i in N}

# 定义模型种类, 这里是混合整数规划“MIP"
mdl = Model('MIP') #mdl是英文单词“model" 的缩写

# 定义变量,
y = mdl.binary_var_dict(M, name='y')
x = mdl.binary_var_dict(A, name='x')

#定义目标函数
mdl.minimize(mdl.sum(y[i] for i in M))

#定义约束条件
mdl.add_constraints(mdl.sum(x[i,j] for i in M)==1 for j in N)
mdl.add_constraints(mdl.sum(x[i,j]*weight_dict[j] for j in N) <= W*y[i] for i in M)

#求解模型并显示
solution = mdl.solve()
print(solution)

求解结果是:
objective: 3
被选箱子:y_2=1,y_3=1,y_4=1
分配方式:x_2_8=1,x_3_3=1, x_4_4=1, x_2_2=1, x_3_5=1, x_2_7=1, x_4_6=1, x_3_1=1

  • 6
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Python调用Cplex求解TSP问题非常简单。首先,确保已成功安装Cplex Python API。然后,你需要在Python代码中导入Cplex。 接下来,你需要创建一个Cplex对象,即cp。通过调用`cp = cplex.Cplex()`创建一个新的Cplex对象。 然后,你需要定义TSP问题的变量。对于TSP问题,你可以使用二维数组表示城市之间的距离矩阵。假设距离矩阵存储在名为`distances`的二维数组中,你可以通过调用`cp.variables.add(obj=distances, lb=[0]*n, ub=[1]*n, types=[cp.variables.type.integer]*n)`定义TSP中的变量,其中`n`是城市的数量。 接下来,你需要添加TSP问题的约束条件。对于TSP问题,约束条件是每个城市都必须被访问一次,而且每个城市之间只能存在一条路径。你可以使用`cp.linear_constraints.add(lin_expr=[cp.SparsePair(ind=range(n), val=[1]*n)]*n, senses=["E"]*n, rhs=[1]*n)`来定义这些约束条件。 然后,你需要定义目标函数。对于TSP问题,目标函数是最小化路径的总长度。你可以使用`cp.objective.set_sense(cp.objective.sense.minimize)`将目标函数设置为最小化,并通过调用`cp.objective.set_linear(range(n),distances.flatten())`来定义路径的长度。 最后,通过调用`cp.solve()`来求解TSP问题。一旦求解完成,你可以通过`cp.solution.get_values()`获取每个变量的解,这些解表示路径的顺序。 综上所述,使用Python调用Cplex求解TSP问题的基本步骤是:创建Cplex对象、定义变量、添加约束条件、定义目标函数、求解问题,并获取结果。请记住,TSP问题是一个经典的NP-hard问题,对于大规模问题,可能需要使用启发式算法或其他优化方法

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值