ARTICLE DETAIL

资讯详情

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

线性规划入门:Python与MATLAB实战,从建模到求解全解析

线性规划入门:Python与MATLAB实战,从建模到求解全解析 1. 项目概述为什么线性规划是数学建模的“第一块积木”如果你刚开始接触数学建模或者正准备参加亚太杯、国赛这类竞赛面对一堆算法名词感到无从下手那我建议你从“线性规划”开始。这不是因为它最简单——虽然它的核心思想确实直观——而是因为它太“基础”了基础到像盖房子前要打的地基或者像学编程时写的第一个“Hello World”。在数学建模的众多算法里线性规划Linear Programming, LP是那个你绕不开、且必须熟练掌握的工具。它解决的问题模型清晰在满足一系列线性等式或不等式约束的条件下最大化或最小化一个线性目标函数。听起来有点抽象我换个说法你手头资源有限比如时间、金钱、原材料要做的事情很多比如生产不同产品、安排不同任务怎么分配才能让收益最高或者成本最低这就是线性规划要干的活儿。我见过太多新手一上来就扎进神经网络、遗传算法这些“高级货”结果连一个简单的资源分配问题都建不好模。线性规划教会你的恰恰是最核心的建模思维如何把现实世界中模糊的“最优”问题翻译成数学世界里清晰的变量、约束和目标式。掌握了它你再去看整数规划、非线性规划甚至一些机器学习模型会发现很多思路是相通的。这次我们不空谈理论直接聚焦实战用 Python 和 MATLAB 这两大建模利器手把手实现线性规划求解并拆解每一步背后的“为什么”。你会发现那些看似枯燥的代码和公式一旦和具体的赛题案例结合立刻就生动起来了。2. 线性规划的核心思想与模型拆解2.1 从生活案例理解数学模型我们直接从一个经典的“生产计划问题”入手这是数学建模竞赛比如国赛、美赛中资源优化类题目的典型缩影。假设你是一个小工厂的厂长生产两种产品桌子和椅子。生产一张桌子需要2单位的木材和4小时的工时。生产一把椅子需要1单位的木材和3小时的工时。你手头每天可用的资源是100单位木材和120小时工时。已知每张桌子利润60元每把椅子利润30元。问题来了每天生产多少桌子和椅子能让总利润最大这个描述就是一个完美的线性规划原型。我们来完成关键的“翻译”工作定义决策变量这是建模的第一步也是最重要的一步。我们设x1为每天生产的桌子数量x2为每天生产的椅子数量。它们就是我们需要求出的、决定方案好坏的“未知数”。建立目标函数我们的目标是利润最大。总利润 桌子利润 椅子利润 60*x1 30*x2。我们要最大化这个式子Max Z 60*x1 30*x2。列出约束条件生产受资源限制。木材约束生产所有桌子用的木材 生产所有椅子用的木材 ≤ 总木材。即2*x1 1*x2 ≤ 100。工时约束生产所有桌子用的工时 生产所有椅子用的工时 ≤ 总工时。即4*x1 3*x2 ≤ 120。添加非负约束生产数量不能为负这是现实意义决定的。即x1 ≥ 0,x2 ≥ 0。于是我们得到了一个完整的线性规划标准模型Max Z 60*x1 30*x2 s.t. (满足于) 2*x1 x2 ≤ 100 4*x1 3*x2 ≤ 120 x1, x2 ≥ 0s.t.是 “subject to” 的缩写表示“受限于……”。这个模型里所有函数目标和约束都是变量的线性组合这就是“线性”的体现。注意很多新手容易忽略非负约束但在标准LP求解器中这通常是默认前提。如果你遇到变量可以为负的情况比如温度变化值那需要在代码中明确指定这是第一个容易踩的坑。2.2 模型标准化求解器能听懂的语言上面我们建的是“规范型”。但实际问题的约束可能是“≥”至少需要或“”恰好用完。主流求解器如linprog通常处理“标准型”目标函数求最小值所有约束条件为“≤”变量非负。所以我们需要掌握模型转换的技巧最大化转最小化Max Z等价于Min -Z。比如Max 60x130x2等价于Min -60x1-30x2。最终结果取相反数即可。“≥”约束转“≤”不等式两边同时乘以 -1不等号方向改变。例如x1 x2 ≥ 10等价于-x1 - x2 ≤ -10。“”约束处理等式约束a*x b可以拆成两个不等式约束a*x ≤ b和a*x ≥ b后者再按上述方法转换。但在代码中求解器通常有专门参数处理等式约束更高效。理解标准化至关重要因为后续写代码时矩阵A和向量b的构造都基于标准型。脑子里先完成转换能避免编码时符号混乱。2.3 几何直观图解法与解的空间对于只有两个变量的问题我们可以在平面上画图来直观理解。将x1和x2作为坐标轴每个线性不等式都表示一个半平面。所有约束半平面的公共交集形成一个凸多边形区域称为“可行域”。我们的解必须落在这个区域内。目标函数Z 60x130x2是一组平行的直线等利润线。我们移动这条直线使其在可行域内尽可能取得更大的Z值。你会发现最优解往往出现在可行域的一个“顶点”上除非目标函数直线与某条边界平行导致整条边都是最优。这个“顶点最优”性质是线性规划的核心定理之一也是单纯形法等算法的基础只需在有限的顶点中寻找最优解而不必遍历整个可行域。虽然三维以上我们无法画图但这个几何思想依然成立。高维空间中的“可行域”是一个“凸多面体”最优解仍在顶点或称“极点”达到。这解释了为什么线性规划能高效求解——算法本质上是在聪明的“爬山”从一个顶点沿着边“走”到更优的相邻顶点直到找到最高点。3. Python实现从SciPy到PuLP的实战详解Python在数学建模中的地位毋庸置疑生态丰富代码简洁。实现线性规划主流有两个库SciPy.optimize.linprog和PuLP。前者更接近底层数学模型适合理解原理后者建模语法更直观更贴近自然语言。3.1 使用SciPy.optimize.linprogSciPy是科学计算的核心库linprog函数实现了线性规划求解。我们用它来解决上面的生产计划问题。记住linprog默认求解最小化问题。首先将我们的模型转换为linprog标准型目标函数Min -Z -60*x1 - 30*x2不等式约束A_ub * x b_ub2*x1 1*x2 ≤ 100 4*x1 3*x2 ≤ 120所以A_ub [[2, 1], [4, 3]],b_ub [100, 120]变量边界x1, x2 0用bounds参数指定。import numpy as np from scipy.optimize import linprog # 定义目标函数系数求最小化所以取负 c [-60, -30] # 定义不等式约束矩阵 A_ub 和向量 b_ub A_ub [[2, 1], [4, 3]] b_ub [100, 120] # 定义变量边界非负 x0_bounds (0, None) # (下限 上限)None代表正无穷或负无穷 x1_bounds (0, None) bounds [x0_bounds, x1_bounds] # 调用linprog求解 res linprog(c, A_ubA_ub, b_ubb_ub, boundsbounds, methodhighs) # 输出结果 print(最优解状态:, res.message) print(最优解 (x1, x2):, res.x) print(最大利润 Z , -res.fun) # 注意取相反数得到原问题的最大值 print(松弛变量对应每个不等式约束:, res.slack)运行这段代码你会得到类似下面的输出最优解状态: Optimization terminated successfully. 最优解 (x1, x2): [30. 40.] 最大利润 Z 3000.0 松弛变量对应每个不等式约束: [ 0. 0.]结果解读x130, x240是最优生产计划。最大利润为3000元。松弛变量slack为[0., 0.]表示两个资源约束木材和工时都恰好用完没有剩余。这在优化中称为“紧约束”或“有效约束”它们直接决定了最优解的位置。如果某个松弛变量大于0则表示该资源有富余。实操心得一method参数的选择linprog内部有多种算法。早期版本常用simplex单纯形法理论经典适合教学理解。但从SciPy 1.6.0开始推荐使用highs它是 HiGHS 开源求解器的接口集成了原始/对偶单纯形法和内点法性能更强大、更稳定。对于大多数竞赛和科研问题用methodhighs准没错。3.2 使用PuLP进行直观建模PuLP采用了完全不同的建模哲学。你不需要手动处理最大化转最小化、构造矩阵而是像口述问题一样定义变量、目标和约束。对于复杂问题PuLP的代码可读性高得多。import pulp # 1. 创建问题实例指定名称和方向LpMaximize 或 LpMinimize prob pulp.LpProblem(Production_Planning, pulp.LpMaximize) # 2. 定义决策变量指定变量名、下限、上限None代表无限制、类型连续LpContinuous 整数LpInteger x1 pulp.LpVariable(Desk, lowBound0, catContinuous) x2 pulp.LpVariable(Chair, lowBound0, catContinuous) # 3. 定义目标函数 prob 60*x1 30*x2, Total_Profit # 4. 添加约束条件 prob 2*x1 x2 100, Wood_Constraint prob 4*x1 3*x2 120, Labor_Constraint # 5. 求解问题 prob.solve(pulp.PULP_CBC_CMD(msgFalse)) # 使用CBC求解器msgFalse关闭求解过程输出 # 6. 输出结果 print(f求解状态: {pulp.LpStatus[prob.status]}) print(f最优生产计划桌子 {pulp.value(x1)} 张 椅子 {pulp.value(x2)} 把) print(f最大利润: {pulp.value(prob.objective)} 元) # 7. 进阶查看影子价格对偶变量 print(\n--- 约束资源分析影子价格---) for name, constraint in prob.constraints.items(): print(f{name}: 影子价格 {constraint.pi})结果解读 除了得到相同的最优解和利润PuLP还能方便地获取影子价格constraint.pi。影子价格是线性规划对偶问题的解它表示该约束资源木材、工时每增加一个单位目标函数总利润能增加多少。在这个例子里两个约束的影子价格都会是正数因为约束是紧的具体数值需要运行代码查看。这个信息极具价值它能告诉厂长如果投资是应该优先购买木材还是增加工人哪个资源的边际效益更高实操心得二求解器选择PuLP默认调用开源的CBC求解器对于线性规划和整数规划MIP都很有效。你也可以安装更强大的商业求解器如Gurobi、CPLEX的接口只需将prob.solve()中的参数替换即可例如prob.solve(pulp.GUROBI_CMD())。在竞赛中如果问题规模很大一个好的求解器能节省大量时间。3.3 处理等式约束与变量范围实际问题中约束是多样的。假设我们新增一个合同约束桌子和椅子的总产量必须恰好是80件等式约束并且椅子产量不能超过50把上界约束。在PuLP中这非常直观# 接续上面的prob定义... # 添加等式约束 prob x1 x2 80, Contract_Exact_Quantity # 添加变量上界约束也可以在定义变量时指定这里用约束形式 prob x2 50, Chair_Max_Production prob.solve(pulp.PULP_CBC_CMD(msgFalse)) # ... 输出结果在SciPy的linprog中等式约束需要用A_eq和b_eq参数# 目标系数c不等式约束A_ub, b_ub边界bounds 同上略 # 定义等式约束 A_eq * x b_eq A_eq [[1, 1]] # x1 x2 b_eq [80] # 80 # 椅子产量上限 x2 50这个可以合并到不等式约束也可以放在bounds里更高效 # 方法一加到A_ub, b_ub (略) # 方法二修改x2的bounds bounds [(0, None), (0, 50)] # x1范围[0, inf), x2范围[0, 50] res linprog(c, A_ubA_ub, b_ubb_ub, A_eqA_eq, b_eqb_eq, boundsbounds, methodhighs)4. MATLAB实现linprog函数的深度应用MATLAB在工程界和学术界地位稳固其优化工具箱功能强大且稳定。对于线性规划核心函数就是linprog。它的逻辑与SciPy类似但语法和默认求解方式有差异。我们同样解决生产计划问题。MATLAB 的linprog标准形式是min f*x s.t. A*x ≤ b Aeq*x beq lb ≤ x ≤ ub4.1 基础求解与结果分析% 定义目标函数系数向量求最小化原问题求最大故取负 f [-60; -30]; % 定义不等式约束矩阵 A 和向量 b A [2, 1; 4, 3]; b [100; 120]; % 定义变量下界非负约束 lb [0; 0]; % 调用linprog求解 [x, fval, exitflag, output, lambda] linprog(f, A, b, [], [], lb); % 输出结果 fprintf(最优解桌子 %.2f 张 椅子 %.2f 把\n, x(1), x(2)); fprintf(最大利润%.2f 元\n, -fval); % fval是最小化目标值取负得原问题最大值 % 分析拉格朗日乘子影子价格 fprintf(\n--- 资源约束分析影子价格---\n); fprintf(木材约束的影子价格%.4f\n, lambda.ineqlin(1)); fprintf(工时约束的影子价格%.4f\n, lambda.ineqlin(2));关键输出解析x: 最优解向量。fval: 求解得到的目标函数最优值对应最小化问题。我们需要-fval来得到原最大化问题的利润。exitflag: 求解器退出标志。1表示成功找到最优解。其他值可能表示无解、无界或迭代超限这是必须检查的lambda: 拉格朗日乘子结构体包含对偶变量信息。lambda.ineqlin对应不等式约束的影子价格其顺序与A矩阵中的行顺序一致。影子价格为正值表示该资源增加能提升总利润数值大小反映了资源的稀缺性和边际价值。4.2 处理更复杂的约束与求解器选项MATLAB的linprog提供了丰富的选项来控制求解过程。例如我们想指定使用对偶单纯形法并显示迭代过程% 定义等式约束总产量80 Aeq [1, 1]; beq 80; % 定义变量上界椅子不超过50 ub [Inf; 50]; % x1无上界x2上界为50 % 设置优化选项 options optimoptions(linprog, Algorithm, dual-simplex, Display, iter); % 求解同时包含不等式、等式和边界约束 [x, fval, exitflag, output] linprog(f, A, b, Aeq, beq, lb, ub, options); fprintf(迭代次数%d\n, output.iterations); fprintf(求解算法%s\n, output.algorithm);实操心得三算法选择与规模MATLAB的linprog默认算法是‘dual-simplex’对偶单纯形法它在大多数情况下表现良好。对于特别大规模、稀疏的问题可以尝试‘interior-point’内点法。内点法在变量和约束数量极大时迭代次数相对稳定但每一步迭代计算量较大。在竞赛中对于几千变量/约束以内的问题默认算法足够。如果遇到求解慢或无解首先应检查模型是否正确如约束是否矛盾然后考虑调整算法或容差OptimalityTolerance,ConstraintTolerance。4.3 结果可视化与敏感性分析MATLAB在可视化方面有天然优势。我们可以绘制可行域和最优解点让结果一目了然。% 假设已求得最优解 x_opt [30; 40] x_opt x; % 接续上文的求解结果 % 1. 绘制可行域针对两个变量的情况 figure; hold on; grid on; % 绘制约束线 x1_line 0:50; % 约束1: 2*x1 x2 100 - x2 100 - 2*x1 x2_line1 100 - 2*x1_line; plot(x1_line, x2_line1, b-, LineWidth, 2); % 约束2: 4*x1 3*x2 120 - x2 (120 - 4*x1)/3 x2_line2 (120 - 4*x1_line)/3; plot(x1_line, x2_line2, r-, LineWidth, 2); % 填充可行域满足所有约束的区域 % 使用顶点填充法。先找到可行域多边形顶点本例中由坐标轴和两条约束线围成 % 顶点可以通过解方程组得到原点(0,0)与x2轴交点(0,40)与x1轴交点(30,0)两线交点(30,40) pgon polyshape([0, 0, 30, 30], [0, 40, 40, 0]); % 注意顶点顺序要能形成凸多边形 plot(pgon, FaceColor, g, FaceAlpha, 0.3, EdgeColor, k); % 2. 绘制等利润线和最优点 % 等利润线: 60*x1 30*x2 Z 取几个Z值 Z_levels [1800, 2400, 3000]; for Z Z_levels x2_profit (Z - 60*x1_line) / 30; plot(x1_line, x2_profit, k:, LineWidth, 1); text(x1_line(end), x2_profit(end), sprintf(Z%d, Z), FontSize, 8); end % 标记最优点 plot(x_opt(1), x_opt(2), rp, MarkerSize, 15, MarkerFaceColor, r); text(x_opt(1)2, x_opt(2), sprintf(Optimal (%.0f,%.0f), x_opt(1), x_opt(2)), FontWeight, bold); xlabel(桌子数量 x1); ylabel(椅子数量 x2); title(线性规划问题可行域与最优解); legend(木材约束: 2x1x2100, 工时约束: 4x13x2120, 可行域, 等利润线, 最优解, Location, best); axis([0 50 0 80]); hold off;这张图能直观展示为什么最优解在顶点以及约束如何“夹”出了最优解。在论文中插入这样的图能极大增强说服力和可读性。5. 数学建模竞赛中的典型应用与技巧线性规划在国赛、美赛、亚太杯等竞赛中应用极广绝不仅仅是简单的资源分配。下面结合几个典型赛题方向讲讲如何灵活运用。5.1 运输问题与网络流这是线性规划的经典应用。例如有多个仓库供应地和多个商店需求地每个仓库到每个商店的运输成本不同如何安排运输计划使总成本最低建模要点决策变量x_ij表示从仓库i运往商店j的货物量。目标函数最小化总运输成本∑∑ (cost_ij * x_ij)。约束条件每个仓库运出的总量不超过其供应量∑_j x_ij ≤ supply_i。每个商店接收的总量等于其需求量∑_i x_ij demand_j。非负约束x_ij ≥ 0。Python (PuLP) 实现片段示例import pulp import numpy as np # 假设数据 cost np.array([[2, 3, 4], [5, 1, 3]]) # 2个仓库到3个商店的成本 supply [100, 150] # 仓库供应量 demand [80, 70, 100] # 商店需求量 prob pulp.LpProblem(Transportation, pulp.LpMinimize) # 创建变量字典 x pulp.LpVariable.dicts(ship, ((i, j) for i in range(2) for j in range(3)), lowBound0) # 目标函数 prob pulp.lpSum(cost[i][j] * x[i, j] for i in range(2) for j in range(3)) # 供应约束 for i in range(2): prob pulp.lpSum(x[i, j] for j in range(3)) supply[i], fSupply_{i} # 需求约束 for j in range(3): prob pulp.lpSum(x[i, j] for i in range(2)) demand[j], fDemand_{j} prob.solve()技巧运输问题的约束矩阵具有特殊的结构全为0或1这类问题通常有更高效的专用算法。但在建模阶段我们无需关心直接用通用LP求解器即可。在论文中可以提及“该问题是一个标准的运输问题具有网络流特性”。5.2 投资组合优化均值-方差模型金融领域经典问题如何分配资金到若干资产在给定预期收益下最小化风险方差或在可接受风险下最大化收益马科维茨的均值-方差模型可以用二次规划描述但其核心约束资金分配比例和为1预期收益目标是线性的常作为线性规划的一部分或简化版出现。简化版建模线性化或目标为线性变量w_i投资于资产i的比例。约束∑ w_i 1资金全部分配。∑ (expected_return_i * w_i) target_return达到目标收益。w_i 0不允许卖空若允许则为无下界。目标最小化风险。风险若用绝对偏差或下方偏差的某种线性近似则可保持为线性规划。更常见的完整版是二次规划但线性版本作为初步筛选或简化分析非常有用。5.3 多目标规划与处理技巧现实中很多问题目标不止一个。比如生产计划中既要利润高又要碳排放低。这就是多目标规划。严格的多目标规划没有唯一最优解而是一组“帕累托最优解”。在数学建模竞赛中常用以下方法将其转化为单目标线性规划来处理权重法给每个目标分配一个权重加权求和为一个综合目标。Min/Max Z λ1 * (目标1) λ2 * (目标2)难点在于权重的选取需要灵敏度分析或依据决策者偏好。约束法将一个目标如碳排放作为约束给定一个上限优化另一个目标如利润。Max 利润s.t. 碳排放 ≤ C_max通过改变C_max的值可以得到帕累托前沿。分层序列法先优化最重要的目标将其最优值固定或放松一定范围再优化次重要目标。在代码中实现权重法PuLP# 假设目标1利润 Max 60x130x2 目标2污染 Min 5x18x2 (污染指数) # 转换为单目标Max λ*(利润) - (1-λ)*(污染) 其中λ在[0,1] lambda_weight 0.7 # 利润权重70%污染权重30% prob pulp.LpProblem(Multi_Objective_Production, pulp.LpMaximize) x1 pulp.LpVariable(x1, lowBound0) x2 pulp.LpVariable(x2, lowBound0) # 综合目标 prob lambda_weight * (60*x1 30*x2) - (1-lambda_weight) * (5*x1 8*x2), Combined_Objective # 添加原有资源约束... prob.solve()在论文中需要详细说明你选择该方法的原因并对权重或约束阈值进行讨论和灵敏度分析这是体现建模深度的关键。6. 常见错误、调试与性能优化即使模型建对了在实现时也可能遇到各种问题。这里汇总一些常见坑点和解决思路。6.1 求解失败常见原因与排查infeasible(不可行)求解器找不到满足所有约束的解。原因约束条件相互矛盾。例如要求x1 x2 10同时又要求x1 3且x2 4。排查检查每个约束的现实意义是否合理。逐步注释掉约束看是哪个或哪几个约束导致不可行。检查等式约束是否过“紧”与不等式冲突。在PuLP中可以尝试prob.solve(pulp.PULP_CBC_CMD(msgTrue))查看更详细的求解日志。unbounded(无界)目标函数值可以无限增大对于最大化问题或无限减小对于最小化问题。原因缺少必要的约束或者约束方向写反了。例如最大化x1x2但只有x10, x20没有上限。排查检查是否所有变量都有实际意义上的上界可能是通过约束间接限定。确保最大化问题中资源消耗类约束用的是“≤”最小化问题中需求满足类约束用的是“≥”。求解速度慢或迭代次数多原因问题规模大变量/约束上万或数值条件不好系数差异巨大。优化缩放数据如果成本系数是几百万资源量是个位数会导致数值不稳定。尝试将目标函数和约束同时除以一个合适的数使系数范围在[0.01, 100]左右。选择合适算法对于大规模稀疏问题尝试内点法 (method’interior-point’in SciPy/ MATLAB)。提供初始解某些求解器支持提供一个可行的初始点 (x0)可能加快收敛。但对于单纯形法初始点影响不大。检查模型冗余是否有重复或线性相关的约束可以尝试删除。6.2 Python vs. MATLAB 选择与混合使用Python (SciPy/PuLP)优势免费、开源、生态庞大。PuLP建模直观易于与数据分析pandas、可视化matplotlib流程集成。适合快速原型开发、算法研究以及需要与其他AI/机器学习库协作的场景。劣势默认的CBC或HiGHS求解器对于超大规模商业问题可能不如顶级商业求解器快。需要自己处理更多环境配置和依赖。MATLAB优势优化工具箱成熟稳定求解器尤其是连接Gurobi,CPLEX时性能强劲。调试方便帮助文档详尽。在学术界和工业界有深厚基础很多现成算法包。劣势商业软件需要授权。语法相对封闭与其他语言生态交互不如Python灵活。混合使用策略在竞赛中一种高效策略是用Python 进行数据预处理、清洗和探索性分析利用其强大的pandas, numpy库然后将构建好的模型系数矩阵导出为.mat或.csv文件再用MATLAB 进行核心的优化求解利用其稳定高效的求解器最后将结果导回 Python 进行可视化或报告生成。这结合了两者的长处。6.3 模型验证与灵敏度分析得到一个解后绝不能直接写在论文里。必须验证可行性验证将求得的解x*代入每一个约束条件手工或写几行代码计算看是否全部满足。检查等式约束是否近似相等考虑数值误差。敏感性分析赛后论文加分项目标函数系数变化利润60和30波动多大时当前最优解生产30桌40椅不变这称为“目标系数允许变化范围”。linprog的lambda输出或PuLP的prob.constraints属性不直接提供但可以通过重新求解微小扰动后的问题或使用求解器的敏感性分析功能如MATLAB的optimtool来探索。约束右端项变化资源100和120增加或减少一个单位利润能变化多少这就是影子价格对偶变量我们已经能从结果中获取。在论文中应解释影子价格的经济或物理意义。增加/减少约束如果增加一个新约束比如市场限制桌子最多卖35张利润会损失多少这可以通过求解新模型并与原模型对比得到。在论文中专门用一小节展示敏感性分析的结果并给出管理启示例如“根据影子价格工时的边际价值高于木材建议优先增加工人或提高工时效率”能极大提升论文的深度和实用性。线性规划作为运筹学和数学建模的基石其价值远不止于求解一个数学问题。它提供的是一种系统化的、量化的决策思维方式。从变量定义到约束书写每一个步骤都在训练你将混沌的现实抽象为清晰的逻辑。在Python和MATLAB中实现它就像是获得了将这种思维转化为实际解决方案的“编译器”。当你熟练之后你会发现很多看似非线性的、复杂的问题通过巧妙的线性化技巧比如分段线性化、0-1变量引入都能转化为线性规划或混合整数线性规划问题来解决。这才是线性规划这门“老手艺”在当今数据时代依然熠熠生辉的原因。在下一篇中我们将继续深入数学建模算法库探讨整数规划——当你的决策变量不能再是“生产0.5台机器”时你需要它。
返回列表