当前位置:   article > 正文

CPLEX_cplex求解器

cplex求解器

 一、优化求解器

从编程的角度,大家可以把它理解为一个专门求解优化/整数规划模型的算法包,你可以用任何编程语言(C/C++、Java、Python)去调用这个包里的方程,只要你把你要求解的整数规划模型目标方程和系数矩阵输入进去(告诉它你要求解的具体问题),它就会给你求解出结果。

二、IBM ILOG Cplex

为线性规划、混合整数规划、二次规划和二次约束规划问题提供灵活的高性能数学规划求解器。这些求解器包括用于混合整数规划的分布式并行算法,支持利用多台计算机来解决难题。是一种商业整数规划求解器。

网址:IBM ILOG CPLEX Optimization Studio

支持模型:混合整数(平方)规划、约束规划问题(Constraint programming)

支持语言:C/C++、Java、Python、Matlab等

特点:支持Benders分解模块(仅此一家)、速度Top2

三、安装

  • 编程语言编译环境选择。(选择你熟悉的语言如C,C++,C#,Python,Java......)
  • CPLEX工具:前往IBM官网注册下载。学术版是不受限的;免费版的都可以使用,但是它限制变量在1000个内。
  • 环境配置:CPLEX和编程软件的版本要对应。

四、求解模型

在Python环境下只需如下四步:

  • 导入CPLEX的包

import cplex

  • 初始化一个优化模型

prob = cplex.Cplex() # 此处的prob可以是任意变量名

  • 输入模型的目标函数、约束条件及变量系数

prob.objective.set_sense(...) # 设置目标方程的取值方向:求最大值/最小值

prob.variables.add(...) # 添加变量

prob.linear_constraints.add(...) # 添加约束条件

  • 直接调用优化求解器的求解方法(method),一键求解

prob.solve()

  • 模型的目标函数和最优解

print("Solution value  = ", prob.solution.get_objective_value())

print(prob.solution.get_values())

# 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

prob=cplex.Cplex()

prob.objective.set_sense(prob.objective.sense.maximize)【minimize

my_obj = [1, 2, 3, 1]

my_ub = [40, cplex.infinity, cplex.infinity, 3]

my_lb = [0, 0, 0, 2]

my_ctype = "CCCI"

my_names = ["x1", "x2", "x3", "x4"]

prob.variables.add(obj=my_obj, lb=my_lb,ub=my_ub,types=my_ctype,names=my_names)

my_rhs = [20, 30, 0]

my_rownames = ["r1", "r2", "r3"]

my_sense = "LLE"

rows = [[["x1", "x2", "x3", "x4"], [-1, 1, 1, 10]],

            [["x1", "x2", "x3"], [1, -3, 1]],

            [["x2", "x4"], [1, -3.5]]]

prob.linear_constraints.add(lin_expr=rows, senses=my_sense,rhs=my_rhs, names=my_rownames)

prob.solve()

print("Solution value  = ", prob.solution.get_objective_value())

print(prob.solution.get_values())

四、实际应用

短期水火电调度属于大规模、离散、非线性且非凸的数学规划问题。系统决策变量包括了离散和连续变量;每台机组都有各自的运行约束和物理约束,水电系统中还有库容约束。因此,这一问题在数学上是一个复杂的混合整数规划问题,也是一个NP难题。由于问题的困难性,直接寻找最优解几乎不可能。目前较多采用的为次优化算法,即寻找一个满意的解而不是最优解。近年众多研究表明Lagrange松弛法是一种求解此类问题的有效算法,它的主要优点包括:能够灵活处理多种约束;计算量随着问题规模的增大仅呈线性增长;得到的对偶间隙可以定量评价可行调度方案的优劣;Lagrange乘子有着重要的经济意义等。

但是,即使在这种算法框架下,水电调度子问题仍然没有有效的求解方法。然而,正如上文所述,CPLEX综合了多种算法的优点,它可以在较短的时间内解决多变量的、复杂的、混合整数规划问题,尤其是其中的混合整数优化程序对很多实际的混合整数规划问题的求解都是行之有效的。

五、其他优化求解器

国外: Gurobi

网址:Gurobi - The Fastest Solver - Gurobi

支持模型:混合整数(平方)规划、Constraint programming

支持语言:C/C++、Java、R、Python、Matlab等

特点:速度Top1、价格最高

国内:杉数科技的Cardinal

  • 补充文档

Cplex的几种使用方法总结2019-05-07 - 简书 (jianshu.com)

用CPLEX写个数学模型就这么难? - 简书 (jianshu.com)

用户手册:CPLEX 的示例 - IBM 文档

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/645116
推荐阅读
相关标签
  

闽ICP备14008679号