Excel Solver无法找到可行解:旅行规划模型问题排查与解决
Excel Solver旅行规划无解问题排查与解决方法
核心原因分析
- 变量定义不完整:仅将「停留天数」设为可变单元格,但旅行规划需同时控制访问顺序+停留时长两个维度,缺少访问顺序相关变量(比如城市间行程的二进制标记、访问排序变量),导致「不前往同一城市」「抵达必须离开」这类依赖行程逻辑的约束无法被有效关联和满足。
- 约束逻辑冲突或表述模糊:
- 「非A城市仅到访一次」若仅通过停留天数约束,未明确“到访一次”是「停留天数≥1且仅出现在行程中一次」,单纯用COUNTIF判断停留天数>0的数量,无法约束行程中不重复访问。
- 「返回A市后停留天数≤1」未明确是否区分「出发前A市停留」和「返回后A市停留」,若总停留天数的计算未排除无关部分,会导致约束冲突。
- 求解器选型错误:默认的GRG非线性求解器不擅长处理包含多整数约束、组合逻辑的旅行商类问题,容易因搜索范围不足找不到可行解。
- 约束关联公式错误:比如用COUNTIF判断到访城市数量时,若单元格范围包含A市的停留天数,会导致统计结果偏差;IFERROR的误用可能掩盖了公式逻辑错误,而非解决问题。
具体解决方法
1. 补充变量维度
新增行程顺序变量,推荐两种方式:
- 二进制矩阵法:创建n×n的矩阵(n为城市总数),用
Xij=1表示从城市i前往城市j,Xij=0表示不前往,将此矩阵设为可变单元格(约束为二进制整数)。 - 排序变量法:为每个城市设置一个整数变量,用1、2、3...表示访问顺序(A市的顺序为1和最后一位),约束所有变量为不重复的正整数。
2. 修正约束逻辑与公式
针对核心约束重新梳理:
- 不重复访问非A城市:通过二进制矩阵约束每个非A城市的入度=出度=1(若到访),或排序变量中每个非A城市仅出现一次。
- 总停留天数=10(不含返回A市停留):公式计算所有到访非A城市的停留天数之和,约束其等于10;明确A市的停留天数仅统计返回后的部分,设为≤1。
- 到访非A城市数量=2:统计二进制矩阵中涉及的非A城市数量,或排序变量中非A城市的数量,约束其等于2。
- 从A市出发并返回:二进制矩阵中A市的出度=1、入度=1;排序变量中A市的顺序为1和最后一位。
3. 切换合适的求解器
在Solver参数中选择进化求解器(Evolutionary Solver),它更适合处理包含整数、组合逻辑的非线性规划问题;若模型可整理为线性逻辑,也可选择整数线性规划求解器。
4. 设置可行初始解
手动输入一个符合所有约束的行程方案(比如A→B→A,B停留10天;或A→B→C→A,B+C停留10天),作为初始值提供给Solver,帮助其快速定位可行域,避免空初始值导致的搜索盲区。
5. 逐行验证约束
逐个检查约束的公式和逻辑:
- 确认「抵达城市必须离开」的约束是针对除最终返回A市外的所有到访城市,通过二进制矩阵的入度=出度实现,而非仅依赖停留天数。
- 验证总停留天数的计算范围是否准确排除了返回A市后的停留天数。
内容的提问来源于stack exchange,提问作者dms_gg
相关产品推荐
相关产品推荐

