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

原文链接:
https://blog.csdn.net/weixin_46651999/article/details/108866265 文章参考了ZhaoDongqiang(C++调用cplex求解VRPTW模型),补充了在Jyputer编辑器中用Python调用Cplex求解VRPTW问题,修正了模型中的小错误,具体如下: 1 VRPTW数学模型 2 Python调用Cplex求解 2.1 调用所需的 2.2 初始化参数 2.3 调用docplex建模 2.4 求解结果 1 VRPTW数学模型 网上能找到的python调用cplex示例实在太少,全英文的官方文档又十分难啃,还是从例子学起比较好,转了一圈找到github,发现IBM写了几个例子,但是又没有中文博客解释。代码看半天终于懂了个大概,搬运一下,同时记录菜鸟笔记,抛砖引玉,欢迎大家批评指正。 2 IBM官方说明 IBM在下述网页中提供了DOcplex说明手册、示例、云端求解等内容,可以大致看一下按需要获取。 IBMDecisionOptimization/docplex-examples https://github.com/IB 写在前面的话 作为一只想要努力毕业的科研小白,终于也到了用cplex求解一下我东拼西凑出来的小数学模型这一步了。应老板的要求,也是为了锻炼一下我的编程能力,决定用python调用docplex求解。显然,这年头,这么看颜值的时代,谁还不用个好用又好看的IDE啊。因为之前念本科的时候用过JetBrains公司的WebStorm,好看又好用,快捷键也很方便,于是在选用python的IDE时,就自然... 学习笔记而已,看的b站搬运 https://www.bilibili.com/video/BV1ab411G79M CVRP指载重量有限的车辆运输问题,从起点出发,到n个点获取物资,然后运回起点,要求运输路径总和最短 主要把视频里面每一句代码的意义搞清楚(注释),方便自己复现学习与对照使用 import cplex import docplex import numpy as np rnd = np.random rnd.seed(0) n = 10 anaconda环境下CplexDocplex安装流程【python】安装Cplex安装DOcplex验证DOcplex是否安装成功 安装Cplex 参考链接1——Cplex在anaconda安装过程 参考链接2——获得Cplex企业版本(在文章评论处) 总体流程: 从链接2获得Cplex企业版本,可以发现该版本仅支持python3.6/3.7(注意一下图中的路径,别找到CPLEX_Server里面去了) 好久不写博客了,大部分时间都用来干一些重复而繁杂的工作,好久没有认认真真学习一些东西了。 借着参加服创的机会要入手学习一些运筹学知识,就从Cplex开始吧。 首先直接用Python的cplex接口写线性规划比较简单,话不多说直接从实例看: 每一句的详解都在旁边的注释上 Cplex实例 # The MIP problem solved in this example is: # Maximize x1 + 2 x2 + 3 x3 + x4 # Subject to # - x1 + Python+cplex运筹优化学习笔记(二) 这里写目录标题Python+cplex运筹优化学习笔记(二)前言1、 cplexdocplex2、例子2.1声明各参数:2.2导入运筹优化2.3定义决策变量2.4实现约束条件2.5实现目标函数2.6求解模型2.7打印结果3.总结4.引用 首先呢,说明一下,本文只是自己在学习过程中运用到的例子,然后规整总结一下,随便写写自己所做的一些笔记。小白学习,有不对的地方还望大家批评指正。 1、 cplexdocplex 简单来说都是cplex的API,在py 使用docplex建模求解可能会出现无结果的错误,如下。 并且没有给出冲突约束,难以找出问题所在 Root node processing (before b&c): Real time = 0.03 sec. (20.17 ticks) Parallel b&c, 4 threads: Real time = 0.00 sec. (0.00 ticks) CPLEX Error 1016: Promotional version. Problem size limits exceed。出现这个问题的原因是,cplex的版本问题,是由于你的问题求解规模太大,所以试用版的免费版就不能求解.这是我原来从IBM官网下的12.8的免费版只能解决小规模问题,后来自己更换了12.8的学术版本,模型就可以跑了。 因为官网服务器问题,我注册了学校邮箱,但是下载时候... 一个基于python的建模语言,目前支持仅调用cplex求解器,不像其他成熟的建模语言可以调用多个求解器, 但其强大之处在于支持cplex的CP模块,其他建模语言仅能针对MP模块进行调用求解速度不次于python api,而且语言更加精炼,更贴近建模语言的本质,符合python的简练和opl语言的直观。 函数较... 文章分为两分1.如何在python中调用cplex;2.如何实现python调用cplex学术版。 1.如何在python中调用cplex; 首先保证自己的安装了python3.7(cplex不支持3.8和更高的版本) 首先移除现有的python3.8 brew unlink python3 然后去官网下载3.7的安装包。 Python官网: 找到要安装的版本,3.7.9:https://www.python.org/downloads/release 下载到本地,双击安装,一路下一步,按提示操作即可,都 python调用cplex解决规划问题(二) 上篇文章直接使用python调用cplex求解器解决旅行商问题(TSP)。但是只能是固定节点和距离的计算。所以这次小小的优化了一下,使用更贴近建模语言的docplex语法包进行改进,然后通过读取excel表格来获取数据。废话不多说直接上代码喽! 下面是主程序: from docplex.mp.model import Model from excel_to_matrix import excel_to_matrix datafile = 'C:\\Users\ Cplex学术版安装+anaconda 出现问题docplex.mp.utils.DOcplexLimitsExceeded:****Promotional version.Problem size limints(…) pythonl里直接下载的Cplex 是免费的并且有限制,只能求解小规模的问题。需要用cplex 学术版,才能求解更大规模的问题. 1.我安装的Cplex版本:Cplex12.9 免费版的官网地址:http://ibm.biz/CPLEXonAI 在这里下载需要有学校教育邮箱。如若没有 我需要解决类似于背包问题优化问题。我在这篇文章中详细介绍了优化问题:knapsack optimization with dynamic variables我实际上需要使用python而不是OPL,所以我安装了docplex和clpex包以便使用cplex优化框架。所以这里是我想用docplex转换为python的OPL代码{string} categories=...;{string} gro...