
本文共 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 ≤ X20 ≤ X32 ≤ 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]
通过以上代码实现,解决如下后:
可视化结果展示如下:
发表评论
最新留言
关于作者
