简介:这份Excel线性规划求解详解文档,适合需要通过电子表格软件解决生产计划、资源分配、投资组合优化等线性规划问题的职场人士与学生;压缩包仅含1个doc文档,大小约3.5MB,内容围绕Excel内置的规划求解加载宏展开。文档先说明加载规划求解宏的具体步骤,再系统讲解目标单元格、可变单元格、约束条件三项核心参数的设置与作用,并逐一解析最长运算时间、迭代次数、精度、允许误差、收敛度、采用线性模型等高级选项的适用场景。同时,结合添加约束、更改与删除约束、选择求解关系、使用推测与保存模型等操作,完整演示从模型建立、条件设置到输出最优解的求解流程,文中还介绍了估计、导数、搜索方式等进阶设置,帮助读者在实际应用中根据问题特点调整求解参数。全文结构清晰,由浅入深,既适合初学者按步骤学习,也可作为日常处理线性规划问题的参数速查手册;目前已有291人学习浏览。
1. 为什么说“规划求解”是 Excel 里最被低估的线性规划求解器
如果你每天的工作是排生产计划、做资源分配,或者给几条产线编配班组,那你大概率受够了手动试错的滋味:改一个数,所有结果跟着变,用 Excel 手工凑,永远不确定自己凑出来的方案是不是最优。Excel 里的“规划求解”加载宏,就是解决这一类线性规划问题的内置工具——把目标函数放进一个单元格,把决策变量锁进几个可变单元格,再把限制条件写成约束公式,它就能替你迭代出最大值或最小值。这篇内容面对的是明确诉求:想用 Excel 解线性规划但不知道加载宏在哪、参数不敢动的人。下面我会把从加载到求解、再到避坑的完整路径拆给你看,包含一个可以直接照抄的生产计划例子和一套排错思路。
2. 把“规划求解”拆开:加载方式、参数面板里的每个开关值不值得动
2.1 先在“加载项”里把它搬出来:Office 默认不送你求解器
安装 Office 的时候,默认安装方式不会把这个宏程序装进常用功能区,只有你手动勾选后才能看到“规划求解”按钮。以经典界面为例,加载步骤是这样:
- 左上角“Office 按钮”(新版在“文件”选项卡),点“Excel 选项”。
- 弹出对话框后,切到“加载项”页。
- 下方“管理”下拉框选“Excel 加载项”,点“转到”。
- 在“可用加载项”列表中,勾选“规划求解加载项”,点“确定”。
- 回到主界面,“数据”菜单下会出现“分析”分组,里面就有“规划求解”按钮。
这里有个容易混淆的点:“规划求解”和“数据分析”是两个不同的加载项。你做回归分析、描述统计时才需要“数据分析”;做线性规划、整数规划、运输问题,用的是“规划求解”。很多人两个一起勾,最后 Excel 启动明显变慢,这块我建议按需勾选。原文也提醒过:加载的宏越多,Excel 启动的时候就会越慢。
注意:如果“规划求解”按钮是灰色不可点击,先检查当前工作表是不是被保护了。工作表被保护时,“规划求解”不可用,需要在“审阅”里取消保护。
2.2 目标单元格、可变单元格和约束:三个术语对应数学模型的三个部分
打开“规划求解”对话框后,你会看到一个参数面板,上面这几项直接对应线性规划数学模型里的三要素:
| 线性规划数学模型 | 规划求解面板中的位置 | 关键限制 |
|---|---|---|
| 目标函数 max/min Z | 设置目标单元格 | 目标单元格必须是公式,不能是常量;可选最大值、最小值或指定数值 |
| 决策变量 x1, x2, … | 可变单元格 | 最多指定 200 个;必须直接或间接与目标单元格关联 |
| 约束条件 s.t. | 添加 / 更改 / 删除约束 | 可作用于可变单元格、目标单元格或其他相关单元格 |
目标单元格必须是一个公式,这一点很多人第一次用会翻车。你直接在单元格里敲一个数字,然后把它设为“目标单元格”,规划求解会无从下手,因为它要通过调整可变单元格来让这个公式值变大或变小,没有公式就没有优化对象。
“可变单元格”好比你模型里的决策变量。比如生产几件产品A、几件产品B,这类数量就是可变单元格。规划求解每次迭代都会改变这里面的数值,每次改变后重新算目标公式,直到满足约束且目标最优。
“推测”按钮是个省事的入口:你选定目标单元格后点“推测”,它会自动分析目标公式里引用了哪些非公式单元格,把这些引用填进“可变单元格”框。适合快速搭模型,但正式求解建议还是自己逐个指定,避免把不该当变量的成本系数也放进可变单元格。
2.3 选项面板里的参数:从“精度”到“假定非负”,每一个都怎么选
点“选项”进入高级设置,这里不会天天碰,但当你遇到“找不到解”“结果不对”时,真正要调的就是这些参数。常用参数说明如下:
| 参数 | 默认值 | 作用 | 我的一般调法 |
|---|---|---|---|
| 最长运算时间 | 100 秒 | 求解过程的时间上限,最大 32767 秒 | 小型问题默认即可;大模型设到 300 秒 |
| 迭代次数 | 100 次 | 迭代运算次数上限,最大 32767 次 | 有整数约束时建议调大 |
| 精度 | 0 到 1 之间的小数 | 判断约束单元格数值是否满足目标值或上下限 | 结果异常时先把它调大再试 |
| 允许误差 | 视版本而定 | 整数约束的问题中,允许结果与真实最优解的百分偏差 | 只对整数规划有效;越大速度越快,越小结果越准 |
| 收敛度 | 0 到 1 之间 | 最近五次迭代目标值变化小于该值时停止 | 只用于非线性问题;越小越精细 |
| 采用线性模型 | 未勾选 | 所有关系都是线性时,勾选后加速求解 | 线性问题必勾 |
| 自动按比例缩放 | 未勾选 | 输入和输出值量级差别很大时自动缩放 | 数量级差异大时勾选 |
| 假定非负 | 未勾选 | 对未设置下限的可变单元格假定下限为 0 | 多数线性规划的变量就是非负的,建议勾选 |
下面几个参数主要影响非线性问题的搜索方式:
- 估计:指定一维搜索中基本变量初始值的逼近方案。“正切函数”使用正切向量线性外推,“二次方程”用二次方程外推,后者精度更高。
- 导数:约束条件变化缓慢时用“向前差分”就好;约束变化迅速、接近限定值时用“中心差分”。中心差分计算量大,但在“规划求解”返回不了有效解时可能有帮助。
- 搜索:牛顿法需要内存多、迭代次数少;共轭法内存少,但迭代次数多。当问题规模大、内存有限时用共轭法。
我自己处理普通产线调度问题,习惯只勾“采用线性模型”和“假定非负”,其他不动。一旦求解报错,再按第 4 章的顺序去调。
3. 建模型并求解:一个生产线计划的完整操作流程
3.1 先把问题“摆放”到工作表:目标函数和约束写成公式
用一个可以直接照抄的例子:某工厂生产两种产品,产品A每件利润 3 万元,产品B每件利润 2 万元;生产一件产品A消耗资源1共 2 单位、资源2共 1 单位;生产一件产品B消耗资源1共 1 单位、资源2共 2 单位。资源1最多 8 单位,资源2最多 10 单位,问各生产多少件,总利润最大。
在 Excel 里这样摆:
| 单元格 | 含义 | 初始值 |
|---|---|---|
| B1 | 产品A产量(决策变量 x1) | 0 |
| C1 | 产品B产量(决策变量 x2) | 0 |
| B2 | 总利润(目标) | =3B1+2C1 |
| B3 | 资源1消耗量(约束左侧) | =2*B1+C1 |
| B4 | 资源2消耗量(约束左侧) | =B1+2*C1 |
| B5 | 资源1上限 | 8 |
| B6 | 资源2上限 | 10 |
表格对应的公式代码块:
B2: =3*B1+2*C1 B3: =2*B1+C1 B4: =B1+2*C1公式里的引用逻辑是:B1、C1是可变单元格,目标单元格 B2 直接引用它们,资源消耗约束 B3、B4 也引用它们。规划求解只能改 B1 和 C1,改完之后 B2、B3、B4 跟着更新。求解前,可变单元格最好填 0 或某个看起来可行的值,比如填(1,1)。对于线性模型来说,初始值不会改变最终最优解,但会给求解器一个合理的起点,减少无关迭代。
注意:约束公式的右侧也可以放在单元格里,比如 B3<=B5,比直接写 B3<=8 更清晰,后续改上限只改单元格,不用重设约束。
3.2 设置规划求解参数:从“设置目标”到“添加约束”三步走
点击“数据”→“规划求解”,打开参数对话框,按这个顺序设置:
- 设置目标单元格:选 $B$2。
- 到:选“最大值”。如果要做成本最小化,就选“最小值”;如果想达到指定目标,选“值为”,在框里输入数字。
- 通过更改可变单元格:选 $B$1:$C$1。
- 添加约束:点“添加”,在“单元格引用位置”填 $B$3,比较关系选 <=,约束值填 $B$5;再添加一条 $B$4<=$B$6。
- 回到选项,勾选“采用线性模型”和“假定非负”,点“确定”。
- 最后点“求解”。
添加约束对话框里可选的比较关系,除了常用的 <=、=、>=,还有“Int”和“Bin”。这两个是整数约束和 0-1 约束,只应用于可变单元格。千万别手动在“约束值”框里敲“integer”或“binary”,那样会报错,应该在比较关系下拉列表里点选。
3.3 读取结果与报告:先看状态,再看报表
点“求解”后,如果顺利会弹出“规划求解结果”对话框。这时先别急着点“确定”,看两件事:
第一,看第一行描述。如果显示“已找到一解,满足所有约束及最优性条件”,说明得到了最优解;如果显示“规划求解已收敛到当前结果”,这个说法更常出现在非线性问题里,表示最近五次迭代目标值变化很小,是正常停止。如果显示“达不到精度要求”或“未找到合适结果”,就要回到第 4 章排查。
第二,决定是否保存结果。选“保存规划求解结果”,工作表里会保留最新的可变单元格数值;选“恢复为原值”,可变单元格会回到你求解之前填的初始值。我一般会先选“保存”,如果后续检查发现问题,再用“恢复为原值”重新来。
右侧的“报告”区可以生成三类报表:
| 报表类型 | 内容 | 什么时候看 |
|---|---|---|
| 运算结果报告 | 列出目标单元格初始值、最终值,可变单元格最终值,以及每个约束的状态 | 常规验收,看约束是否都松绑或贴紧 |
| 敏感性报告 | 给出目标函数系数的允许变化范围、约束右侧值的影子价格 | 想知道哪个资源是瓶颈时看这个 |
| 极限报告 | 列出每个可变单元格单独的上下限 | 分析单个决策变量的可行边界 |
敏感性报告比较实用。比如资源1的约束是紧的,报告里会显示它的影子价格,意思是每增加 1 单位资源1,总利润还能涨多少。做资源采购决策时,这个数就是谈判底线。
3.4 完整调整一次:如果答案不理想,按这个顺序调参
求解结果不合理时,我一般按这个顺序操作:
先检查公式引用,再检查约束方向,然后暂时取消“采用线性模型”,改换搜索算法,最后调整初始值。千万不要从头开始重建模,先把目标单元格、可变单元格和约束这几项映射关系核对一遍,80% 的问题出在这里。比如上面那个例子,如果把约束 B4<=B6 写成了 B4>=B6,目标值算出来会是另一套东西,而 Excel 不会因此报错,它只会老老实实告诉你“找到了满足约束条件的最优解”,但这个最优解不是你要的问题。
4. 避坑排错:规划求解常见问题与处理思路
4.1 “尚未找到满足要求的结果,规划求解即停止运行”
现象:点“求解”后没出现最优结果提示,直接弹出信息说尚未找到满足要求的结果,或者求解过程运行了几秒就被中断。
原因:大概率是三种情况——求解过程中你点了“停止”按钮;勾选了“显示迭代结果”,在单步迭代时手动中断;或者勾选了“采用线性模型”,但实际问题是非线性的。
解决:先把“显示迭代结果”复选框取消勾选,让它一口气跑完;再把“采用线性模型”临时取消,比较结果有没有变化;如果目标单元格数值一直在单向增大或减小时停不下来,通常说明漏了一条关键约束,回表格检查约束条件。
4.2 整数约束没生效,结果带着小数
现象:明明要求产品数量必须是整数,求解结果却出现 2.3、7.8 这种小数。
原因:添加约束时,有人直接在“约束值”框里手敲“integer”或“binary”,没有走关系下拉列表;或者把“整数”约束加到了约束单元格而不是可变单元格上。
解决:打开“添加约束”,在中间的比较关系下拉列表里选“Int”,此时“约束值”框会自动显示“整数”,然后点确定。0-1 变量也一样,在关系列表里选“Bin”,约束值会显示“二进制”。另外注意“Int”和“Bin”只能施加在可变单元格上,加在目标单元格或约束单元格上不生效。
4.3 结果和手算差得远,甚至目标值发散
现象:规划求解给的结果比手工尝试的方案还差,或者目标单元格数值不断增大、减小不收敛。
原因:一种是约束条件设置不完整,少了限制条件,模型被放开了;另一种是输入输出数值数量级差太多,比如可变单元格在个位数,约束值达到上万;还有一种是非线性问题下初始值选得不好。
解决:勾选“自动按比例缩放”,先把数量级干扰排除;对于非线性问题,把可变单元格初始值设成你预估的最优值附近,不要从 0 开始;检查当前工作表中的约束数量和条件完整性,特别留意那些影响目标公式却没有加约束的单元格。
4.4 勾了“采用线性模型”,求解却提示不满足线性条件
现象:明明在选项里勾选了“采用线性模型”,跑完却提示无法满足线性模型条件,或者结果对工作表中的公式无效。
原因:你的公式里存在非线性成分。常见有两种:一是两个可变单元格直接相乘,比如 B1*C1;二是可变单元格被套进了指数、对数、绝对值这类函数。它们从数学上就不是线性关系。
解决:先勾选“自动按比例缩放”再跑一次,如果问题依旧,把“采用线性模型”取消勾选,改用默认的非线性算法。排查时留意是否用了 INDIRECT、LOOKUP 这类间接引用函数,它们会让“规划求解”难以识别线性结构。
4.5 “规划求解”在目标或约束单元格中发现错误值
现象:弹出对话框提示在目标或约束单元格中发现错误值,整个求解过程无法继续。
原因:目标单元格或约束单元格里的公式计算出错,比如除数为 0、引用位置为空、返回 #VALUE!;或者“添加约束”对话框里键入了无效名称。
解决:逐格检查目标单元格和约束单元格的公式,确认每个引用的单元格都有有效数值;打开“添加约束”检查引用位置是否真实存在;删掉手动输入的“integer”或“binary”,改用关系列表的“整数”和“二进制”。
5. 进阶实战:整数规划、运输问题与最大流验证
5.1 整数规划和 0-1 规划:一个“Int/Bin”开关解决
整数规划在线性规划之上多了一道约束:所有决策变量必须是整数。以第 3 章的生产计划为例,把 B1、C1 都限制为整数:
在“规划求解参数”对话框中点“添加”,单元格引用位置填 $B$1:$C$1,比较关系选“Int”,确定后再求解。求解器会在整数约束下搜索最优组合。
0-1 规划更简单,所有变量只能是 0 或 1。此时有两种常见做法:一是给变量加“Bin”约束;二是先加“>=0”和“<=1”,再加“Int”。实际派工问题、选址问题都属于 0-1 规划,比如某人做某事费用最小,选 or 不选,用“Bin”最直接。
需要留意“允许误差”这个参数只对整数约束问题起作用。如果它设置比较大,求解会更快,但可能停在次优整数解上,偏差在允许范围内。要严格整数最优,把允许误差设到 0.0001 附近再解。
5.2 运输问题:SUMPRODUCT 算成本,行约束和列约束分开上
运输问题的经典场景是:多个产地往多个销地送货,单位运价已知,每个产地有产量限制,每个销地有销量需求,求总运输费用最小的方案。Excel 里用 SUMPRODUCT 函数最顺手,它算的是两个等尺寸矩阵对应元素乘积的和,正好就是“运价 × 运量”的总费用。
建一个 2 个产地、3 个销地的小模型:
| 区域 | 内容 |
|---|---|
| D2:F3 | 单位运价矩阵 |
| H2:J3 | 决策变量运量矩阵(可变单元格) |
| K2 | =SUM(H2:J2),产地1的总运出量 |
| K3 | =SUM(H3:J3),产地2的总运出量 |
| L2:L3 | 产地1、产地2的产量上限 |
| H4 | =SUM(H2:H3),销地1的总运入量 |
| I4 | =SUM(I2:I3),销地2的总运入量 |
| J4 | =SUM(J2:J3),销地3的总运入量 |
| H5:J5 | 销地1、2、3的销量需求 |
| B8 | =SUMPRODUCT(D2:F3,H2:J3),总运费目标 |
规划求解参数设置:
- 设置目标单元格:$B$8,选“最小值”。
- 可变单元格:$H$2:$J$3。
- 添加约束:$K$2:$K$3 <= $L$2:$L$3,$H$4:$J$4 >= $H$5:$J$5。
- 勾选“假定非负”和“采用线性模型”。
运输问题有个常见坑:产量总和与销量总和不一致。如果你把约束写成等号,而供需不平衡,规划求解报告找不到合适结果。一般做法是增设一个虚拟产地或虚拟销地,把不平衡的量补平。具体补在哪一端,看产量大还是销量大。
5.3 最大流问题也用得上:别被“非线性”框住
最大流问题同样能用“规划求解”做,它本质上是线性规划:把每条弧上的流量当作决策变量,目标函数是源点的总流出量最大化,约束是每条弧的容量上限和中间节点的流量守恒。目标函数和约束都是流量相加,没有变量之间的乘法,所以“采用线性模型”可以放心勾选。
在表上建模时,每一行代表一条有向边,流量放在可变单元格,容量放在约束右侧;每个中间节点的流入减流出等于 0,用等式约束写。顶点少的时候,这样做比手算快得多;顶点一多,建议还是用专业网络流工具,Excel 的迭代优势会下降。
5.4 我自己验证解法的一个习惯
做完第 3 章的产线模型后,我会手动验算一遍:最优解 x1=2,x2=4 时,资源1消耗 2×2+4=8,刚好贴紧上限;资源2消耗 2+2×4=10,也贴紧上限;总利润 3×2+2×4=14 万元。用这个结果反代入约束公式,确认没有漏掉任何一条限制。
然后我会做一个更简单的检查:把 B1、C1 初始值改成(0,0),再次求解。如果两次结果一致,说明模型在线性关系下稳定;如果不一致,一定存在非线性公式或引用错位。从那以后我每次批量出报告前都强制走一遍这个验证流程:先用初始值(0,0)求解一遍,再手动代入最优解核对一次,最后才把报告贴出去。希望帮到你。
本文还有配套的精品资源,点击获取