问题
分别使用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) #打印结果
求解两者结果类似。