使用Solver时所有单元格仅输出‘1’,问题出在哪?
Solver全分配1的问题排查与解决
一、核心原因
- 目标函数未明确:你没给Solver设定明确的优化目标(比如让M1/M2/M3分别匹配K1/K2/K3,或最小化误差),Solver只会返回一个满足基础约束的“随便解”,全设1是最容易达成的选择。
- 约束设置不全/错误:
- 没给H列单元格添加「只能取1、2、3整数」的约束,或者约束范围设错(比如只设了整数没限定1-3)。
- 没给M1/M2/M3添加与K值匹配的约束(比如
M1=6878、M2=13843.42),Solver不知道要往哪个方向调整。
- 公式验证疏漏:检查
SUMIF公式是否正确,比如H列范围是否覆盖H2:H82,B列是否为可求和的数值型数据。
二、正确的Solver配置步骤
- 设定目标:
- 若要严格匹配K值,可设置目标单元格为
=SUM(ABS(M1-K1),ABS(M2-K2),ABS(M3-K3)),选择「最小值」(最小化总误差)。 - 若只需要近似匹配,也可以单独对每个M值设置范围约束(比如
M1>=6800且M1<=6900)。
- 若要严格匹配K值,可设置目标单元格为
- 指定可变单元格:选中H2:H82(需要分配1/2/3的单元格)。
- 添加约束:
- 给H2:H82添加三个约束:
H2:H82 >=1、H2:H82 <=3、H2:H82 整数,确保取值范围正确。 - 添加M值与K值的匹配约束(根据需求选严格相等或范围)。
- 给H2:H82添加三个约束:
- 选择求解方法:因为是离散整数分配问题,选择「演化」算法(适合非线性、整数规划场景),不要用单纯线性规划。
三、是否需要换VBA?
优先调对Solver参数——绝大多数情况是设置问题,不是工具不适用。如果数据量极大、约束极复杂,Solver无法找到满意解,再考虑VBA:
- 完全遍历所有组合不可能(81个单元格有3^81种组合),可以写启发式算法,比如贪心分配:先计算每个B值对应到K1/K2/K3的匹配度,优先给单元格分配能让M值快速接近K值的类别,再逐步微调。
内容的提问来源于stack exchange,提问作者karlos Santos
相关产品推荐
相关产品推荐

