CPLEX Python入门--从简单的CplexPythonAPI详解到简单的DoCplex建模
发布日期:2021-05-12 02:56:45 浏览次数:9 分类:精选文章

本文共 1737 字,大约阅读时间需要 5 分钟。

自己的博客时间间隔较久,这个期间大部分时间都在忙碌冗杂的工作中度过,久未有机会深入学习和探索新知 поруш真实的学习和研究。趋近于服装创建的工作机会,为我提供了重新振作学习的契机,打算从基础的运筹学知识入手,首先尝试掌握Cplex的使用方法。

直接使用Python的Cplex接口编写线性规划程序较为直接,为了让读者更直观地了解操作流程,以下实例将配合详细注释。

在实例中主要解决的是以下目标函数:Maximize X1 + 2X2 + 3X3 + X4

约束条件包括:

  • X1 - X2 + X3 + 10X4 ≤ 20
  • X1 - 3X2 + X3 ≤ 30
  • X2 - 3.5X4 = 0

变量范围:0 ≤ X1 ≤ 40

0 ≤ X2
0 ≤ X3
2 ≤ X4 ≤ 3

通过CplexPythonAPI实现优化问题,步骤如下:

首先定义目标函数系数:my_obj = [1.0, 2.0, 3.0, 1.0]

变量上界:my_ub = [40.0, cplex.inf, cplex.inf, 3.0]

变量下界:my_lb = [0.0, 0.0, 0.0, 2.0]

变量类型均为整数(I),可直接用C表示:my_ctype = "C"

变量名:my_colnames = ["X1", "X2", "X3", "X4"]

构建投影矩阵表达约束:my_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] ]]

右边值:my_rhs = [20.0, 30.0, 0.0]

约束类型为小于等于(L)、等于(E):my_sense = "LLE"

在代码中添加变量和约束:

prob = Cplex()

prob.objective.set_sense.maximize()

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

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

prob.solve()

通过prob.solution获取最优解:x = prob.solution.get_values()

print(x)

print(prob.solution.get_objective_value())

经运行验证,接收如上结果图所示:

DMD-2021-01-30_11-43-59

转项目至Docplex实现更为轻松清晰。通过外部搜集资料,加快学习进度。主要案例为一个简单拓扑排序问题。

设定变量:X - 拥有优化的工区起始时间

Y所有工序时长度,并设置特殊约束X2和X5不能同时运行。

建立模型:

mdl = Model(name='schedule')x1 = mdl.integer_var(name='x1')x2 = mdl.integer_var(name='x2')x3 = mdl.integer_var(name='x3')x4 = mdl.integer_var(name='x4')x5 = mdl.integer_var(name='x5')x6 = mdl.integer_var(name='x6')

常数定义:y = [0, 100, 50, 500, 50, 400, 100]

设置约束:c1: x1 + y[1] ≤ x2c2: x2 + y[2] ≤ x3c3: x4 + y[4] ≤ x5c4: x5 + y[5] ≤ x6

特殊约束:if x5 ≥ x2, 则 x5 -x2 ≥ y[2]if x2 ≥ x5, 则 x5 -x2 ≥ -y[5]

目标函数:minimize x6 + y[6]

通过以上代码实现,解决如下后:

可视化结果展示如下:

上一篇:CPLEX Python【1】--DoCplex建模解CVRP问题
下一篇:机器学习笔记(4)--神经网络前向传播 --基于吴恩达机器学习配套笔记

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月05日 00时19分21秒