调用cplex库和DOcplex库进行优化问题的求解

调用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

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Matlab是一种非常强大的数学计算工具,而Cplex则是一种常用的数学优化软件。通过将Matlab与Cplex结合使用,我们可以解决各种复杂的优化问题。 下面是一个使用Matlab调用Cplex求解优化问题的编程案例。 假设我们有20个任务需要分配给5个工人,每个任务分派给一个工人后,会产生不同的效益,我们的目标是最大化总效益。同时,每个工人有能力限制,即每个工人只能完成一定数量的任务。 首先,我们需要在Matlab环境中安装并配置Cplex,使其能够与Matlab进行交互。然后,我们可以使用Matlab的优化工具箱和Cplex函数来构建该问题的数学模型。 假设任务效益存储在一个20x5的矩阵benefits中,工人能力限制存储在一个5x1的向量capacity中。 我们可以使用二进制变量x(i,j)表示第i个任务是否分配给第j个工人,优化目标是最大化总效益。同时,我们还需要加入约束条件,即每个任务只能分配给一个工人,每个工人的任务数量不能超过能力限制。 通过使用Matlab的优化工具箱中的整数线性规划函数和Cplex的相关函数,我们可以构建出该问题的数学模型,并调用Cplex进行求解。 最后,我们可以通过将Cplex求解的结果在Matlab中进行处理和分析,得到最优的任务分配方案以及对应的总效益。 通过这个案例,我们可以看到如何使用Matlab调用Cplex求解优化问题。这种方法不仅可以应用于任务分配问题,还可以用于解决更加复杂的优化问题,如物流路径优化、生产调度等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值