调用cplex库进行优化问题的求解
https://blog.csdn.net/weixin_46651999/article/details/108866265
相关参数说明
下面是一个MIP的简单例子,结合例子来看。首先将问题的目标函数和约束定义好,再传入接口中,一些符号的定义均已注释
# -*- coding: utf-8 -*-
# The MIP problem solved in this example is:
# 问题描述
# Maximize x1 + 2 x2 + 3 x3 + x4
# Subject to
# - x1 + x2 + x3 + 10 x4 <= 20
# x1 - 3 x2 + x3 <= 30
# x2 - 3.5x4 = 0
# Bounds
# 0 <= x1 <= 40
# 0 <= x2
# 0 <= x3
# 2 <= x4 <= 3
# Integers
# x4
import cplex
from cplex.exceptions import CplexError
# data common to all populateby functions
my_obj = [1.0, 2.0, 3.0, 1.0] # 系数
my_ub = [40.0, cplex.infinity, cplex.infinity, 3.0] # 变量上界
my_lb = [0.0, 0.0, 0.0, 2.0] # 变量下界
my_ctype = "CCCI" # 变量类型, I 表示Integer
my_colnames = ["x1", "x2", "x3", "x4"] # 变量名
my_rhs = [20.0, 30.0, 0.0] # 约束右端的值
my_rownames = ["r1", "r2", "r3"] # 约束名
my_sense = "LLE" # 约束的属性:L表示小于,E表示等于
def populatebyrow(prob):
prob.objective.set_sense(prob.objective.sense.maximize) # 求最大值 maximize
prob.variables.add(obj=my_obj, lb=my_lb, ub=my_ub, types=my_ctype,
names=my_colnames)# 导入刚才设置变量相关的值
rows = [[["x1", "x2", "x3", "x4"], [-1.0, 1.0, 1.0, 10.0]],
[["x1", "x2", "x3"], [1.0, -3.0, 1.0]],
[["x2", "x4"], [1.0, -3.5]]]# 设置约束的系数
prob.linear_constraints.add(lin_expr=rows, senses=my_sense,
rhs=my_rhs, names=my_rownames)# 填充线性参数进模型
try:
my_prob = cplex.Cplex()
handle = populatebyrow(my_prob) # 调用函数填充模型
my_prob.solve()
except CplexError as exc:
print(exc)
print()
# solution.get_status() returns an integer code
print("Solution status = ", my_prob.solution.get_status(), ":", end=' ')
# the following line prints the corresponding string
print(my_prob.solution.status[my_prob.solution.get_status()])
print("Solution value = ", my_prob.solution.get_objective_value()) # 获取最优解的值
numcols = my_prob.variables.get_num()
numrows = my_prob.linear_constraints.get_num()#
slack = my_prob.solution.get_linear_slacks()
x = my_prob.solution.get_values() # 获取取得最优解的变量值
print('x: ')
print(x)
调用DOcplex库进行优化问题的求解
DOcplex是一个基于python的建模语言库,通过调用cplex的求解器来求解模型,可以理解成将cplex的api进行二次封装,所以用DOcplex需要先装cplex。
它的求解速度并不低于cplex的python api,而且同时支持求解cp(约束规划)和mp(数学规划)
基本步骤
①导入库
from docplex.mp.model import Model
除了导入docplex之外有时候也根据需要导入其他的。
②导入数据、创建列表等
简单的数据初始化处理
③创建模型
mdl = Model() #简写,方便后面用
④变量处理
变量在放入目标函数和约束前需要进行相应处理,标明数据类型、上下界,名称等。如:
x = mdl.binary_var_list(var_list, lb =, ub =,name = ‘x’)
0/1变量——binary,整数——integer,连续型——continuous,…
列表——list,字典——dict,…
⑤设置目标函数
最小化mdl.minimize(…),最大化mdl.maximize(…)
⑥添加约束
mdl.add_constraint(…)
mdl.add_constraint(…)
…
约束里有xi,yj之类的话要用mdl.add_constraints()
有 ‘<’ 或 ‘>’ 的式子也需要转换成 ‘=’ ,’>=‘和’<=’
⑦求解模型
sol = mdl.solve()
⑧结果输出
print(sol)
print(sol.solve_details)可以显示求解时间、问题类型等细节信息。
【例1】变量连续
https://blog.csdn.net/yaologos/article/details/85284961
max 3 * x1 + 5 * x2 + 4 * x3
s.t.
2 * x1 + 3 * x2 <= 1500
2 * x2 + 4 * x3 <= 800
3 * x1 + 2 * x2 + 5 * x3 <= 2000
x1, x2, x3 >= 0
from docplex.mp.model import Model #导出库,只用这一个就够了
model = Model() #创建模型
var_list = [i for i in range(0, 3)] #创建列表
X = model.continuous_var_list(var_list, lb=0, name='X') #创建变量列表
model.maximize(3 * X[0] + 5 * X[1] + 4 * X[2]) #设定目标函数
#添加约束条件
model.add_constraint(2 * X[0] + 3 * X[1] <= 1500)
model.add_constraint(2 * X[1] + 4 * X[2] <= 800)
model.add_constraint(3 * X[0] + 2 * X[1] + 5 * X[2] <= 2000)
sol = model.solve() #输出解
print(sol) #获取默认形式的输出
print(sol.get_all_values()) #获取所有的变量解
print(sol.solve_details) #获取解的详细信息,如时间,gap值等
【例2】整数变量
max 800*x1 + 300*x2
s. t.
6 * x1 + 8 * x2 <= 120
10 * x1 + 5 * x2 <= 100
x1, x2 >= 0 且均为整数
from docplex.model import Model
model = Model()
#创建变量列表
x_list = [i for i in range(2)]
X = model.integer_var_list(x_list, name='x')
model.maximize(4*X[0] + 6*X[1] + 2*X[2])
model.add_constraint(4*X[0] - 4*X[1] >= 7)
model.add_constraint(-X[0] + 6*X[1] <= 5)
model.add_constraint(-X[0] + X[1] + X[2] <= 5)
sol = model.solve() #输出解
print(sol) #获取默认形式的输出
print(sol.get_all_values()) #获取所有的变量解
print(sol.solve_details) #获取解的详细信息,如时间,gap值等
【例2】0-1变量
from docplex.mp.model import Model #导出库,只用这一个就够了
model = Model() #创建模型
var_list = [i for i in range(0, 7)] #创建列表
X = model.binary_var_list(var_list, lb=0, name='X') #创建变量列表
#设定目标函数
model.maximize(11* X[0] + 9 * X[1] + 29 * X[2]+9* X[3]+21*X[4]+31*X[5]+22*X[6])
#添加约束条件
model.add_constraint(X[0]+X[1]+X[2] <= 2)
model.add_constraint(X[3] + X[4] >=1)
model.add_constraint(X[5] + X[6] >=1)
model.add_constraint(10* X[0] + 8* X[1] + 20 * X[2]+5* X[3]+13*X[4]+22*X[5]+10*X[6] <=60)
sol = model.solve() #求解模型
print(sol) #打印结果
DOcplex库 examples:
http://ibmdecisionoptimization.github.io/docplex-doc/mp/samples.html