ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

线性规划实战:从生产计划到运输优化,掌握资源分配最优决策

线性规划实战:从生产计划到运输优化,掌握资源分配最优决策 1. 项目概述从“最优解”到“最优决策”线性规划这四个字听起来可能有点学术甚至有点枯燥。但如果你把它理解为“在有限的资源下找到最好的那个方案”是不是瞬间就接地气了无论是工厂里怎么安排生产能让利润最高还是物流公司怎么规划路线能让成本最低甚至是个人理财时怎么分配资金能让收益最稳背后都藏着线性规划的影子。它不是一个停留在教科书里的数学工具而是一套解决现实世界中“既要…又要…”这类两难问题的强大决策框架。这个经典案例分析就是要剥开线性规划那层看似复杂的数学外衣看看它到底是怎么在实际问题中“大显身手”的。我们会从一个最经典的“生产计划”问题入手一步步拆解如何把一个老板拍脑袋都算不清的难题翻译成数学语言然后交给“求解器”这个不知疲倦的超级算盘最后得到一个清晰、可执行的最优方案。更重要的是我们不仅要看“怎么做”更要深挖“为什么这么做”以及在实际操作中那些教科书里不会写的“坑”和“技巧”。无论你是刚接触运筹学的学生还是工作中需要做资源优化、成本控制的工程师或管理者这篇内容都能给你一套可以直接上手的方法论和避坑指南。2. 线性规划的核心思想与模型构建2.1 线性规划的“灵魂”三要素拆解任何一个线性规划问题无论它披着多么复杂的外衣其内核都由三个不可分割的要素构成决策变量、目标函数和约束条件。理解这三者就抓住了线性规划的命脉。决策变量就是你要做的“选择题”。比如一个工厂生产两种产品A和B那么决策变量就是“生产多少件A”和“生产多少件B”。我们通常用 x₁, x₂, … xₙ 来表示它们。这些变量必须是连续的通常可以是非整数除非特别说明为整数规划并且是我们希望通过模型计算出来的未知数。目标函数就是你做这些选择的“目的”。你是想利润最大还是成本最小目标函数就是用决策变量表达的这个“目的”。比如每件A产品利润100元每件B产品利润150元那么总利润 Z 100x₁ 150x₂。我们的任务就是找到一组 x₁, x₂ 的值让 Z 达到最大Maximize或最小Minimize。这个函数必须是线性的即变量之间只存在加减和常数倍乘的关系。约束条件就是你做选择时面临的“限制”。资源总是有限的机器每天只能工作8小时原材料库存只有100吨市场需求最多500件……这些限制都必须用决策变量的线性不等式或等式来表达。例如生产一件A需要2小时机器时间一件B需要3小时总机器时间不超过8小时那么约束条件就是 2x₁ 3x₂ ≤ 8。所有约束条件共同勾勒出了决策变量的“可行域”——所有被允许的解决方案的集合。注意初学者最容易犯的错误就是把非线性的关系比如“产品的销量和价格成反比”强行写成线性约束。线性规划之所以强大且可解正是源于其“线性”的假设。在建模前务必审视问题中的关系是否符合或可近似为线性。2.2 经典案例引入家具厂的生产困境让我们从一个耳熟能详的例子开始一家家具厂生产桌子和椅子。每张桌子利润为60元每把椅子利润为30元。生产一张桌子需要2个单位的木材和4个工时的劳动。生产一把椅子需要1个单位的木材和3个工时的劳动。工厂每天可用木材为100单位可用劳动工时为120工时。老板的问题是每天生产多少桌子和椅子才能让总利润最大现在我们按照三要素来构建模型决策变量设 x₁ 为每天生产的桌子数量x₂ 为每天生产的椅子数量。目标函数总利润 Z 60x₁ 30x₂。我们的目标是最大化 Z。约束条件木材约束生产所有桌子和椅子消耗的木材不能超过库存。2x₁ 1x₂ ≤ 100工时约束消耗的总工时不能超过可用工时。4x₁ 3x₂ ≤ 120非负约束生产数量不能为负。x₁ ≥ 0, x₂ ≥ 0于是完整的线性规划模型如下 Maximize Z 60x₁ 30x₂ Subject to: 2x₁ x₂ ≤ 100 4x₁ 3x₂ ≤ 120 x₁ ≥ 0, x₂ ≥ 0这个模型看似简单却包含了线性规划的所有精髓。它把“怎么安排生产最赚钱”这个模糊的管理问题转化成了一个清晰、无歧义的数学问题。接下来就是如何求解它。2.3 模型构建的常见陷阱与实用技巧在实际建模中远比这个例子复杂。以下是一些从经验中总结的要点陷阱1忽略隐含约束。在上面的例子中我们假设生产的产品都能卖出去。但现实中可能存在市场约束比如“椅子最多只能生产50把”。如果漏掉这个求出的“最优解”可能是生产80把椅子但实际只能卖出50把导致方案不可行。技巧在列出所有显式资源约束后一定要从市场、政策、合同等角度反复追问“还有没有其他限制”陷阱2对“线性”的误解。如果生产中存在规模效应比如生产第100张桌子时因为熟练度提升工时消耗降为3.5小时这就不是线性关系了。技巧对于轻微的非线性有时可以通过分段线性化来近似如果非线性很强则需要考虑其他模型如非线性规划。陷阱3单位不一致。这是最隐蔽的错误之一。例如木材库存单位是“立方米”但生产单件产品的消耗是“吨”如果没有统一单位模型将毫无意义。技巧在定义每个参数时立即标注其单位并在代入公式前进行一致性检查。实操心得在动手写数学公式之前先用一两句话把问题描述清楚并列出所有已知数据参数表和需要做的决定变量列表。这个简单的步骤能避免后续大量的混乱和返工。3. 求解方法从图解到单纯形法3.1 二维图解法可视化理解最优解对于只有两个决策变量的问题我们可以在平面直角坐标系中直观地求解。以上述家具厂问题为例。第一步绘制约束区域。将每个不等式约束转化为等式画出直线。对于 2x₁ x₂ ≤ 100先画直线 2x₁ x₂ 100。当 x₁0时x₂100当 x₂0时x₁50。连接(0,100)和(50,0)得到直线。由于是“≤”我们取直线下方的区域原点(0,0)满足 0≤100。对于 4x₁ 3x₂ ≤ 120画直线 4x₁ 3x₂ 120。当 x₁0时x₂40当 x₂0时x₁30。连接(0,40)和(30,0)。同样取直线下方区域。非负约束 x₁≥0, x₂≥0 表示我们只关心第一象限。所有约束条件定义的区域可行域就是这四个半平面在第一象限的重叠部分它是一个凸多边形四边形。第二步寻找最优解。目标函数 Z 60x₁ 30x₂ 可以改写为 x₂ Z/30 - 2x₁。这是一组斜率为-2的平行线Z的值决定了这条线在y轴上的截距Z/30。Z越大截距越大直线越靠上。 我们的目标是在可行域内找到一点使得穿过该点的目标函数等值线的Z值最大。由于可行域是凸多边形最优解一定出现在这个多边形的某个顶点上这是线性规划的一个关键定理。第三步计算顶点坐标并比较。可行域四边形的四个顶点分别是O(0,0)利润 Z 0A(30,0)由直线 4x₁3x₂120 与 x₂0 相交得出Z 6030 300 1800B(,)由直线 2x₁x₂100 和 4x₁3x₂120 联立方程解得。解这个方程组 2x₁ x₂ 100 ...(1) 4x₁ 3x₂ 120 ...(2) (1)式乘以2得4x₁ 2x₂ 200 ...(3) (3) - (2) 得-x₂ 80 x₂ -80这不符合非负约束 这里计算有误我们重新计算。 正确解法由(1)式得 x₂ 100 - 2x₁代入(2)式4x₁ 3*(100 - 2x₁) 120 4x₁ 300 - 6x₁ 120 -2x₁ -180 x₁ 90。代入得 x₂ 100 - 2*90 -80。这显然不在可行域内x₂为负。这说明我最初设想的交点B并不在可行域的边界上。我们需要找到正确的交点。实际上约束 2x₁x₂≤100 和 4x₁3x₂≤120 与坐标轴围成的可行域顶点是O(0,0)C(0,40)由 x₁0 和 4x₁3x₂120 得出求解 2x₁x₂100 和 4x₁3x₂120 的交点上面已算得 x₁90, x₂-80无效。求解 2x₁x₂100 和 x₂0 的交点 D(50,0)求解 4x₁3x₂120 和 x₁0 的交点即 C(0,40)求解 4x₁3x₂120 和 x₂0 的交点 A(30,0)但点D(50,0)不满足约束 4x₁3x₂≤120因为4*50200120。所以点D不在可行域内。因此真正的可行域是由直线 4x₁3x₂120、x₁0、x₂0 围成的三角形其顶点为 O(0,0), A(30,0), C(0,40)。第四步代入目标函数。O(0,0): Z 0A(30,0): Z 6030 300 1800C(0,40): Z 600 3040 1200比较可知在点A(30,0)处取得最大利润1800元。即最优生产计划是每天生产30张桌子0把椅子。这个结果可能有点反直觉为什么一把椅子都不生产因为从资源消耗看生产桌子对稀缺资源工时的“利润效率”更高。通过计算“单位资源利润”可以验证桌子消耗4工时赚60元即15元/工时椅子消耗3工时赚30元即10元/工时。在工时紧张120工时而木材相对宽松的情况下当然应该把所有工时用于生产利润效率更高的桌子。图解法虽然直观但仅限于二维。现实问题动辄几十上百个变量必须依靠代数算法。3.2 单纯形法高效搜索顶点的高维算法单纯形法是求解线性规划最经典、最核心的算法。它的智慧在于既然最优解在顶点那我就从一个顶点出发沿着可行域的边跳到相邻的另一个能使目标函数更优的顶点如此迭代直到找不到更优的相邻顶点为止。这就好比在一个多面体的各个顶点间攀登每一步都走向更高的海拔最终登顶。其实操过程涉及引入松弛变量、构造单纯形表、进行枢轴变换等系列操作。对于家具厂例子我们需要引入松弛变量 s₁ 和 s₂分别表示木材和工时的剩余量将不等式化为等式 2x₁ x₂ s₁ 100 4x₁ 3x₂ s₂ 120 x₁, x₂, s₁, s₂ ≥ 0目标函数不变Max Z 60x₁ 30x₂ 0s₁ 0s₂从一个初始可行解如不生产任何产品即 x₁0, x₂0, s₁100, s₂120开始通过单纯形表迭代最终会得到最优解 x₁30, x₂0, s₁40, s₂0。其中 s₁40 表示最优生产方案下木材还剩余40单位而工时(s₂)已被完全用尽。这印证了我们之前的分析工时是瓶颈资源。注意单纯形法在大多数实际情况下非常高效但其理论最坏情况下的时间复杂度是指数级的。不过在实际的商业、工程问题中它几乎总是表现良好。现在流行的求解器如CPLEX, Gurobi内部都高度优化了单纯形法及其变种对偶单纯形法。3.3 软件求解实战以Excel Solver和Python为例今天我们很少需要手工执行单纯形法。利用工具可以快速求解并做深入分析。Excel Solver规划求解在工作表中设置单元格B2桌子产量x₁B3椅子产量x₂B4总利润Z。B4单元格输入公式60*B230*B3。设置约束木材消耗2*B21*B3存放于B5要求 B5 100工时消耗4*B23*B3存放于B6要求 B6 120以及 B20, B30。打开【数据】-【规划求解】设置目标单元格为$B$4选择“最大值”通过更改可变单元格$B$2:$B$3添加上述约束。点击“求解”瞬间得到结果x₁30, x₂0, Z1800。你还可以生成“敏感性报告”它能提供影子价格、允许的增量等宝贵信息。Python (PuLP库) 对于更复杂或需要自动化的问题编程是更好的选择。PuLP是一个用户友好的线性规划建模库。from pulp import LpMaximize, LpProblem, LpVariable, LpStatus, value # 创建问题 prob LpProblem(Furniture_Production, LpMaximize) # 定义决策变量 x1 LpVariable(Desks, lowBound0, catContinuous) # 桌子 x2 LpVariable(Chairs, lowBound0, catContinuous) # 椅子 # 定义目标函数 prob 60*x1 30*x2, Total_Profit # 添加约束 prob 2*x1 x2 100, Wood_Constraint prob 4*x1 3*x2 120, Labor_Constraint # 求解 prob.solve() # 打印结果 print(fStatus: {LpStatus[prob.status]}) print(fOptimal number of Desks to produce: {value(x1)}) print(fOptimal number of Chairs to produce: {value(x2)}) print(fMaximum Total Profit: {value(prob.objective)}) # 输出影子价格对偶变量 for name, constraint in prob.constraints.items(): print(fShadow Price of {name}: {constraint.pi})运行这段代码你会得到相同的结果并且可以方便地扩展模型、批量处理数据或集成到更大的系统中。工具选型心得对于一次性、小规模且需要与业务人员如财务、运营协作沟通的问题Excel Solver是首选因为它直观、易分享。对于需要重复运行、处理大规模数据、或嵌入自动化流程的问题Python是更强大的选择。此外专业的优化求解器如Gurobi、CPLEX在求解速度、稳定性和处理超大规模问题方面具有绝对优势常用于工业级应用。4. 深度分析敏感性与对偶性得到一个最优解远不是终点。一个优秀的模型使用者必须能回答“如果情况变了会怎样”这类问题。这就是敏感性分析后优化分析的价值。4.1 敏感性分析当参数波动时继续我们的家具厂案例。假设市场变化桌子的利润从60元变成了70元最优生产计划需要改变吗或者如果我们能额外获得10个工时它能带来多少额外利润敏感性分析解答的就是这些问题。目标函数系数利润的允许变化范围 对于桌子利润60元求解器或敏感性报告会给出一个范围比如[40, 120]。这意味着只要桌子的利润在40元到120元之间当前的最优生产方案只生产桌子结构不变。如果利润低于40元可能生产椅子会变得相对划算如果高于120元则更应该全力生产桌子尽管工时限制可能使其无法无限增加。对于椅子利润30元在当前最优解中它不生产其允许范围会有一个“允许的减少值”为无穷大因为再降也不影响而“允许的增加值”则很小比如15元。这意味着如果椅子利润增加到45元以上它就可能进入最优生产组合。约束条件右端项资源量的允许变化范围与影子价格 这是更重要的分析。影子价格对偶变量衡量了某种资源每增加一个单位所能带来的目标函数利润的边际贡献。对于工时约束4x₁3x₂≤120其影子价格是15元/工时。这意味着在最优解附近每增加1个可用工时总利润能增加约15元。这为管理层决策提供了直接依据如果加班费低于15元/工时那么加班就是划算的。同时报告会给出工时的允许增加量如40小时和允许减少量如30小时在此范围内影子价格有效。对于木材约束2x₁x₂≤100其影子价格为0。因为在最优解下木材有剩余s₁40再增加木材库存不会带来任何利润增长所以其边际价值为0。实操心得永远不要只汇报一个孤零零的最优解数字。必须附上关键的敏感性分析结果尤其是影子价格。告诉决策者“根据模型我们目前最大的瓶颈是工时每增加一工时能多赚15元。而木材目前是充足的。” 这样的汇报才有决策支持价值。4.2 对偶问题另一个视角的洞察每一个线性规划问题原问题都有一个与之相伴的“对偶问题”。原问题是最大化利润对偶问题则可以理解为最小化资源的使用成本或“影子成本”。家具厂原问题Max Z 60x₁ 30x₂ s.t. 2x₁x₂≤100, 4x₁3x₂≤120, x₁,x₂≥0。 其对偶问题为Min W 100y₁ 120y₂ s.t. 2y₁4y₂≥60, 1y₁3y₂≥30, y₁,y₂≥0。 其中y₁和y₂可以解释为木材和工时的“内部估价”或“影子价格”。对偶问题的经济学解释假设有一个资源收购商他想购买该工厂的所有木材和工时资源。他需要给每种资源定一个单价y₁, y₂。他的目标是使总收购成本W最小。但同时他出的价必须足够高使得工厂觉得卖掉资源比自己生产更划算。例如对于桌子工厂自己生产每张桌子消耗2单位木材和4工时能赚60元。因此收购商出的价必须满足2y₁4y₂ ≥ 60否则工厂宁愿自己生产桌子而不是卖掉资源。椅子同理。对偶定理指出原问题的最优值Z等于对偶问题的最优值W。在我们的例子中Z*1800那么对偶问题的最优解(y₁*, y₂*)将使W*100y₁*120y₂*1800。并且y₁和y₂正是原问题中木材和工时约束的影子价格我们之前算得y₁*0, y₂*15代入验证1000120151800成立。理解对偶性不仅加深了对影子价格的认识有时求解对偶问题在计算上反而更高效例如当原问题约束远多于变量时。5. 线性规划的经典应用场景拓展线性规划的魅力在于其应用场景的广泛性。除了生产计划它还在以下领域发挥着核心作用。5.1 混合配料问题在石油精炼、饲料生产、化工行业中经常需要将多种原料按比例混合以最低成本达到产品规格要求。案例一家饲料公司要用玉米、豆粕、麦麸配制一种混合饲料要求蛋白质含量至少18%纤维含量不超过8%。每种原料的成本和营养成分含量已知。目标是确定每种原料的用量在满足营养要求的前提下使总成本最低。建模关键决策变量是各种原料的用量或比例。约束条件来自营养要求的上限或下限线性不等式以及总用量为100%的等式约束。目标函数是总成本最小化。5.2 运输与指派问题这是线性规划最经典的应用之一。运输问题有多个产地供应量已知和多个销地需求量已知以及从每个产地到每个销地的单位运输成本。如何安排运输计划在满足供需平衡的前提下使总运输成本最低建模关键决策变量是从产地i到销地j的运量。约束条件包括从每个产地运出的总量不超过其供应量运到每个销地的总量等于其需求量平衡条件。目标函数是总运输成本最小化。这个问题具有特殊的结构有更高效的专门算法如表上作业法但其本质仍是线性规划。指派问题是运输问题的特例。有n项任务和n个人每个人完成每项任务的成本或时间已知。如何给每个人分配一项且仅一项任务使得总成本最小或总效率最高建模关键决策变量是0-1变量表示“是否指派某人做某项任务”。约束条件是每个人只做一项任务每项任务只由一个人完成。这是一个整数规划问题但因其特殊的全单模矩阵性质其线性松弛的最优解自动是整数解因此可以用线性规划方法有效求解。5.3 投资组合优化简化版在金融领域马科维茨的均值-方差模型是投资组合理论的基础其核心是一个二次规划问题。但一个简化的版本是在给定预期收益率下限的前提下如何分配资金到不同资产使投资风险用资产收益的方差衡量这是二次的最小或者在给定风险承受上限的前提下如何使预期收益最大线性规划的应用点虽然完整的模型是二次规划但可以引入线性约束例如预算约束所有资产的投资比例之和为1。政策约束对某个行业或资产类别的投资比例不能超过某个上限。流动性约束现金类资产必须保持一定比例。 在求解更复杂的非线性目标时这些线性约束部分仍然由线性规划的思想来构建和管理。6. 建模实战进阶与常见陷阱6.1 处理“或”约束与固定成本问题现实问题往往比标准线性规划模型更复杂。“或”约束例如工厂可以选择使用机器A或机器B来生产一种产品但不能同时使用。这涉及到离散选择。标准线性规划无法直接处理“或”关系。解决方法之一是引入0-1变量yy1表示选择机器Ay0表示选择机器B。然后通过大M法构造约束条件将选择与连续变量关联起来。这就引出了混合整数线性规划。固定成本问题如果生产某种产品需要支付一笔固定的启动成本如设备调试费不生产则无需支付。总成本 固定成本如果生产0 可变成本*产量。这也不是线性关系。同样需要引入0-1变量来表示“是否生产”并用大M法将固定成本与生产决策关联。注意一旦引入整数变量尤其是0-1变量问题就变成了混合整数规划其求解难度会指数级增加。在建模时应仔细考虑是否真的需要整数约束。例如生产大量产品时将最优解中的小数取整通常对结果影响不大且可行但对于像“是否建厂”这种本质是0-1的决策则必须使用整数变量。6.2 数据质量与模型校验“垃圾进垃圾出”在优化领域尤其致命。一个再精巧的模型如果输入的数据不准其输出的“最优解”可能是灾难性的。数据收集要点区分参数类型明确哪些是精确已知的如合同价格哪些是估计或预测的如市场需求、加工时间。对于估计参数必须进行敏感性分析。单位一致性反复核对这是最低级却最常导致错误的环节。时间范围匹配确保所有数据如需求、产能、成本对应的是同一个计划周期如日、周、月。模型校验步骤面值检查将决策变量设为0或一个简单值手动计算目标函数和约束条件看是否与模型输出一致。极端测试测试一些极端场景如将所有资源投入一种产品看模型给出的解是否符合常识。回溯验证如果可能用历史数据运行模型将模型推荐的方案与当时实际执行的方案对比看模型结果是否更优或至少是合理的。与领域专家讨论将模型初步结果给业务人员看他们基于经验的第一直觉往往是发现模型假设错误的最佳途径。6.3 求解失败诊断与处理即使模型建好了求解时也可能遇到问题。常见状态及处理思路求解器状态含义可能原因与排查方向Optimal找到最优解任务完成进行后优化分析即可。Infeasible无可行解约束条件互相矛盾没有任何解能同时满足所有约束。检查约束是否过紧、数据是否有误如需求大于总产能。尝试逐步放松约束定位矛盾点。Unbounded无界目标函数值可以无限增大对于最大化问题。通常是因为漏掉了关键的限制约束。例如在利润最大化问题中如果没有任何资源或市场需求约束模型就会建议生产无限多的产品。Feasible或Iteration Limit找到可行解但未证明最优/迭代超限对于大规模或复杂问题求解器可能在规定时间内未找到最优解。可以尝试增加迭代次数或时间限制或者检查模型是否可以简化。遇到“Infeasible”的实战技巧不要慌。大多数求解器可以提供“IIS”不可行不可约子集即一组互相矛盾的约束的最小集合。这是调试模型的利器。例如模型可能同时包含了“总产量必须至少1000件”和“可用机器工时最多只能生产800件”这两个约束IIS会直接指出这两个约束冲突。7. 从理论到实践一个综合案例演练假设你是一家小型电商的运营负责管理两个仓库W1, W2向三个客户C1, C2, C3配送商品。你的目标是制定下周的配送计划。已知数据仓库库存W1有400件商品W2有500件商品。客户需求C1需要200件C2需要300件C3需要350件。总需求850件总库存900件供略大于求。单位运输成本元/件矩阵如下从\到C1C2C3W1469W27510此外由于长期协议从W1运往C2的货量不能超过150件。为了平衡仓库工作量要求从W1发出的总货量不少于其库存的40%。任务在满足客户需求可以不完全满足因为需求库存但发货量不能超过需求、不超仓库库存、并满足特殊约束的前提下如何安排运输使总运输成本最低建模步骤定义决策变量设 x_{ij} 为从仓库 i 运往客户 j 的商品数量其中 i1,2; j1,2,3。共6个变量。定义目标函数最小化总成本 Min Z 4x₁₁ 6x₁₂ 9x₁₃ 7x₂₁ 5x₂₂ 10x₂₃。定义约束条件供应约束库存限制从W1发出的总量不超过400x₁₁ x₁₂ x₁₃ ≤ 400从W2发出的总量不超过500x₂₁ x₂₂ x₂₃ ≤ 500需求约束发货量不超过需求运给C1的总量不超过200x₁₁ x₂₁ ≤ 200运给C2的总量不超过300x₁₂ x₂₂ ≤ 300运给C3的总量不超过350x₁₃ x₂₃ ≤ 350特殊约束W1到C2的运量上限x₁₂ ≤ 150W1发货量下限x₁₁ x₁₂ x₁₃ ≥ 0.4 * 400 160非负约束所有 x_{ij} ≥ 0。求解与解读 使用Python PuLP或Excel Solver求解此模型。from pulp import LpMinimize, LpProblem, LpVariable, lpSum, LpStatus, value # 定义问题 prob LpProblem(Warehouse_Transportation, LpMinimize) # 仓库和客户索引 warehouses [W1, W2] customers [C1, C2, C3] # 成本矩阵 cost { (W1, C1): 4, (W1, C2): 6, (W1, C3): 9, (W2, C1): 7, (W2, C2): 5, (W2, C3): 10, } # 供应量和需求量 supply {W1: 400, W2: 500} demand {C1: 200, C2: 300, C3: 350} # 决策变量 routes [(w, c) for w in warehouses for c in customers] x LpVariable.dicts(Route, routes, lowBound0) # 目标函数 prob lpSum([cost[(w, c)] * x[(w, c)] for (w, c) in routes]) # 供应约束 for w in warehouses: prob lpSum([x[(w, c)] for c in customers]) supply[w], fSupply_{w} # 需求约束 for c in customers: prob lpSum([x[(w, c)] for w in warehouses]) demand[c], fDemand_{c} # 特殊约束W1-C2上限 prob x[(W1, C2)] 150, W1C2_Max # 特殊约束W1发货量下限 prob lpSum([x[(W1, c)] for c in customers]) 160, W1_Min # 求解 prob.solve() print(fStatus: {LpStatus[prob.status]}) print(Optimal Transportation Plan:) for (w, c) in routes: if value(x[(w, c)]) 0: print(f {w} - {c}: {value(x[(w, c)]):.0f} units) print(f\nMinimum Total Transportation Cost: {value(prob.objective):.2f}元)运行后你可能得到如下结果W1 - C1: 200件W1 - C2: 150件W2 - C2: 150件W2 - C3: 350件总成本2004 1506 1505 35010 800 900 750 3500 5950元。结果分析C1的需求全部由成本最低的W14元满足。C2的需求被拆分W1运了上限150件6元剩余150件由成本次低的W25元满足。W1到C2的约束是活跃的。C3的需求全部由W210元满足尽管W1到C3成本是9元更低但W1的库存和发货下限约束使其资源优先分配给了C1和C2。W1总共发货350件200150满足了不低于160件的要求。W2发货500件150350用尽了库存。客户C3的需求被完全满足350件C1和C2的需求也被完全满足总发货量850件等于总需求没有浪费库存。这个案例展示了如何将复杂的现实业务规则特殊运输协议、仓库工作量平衡整合进标准的运输问题框架。通过敏感性分析你还可以知道如果放宽“W1到C2不超过150件”这个约束总成本能降低多少即该约束的影子价格从而评估这个长期协议的成本价值。线性规划的精髓就在于这种将模糊的商业决策转化为清晰、可量化、可优化的数学问题的能力。它提供的不仅是一个答案更是一套理解问题瓶颈、评估资源价值、进行“如果-那么”分析的系统性思维框架。掌握它意味着你多了一种在复杂约束下寻找最优路径的理性工具。
返回列表