使用Python中的cvxpy库解整数规划问题

Python的scipy库中提供了解简单线性或非线性规划问题,但是不能求解如背包问题的0-1规划问题,或整数规划问题,混合整数规划问题,CVXPY库可以求解以上类型的问题。本文将使用cvxpy库求解整数规划问题。如果你需要使用cvxpy求解背包 问题或混合整数规划问题可以直接在cvxpy的官方文档上查询相关的例子。

Cvxpy库官方提供算例

本文求解的整数规划问题如下:

Objective: min:  Z = ∑ i = 0 5 x i \text{min: }Z = \sum_{i=0}^5x_i min: Z=i=05xi

Constrains: 0 ≤ x 1 ≤ 25 0 ≤ x 2 ≤ 12 0 ≤ x 3 ≤ 12.5 0 ≤ x 4 ≤ 2 0 ≤ x 5 ≤ 0 x 1 ≤ 10 x 2 ≤ 40 x 3 ≤ 90 x 4 ≤ 80 x 5 ≤ 0 − 1 ∗ x 1 ≤ 40 − 0.9 ∗ x 1 − x 2 ≤ 2 − 0.8 x 1 − ( 5 / 6 ) ∗ x 2 − x 3 ≤ − 30 − 0.3 x 1 − ( 5 / 8 ) ∗ x 2 − 0.8 ∗ x 3 − x 4 ≤ 38 \begin{aligned} 0 \leq x_1 \le 25\\ 0 \leq x_2 \le 12\\ 0 \leq x_3 \le 12.5\\0 \leq x_4 \le 2\\0 \leq x_5 \le 0 \\ x_1 \le 10\\x_2 \le 40 \\x_3 \le 90\\x_4 \le 80\\x_5 \le 0\\-1*x_1 \le 40\\-0.9*x_1-x_2 \le 2\\-0.8x_1-(5/6)*x_2-x_3 \le -30\\-0.3x_1-(5/8)*x_2-0.8*x_3-x_4 \le 38\end{aligned} 0x1250x2120x312.50x420x50x110x240x390x480x501x1400.9x1x220.8x1(5/6)x2x3300.3x1(5/8)x20.8x3x438

python代码如下:

import cvxpy as cp
import numpy as np
# Create two scalar optimization variables.
n = 5
x = cp.Variable(n, integer=True)#cvxpy使用cp.Variable(n,intger = True) 中的intger参数来规定x变量为整数
# # Create two constraints.
A1 = np.ones((5,5))
for i in range(A1.shape[0]):
    for j in range(A1.shape[1]):
        if i == j:
            pass
        else:
            A1[i,j] = A1[i,j]*0
A2 = A1 * (-1)
A3 = np.array([[-1,0,0,0,0],[-0.9,-1,0,0,0],[-0.8,-(40/48),-1,0,0],[-0.3,-(5/8),-0.8,-1,0]])
B = np.array([0,0,0,0,0,25,12,12.5,2,0,10,40,90,80,0,40,2,-30,32])
A = np.vstack((A2,A1,A1,A3))
constraints = [A @ x <= B]
objects = cp.Minimize(cp.sum(x))
# Define and solve the CVXPY problem.
prob = cp.Problem(objects,constraints)
prob.solve(solver=cp.CPLEX)#此处使用IBM商业求解器CPLEX作为求解器,对于没有安装CPLEX的同学可以通过pip install cplex安装该求解器,亦可将此处更改为solver = cp.ECOS_BB使用convexpy自带求解器对该问题进行求解
# Print result.
print("\nThe optimal value is", prob.value)
print("A solution x is")
print(x.value)
# print(help(prob))
# print (cp.installed_solvers())
'''结果如下:
The optimal value is 34.00000013019109
A solution x is
[ 1.00000000e+01  1.20000000e+01  1.20000000e+01  1.11983366e-07
 -6.64682255e-09]
'''

有同学反映在prob.solve(solver=cp.CPLEX)一行报错,此处我的代码使用IBM商业求解器CPLEX作为求解器,对于没有安装CPLEX的同学可以通过pip install cplex安装该求解器,亦可将此处更改为solver = cp.ECOS_BB使用convexpy自带求解器对该问题进行求解。

  • 8
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值