python的线性函数吗 python求线性方程组( 四 )


引入这些更改后,您将获得一个新系统:
该系统与原始系统等效,并且将具有相同的解决方案 。应用这些更改的唯一原因是克服 SciPy 与问题表述相关的局限性 。
下一步是定义输入值:
您将上述系统中的值放入适当的列表、元组或NumPy 数组中:
注意:请注意行和列的顺序!
约束左侧和右侧的行顺序必须相同 。每一行代表一个约束 。
来自目标函数和约束左侧的系数的顺序必须匹配 。每列对应一个决策变量 。
下一步是以与系数相同的顺序定义每个变量的界限 。在这种情况下 , 它们都在零和正无穷大之间:
此语句是多余的,因为linprog()默认情况下采用这些边界(零到正无穷大) 。
注:相反的float("inf") , 你可以使用math.inf,numpy.inf或scipy.inf 。
最后,是时候优化和解决您感兴趣的问题了 。你可以这样做linprog():
参数c是指来自目标函数的系数 。A_ub和b_ub分别与不等式约束左边和右边的系数有关 。同样,A_eq并b_eq参考等式约束 。您可以使用bounds提供决策变量的下限和上限 。
您可以使用该参数method来定义要使用的线性规划方法 。有以下三种选择:
linprog() 返回具有以下属性的数据结构:
您可以分别访问这些值:
这就是您获得优化结果的方式 。您还可以以图形方式显示它们:
如前所述,线性规划问题的最优解位于可行区域的顶点 。在这种情况下,可行区域只是蓝线和红线之间的绿线部分 。最优解是代表绿线和红线交点的绿色方块 。
如果要排除相等(绿色)约束,只需删除参数A_eq并b_eq从linprog()调用中删除:
解决方案与前一种情况不同 。你可以在图表上看到:
在这个例子中 , 最优解是红色和蓝色约束相交的可行(灰色)区域的紫色顶点 。其他顶点,如黄色顶点,具有更高的目标函数值 。
您可以使用 SciPy 来解决前面部分所述的资源分配问题:
和前面的例子一样,你需要从上面的问题中提取必要的向量和矩阵,将它们作为参数传递给.linprog() , 然后得到结果:
结果告诉您最大利润是1900并且对应于x ? = 5 和x ? = 45 。在给定条件下生产第二和第四个产品是没有利润的 。您可以在这里得出几个有趣的结论:
opt.statusis0和opt.successis True , 说明优化问题成功求解 , 最优可行解 。
SciPy 的线性规划功能主要用于较小的问题 。对于更大和更复杂的问题,您可能会发现其他库更适合,原因如下:
幸运的是,Python 生态系统为线性编程提供了几种替代解决方案,这些解决方案对于更大的问题非常有用 。其中之一是 PuLP,您将在下一节中看到它的实际应用 。
PuLP 具有比 SciPy 更方便的线性编程 API 。您不必在数学上修改您的问题或使用向量和矩阵 。一切都更干净,更不容易出错 。
像往常一样 , 您首先导入您需要的内容:
现在您已经导入了 PuLP,您可以解决您的问题 。
您现在将使用 PuLP 解决此系统:
第一步是初始化一个实例LpProblem来表示你的模型:
您可以使用该sense参数来选择是执行最小化(LpMinimize或1,这是默认值)还是最大化(LpMaximize或-1) 。这个选择会影响你的问题的结果 。
一旦有了模型,就可以将决策变量定义为LpVariable类的实例:
您需要提供下限,lowBound=0因为默认值为负无穷大 。该参数upBound定义了上限,但您可以在此处省略它,因为它默认为正无穷大 。
可选参数cat定义决策变量的类别 。如果您使用的是连续变量,则可以使用默认值"Continuous" 。

推荐阅读