python使用Cplex和docplex求解整数规划(0-1规划)

问题

分别使用Cplex和docplex解决整数规划问题,本次拟解决的问题是经典的0-1背包问题,以下是问题的模型,大家需要的时候可以代入自己的模型。

接下来直接展示代码,详细的介绍在代码中。

Cplex求解

import cplex
model = cplex.Cplex()
# 定义决策变量的集合,这样写会使代码变简洁
set_decision_var = range(n)
num_constraints = 1
constraint_type = ["L"]
# 0-1背包问题参数设定
b = [9]
n = 4
a = [[2,3,6,5]]
c = [6,3,5,4]

# 创建决策变量
x = model.variables.add(names= ["x_"+str(i) for i in set_decision_var], 
                        lb=[0 for _ in set_decision_var], 
                        ub=[1 for _ in set_decision_var],
                        types=["B" for _ in set_decision_var ])  #Binary 如果是整数变量tyres设置为"I"

# 定义目标函数
model.objective.set_linear(zip(x, c))  # zip将对应的系数和变量组合,简化代码
model.objective.set_sense(model.objective.sense.maximize)

# 添加约束,和线性规划一样
for i in range(num_constraints):
    model.linear_constraints.add(
        lin_expr= [cplex.SparsePair(ind= ["x_"+str(j) for j in set_decision_var], val= a[i])],
        rhs= [b[i]],
        names = ["c"+str(i)],
        senses = [constraint_type[i]]
    )
        

# 解决模型
model.solve()

# print("Solution status = ", model.solution.get_status())
print("cost: " + str(model.solution.get_objective_value()))
print("soluetion" + str(model.solution.get_values()))

求解结果如图:

docplex求解

from docplex.mp.model import Model  #导出库,只用这一个就够了
import numpy as np

# 0-1背包问题参数设定
b = [9]
n = 4
a = np.array([[2,3,6,5]])
c = [6,3,5,4]
set_decision_var = range(n)
num_constraints = 1
constraint_type = ["L"]

model = Model() #创建模型

# 添加决策变量
var_list = [i for i in set_decision_var] #创建列表
X = [model.binary_var(name='y{}'.format(i)) for i in set_decision_var] # 二值变量只能一个个创建, 整数变量 model.integer_var

# 定义目标函数
objective = model.sum(X[i] * c[i] for i in set_decision_var)
# for maximization
model.maximize(objective)

#添加约束条件
model.add_constraint(
    ct=model.sum(a[0,j] * X[j] for j in set_decision_var) <= b[0],
    ctname="constraint_0")

sol = model.solve() #求解模型

print(sol)  #打印结果

求解两者结果类似。

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值