在上一篇文章中,我演示了如何通过linprog函数使用SciPy.optimize解决Python中的线性优化问题。在本文中,我想提供一个使用PuLP模块解决以下问题的Python编码示例:
这个问题是线性的,可以在Python中使用Pulp解决。从下面的编码示例中可以看出,建模语法与SciPy.optimize完全不同。
#导入PuLP(可以通过pip install进行安装,例如在anaconda提示符下) import pulp #使用LpProblem函数初始化我们的线性优化问题的声明 linearProblem = pulp.LpProblem("some title",pulp.LpMaximize) # we maximize, and thus use LpMaximize as parameter #使用PuLP模块优化变量必须通过LpVariable函数声明 x1 = pulp.LpVariable("x1",lowBound = 0) # x1 has only lower bound, no upper bound x2 = pulp.LpVariable("x2",lowBound = 0) # x2 has only lower bound, no upper bound #使用+ =运算符,我们可以将目标函数添加到声明的问题中 linearProblem += 2*x1 + 3*x2 #相同的方法对添加约束有效 linearProblem += x1 + x2 <= 10 linearProblem += 2*x1 + x2 <= 15 #我们现在可以检查我们的问题 linearProblem
some_title: MAXIMIZE 2*x1 + 3*x2 + 0 SUBJECT TO _C1: x1 + x2 <= 10 _C2: 2 x1 + x2 <= 15 VARIABLES x1 连续 x2 连续
如我们所见,目标函数是2×1 + 3×2,如标量语法的初始数学问题陈述中所述。约束用_C1和_C2标记。它们也与本文开头的数学问题陈述相一致。此外,x1和x2是连续的而不是离散的优化变量是正确的。
现在,我们可以在Python中使用PuLP解决问题:
#解决问题,使用标准的PuLP解算器解决连续线性优化问题 solution = linearProblem.solve() #使用PuLP模块中的LpStatus查看优化运行是否成功 pulp.LpStatus[solution]
'最佳'
解决方案是最佳的。让我们看看最佳目标函数值
#通过以下方法用值函数访问最佳目标函数值 pulp.value(linearProblem.objective)
30.0
#还可以通过value函数访问x1的最佳解决方案(但我们已经有x1作为处理程序) pulp.value(x1)
0.0
#最后,下面我展示了x2的最佳解决方案 pulp.value(x2)
10.0
在我的博客上,您还可以找到使用lpSolve和FuzzyLP(例如带有crispLP或FCLP.sampledBeta)在R中演示线性编程的文章。此外,我提供了使用R中的quadprog和Python中的cvxopt进行二次优化的示例。最后,我使用nloptr软件包解决了R中具有梯度下降的非线性优化问题。
专业领域为优化和仿真的工业工程师(R,Python,SQL,VBA)
Leave a Reply