线性编程是最常见的优化技术之一。它具有广泛的应用范围,并且经常用于运筹学,工业设计,计划等,并且还在不断增加。Python中的线性编程并没有像机器学习那样被大肆宣传,但是它是可以通过具有线性关系的决策变量,来解决问题。这是一个快速实用的Python中的线性教程。下面让我们来详细了解一下这些内容吧。
问题陈述
只是想知道一个主意,我们将解决一个有关生产计划的简单问题。想象一下,您在一家制造计算机的公司工作。计算机是一种相当复杂的产品,有几家工厂组装它们,而公司每单位要支付一定的费用。这种计算机模型在市场上的价格固定为500美元,不同的工厂以不同的速度和成本组装计算机。f0工厂每天生产2000件,每件450美元;f1工厂每天生产1500件,每件420 $;f2 1000件每天生产,每件400 $。我们有1个月的时间来组装8万个单元,这是因为任何工厂的产量都不是其他任何工厂的两倍。问题是,工厂之间的最佳生产分配是什么,以使我们在这些限制下通过出售计算机获得的利润最大化 ?
在本教程中,我们将使用Python和线性编程优化包PuLP,并使用pip复制粘贴安装:
点安装纸浆
现在,为了通过线性编程解决计算机生产问题,我们需要执行以下操作:
1. 决策变量集;
2. 这些变量的线性约束集;
3. 线性目标函数以最大化或最小化。
因此,打开您喜欢的编辑器,让我们开始吧。在PuLP中定义变量之前,我们需要使用以下代码创建问题对象:
来自纸浆进口*
问题= LpProblem(“ problemName”,LpMaximize)
我们将向该对象添加约束和目标函数。请注意,问题构造函数收到问题名称和LpMaximize,这意味着我们要最大化目标函数。在我们的案例中,这是销售一定数量的计算机所获得的利润。此外,我们还定义了从问题陈述中收到的常量:
#每天的工厂成本
cf0 = 450
cf1 = 420
cf2 = 400
#每天的工厂吞吐量
f0 = 2000
f1 = 1500
f2 = 1000
#生产目标
目标= 80000
#时间限制
max_num_days = 30
num_factories = 3
在下一节中,我们将定义决策变量。
决策变量
在PuLP中,通过以下方式定义决策变量:
变量= LpVariable(“ variableName”)
有时我们需要为变量提供界限(默认为无界限),在这种情况下,我们将编写以下内容:
var = LpVariable(“ boundedVariableName”,lowerBound,upperBound)
在PuLP中定义变量的另一种有用方法是使用dicts函数。在我们需要定义大量相同类型和范围的变量的情况下,这很有用,variableNames是字典的键列表:
varDict = LpVariable.dicts(“ varDict”,variableNames,lowBound,upBound)
因此,根据先前的定义,计算机生产问题的决策变量是我们为每个工厂花费的生产天数:
#工厂
num_factories = 3个
factory_days = LpVariable.dicts( “factoryDays”,列表(范围(num_factories)),0,30,猫= “连续”)
约束条件
现在我们定义了决策变量,我们可以转到定义问题的约束条件了。注意,在线性编程设置中约束必须是线性的。我们关注的约束条件是,组装的单元数应大于或等于目标数量,并且生产约束条件是任何工厂的产量都不应该超过其他工厂的两倍:
#目标约束
c1 = factory_days [0] * f1 + factory_days [1] * f2 + factory_days [2] * f3> =目标
#生产限制条件
c2 = factory_days [0] * f0 <= 2 * factory_days [1] * f1
c3 = factory_days [0] * f0 <= 2 * factory_days [2] * f2
c4 = factory_days [1] * f1 <= 2 * factory_days [2] * f2
c5 = factory_days [1] * f1 <= 2 * factory_days [0] * f0
c6 = factory_days [2] * f2 <= 2 * factory_days [1] * f1
c7 = factory_days [2] * f2 <= 2 * factory_days [0] * f0
#将约束添加到问题
问题+ = c1
问题+ = c2
问题+ = c3
问题+ = c4
问题+ = c5
问题+ = c6
问题+ = c7
计算机组装问题的目标功能基本上是最小化组装所有这些计算机的成本。这可以简单地写成最大化负成本:
#目标函数
问题+ = -factory_days [0] * cf0 * f0-factory_days [1] * cf1 * f1-factory_days [2] * cf2 * f2
让我们看一下问题定义,这可以通过调用简单地实现:
打印(问题)
这导致以下输出,我认为这是不言自明的,它列出了问题中的目标函数,约束和各种决策变量:
computerAssembly:
MAXIMIZE
-900000 * factoryDays_0 + -630000 * factoryDays_1 + -400000 * factoryDays_2 + 0
SUBJECT TO
_c1:1500 factoryDays_0 + 1000 factoryDays_1 + 1000 factoryDays_2> = 80000
_c2:2000 factoryDays_0 - 3000 factoryDays_1 <= 0
_c3:2000 factoryDays_0 - 2000
factoryDays_2 <= 0 _C4:1500 factoryDays_1-2000 factoryDays_2 <= 0 _C5:
-4000 factoryDays_0 + 1500
factoryDays_1 <= 0 _C6:-3000 factoryDays_1 + 1000
factoryDays_2 <= 0 _C7:-4000 factoryDays_0 + 1000 factoryDays_2 <= 0
变量
factoryDays_0 < = 30连续
factoryDays_1 <= 30连续
factoryDays_2 <= 30连续
解决
在定义了线性编程问题中的所有必要条件之后,我们可以调用solve方法,如果解决了该问题,则输出1;如果不可行,则输出-1,这很简单:
#解决
问题.solve()
可以通过访问每个变量的varValue属性来获得该问题的解决方案:
对于范围(3)中的i:
print(f“ Factory {i}:{factory_days [i] .varValue}”)
结果为以下输出:
工厂0:23.076923
工厂1:15.384615
工厂2:30.0
在线性编程中,我们假 设变量之间的关系是线性的,并且变量本身是连续的。
上述就是关于Python中的线性编程:直接教程的全部内容介绍,想了解更多关于Python的信息,请继续关注。