Excel 求解器从数字集的子集中找到目标总和
Excel Solver Finding a Target Sum from Subset of Number Set
我想使用求解器从较大集合的子集中找到目标总和。 (16 个数字的 10 个数字子集)。我对 Solver 不是很熟悉,我不确定设置约束的最佳方法。
我在集合中有 5 个类别的数字,A、B、C、D、E。16 个集合可能包括这些类别的不同组合,但目标子集总数具有明确的构成:
A、B、B、C、C、C、(B 或 C)、(B 或 C)、D、E
所以我的问题是,如何将这些规则引入规划求解?
其次,我知道 Solver 提出了 1 个解决方案,有没有办法获得一系列最接近目标的解决方案?所以,如果我有一个不能完全产生目标的集合,我可以看到 3 个最接近目标的解决方案(加号或减号)?
谢谢。
TL/DR - 这是设置您遇到的问题的方法。获得一系列 "close" 的答案超出了 Solver 的范围。如果您定义了额外的搜索条件,您可以使用 VBA 来完成。 (编辑 - 为定义的化妆添加设置)
评论
似乎没有关于"a number must be selected from each category"或"a number must be selected from category X"的标准。相反,你有一堆数字,每个数字都属于一个类别,但你想找到提供特定总数的数字组合 - 然后再调查类别。
初始问题设置
根据您在评论中提供的信息,我汇总了以下内容...
A 列(类别)和 B 列(值)是您提供的信息。 C 列(Selected)只是 0 或 1。D 列(结果)是向下填充的乘法 =B2*C2
。
F2 是 D 列的总和。G2 是此总和的目标值(如您提供的)。 H2 是计算的平方误差 =(F2-G2)^2
.
这是求解器设置...
- 设置Objective:设置为
$H
-计算的平方误差
- 至:设置为最小值。您可以选择 Value Of: 0,但如果没有确切答案,可能会失败。
- 通过更改可变单元格:设置为
$C:$C
或 C 列。
- 受约束:包括
$C:$C = binary
。这会强制值为 0 或 1。
- Select a Solving Method: 设置为 Evolutionary。 GRG Nonlinear有时可以解决这类问题,但比Evolutionary花费的时间要长得多。
以下是结果 - 与您报告的不同。当我强制你的结果时,我得到 106.61 的 CalcTotal(可能是某处的转录错误)...
寻找接近的结果
规划求解是一个优化器,因此它会找到最适合您的 objective 的 "the answer"。
为了让它给你提供不同的答案,你需要给它提供不同的objectives。
例如,您可能想要强制使用 C1 的解决方案,但仍然最接近您的 objective。设置可能如下所示...
...使用此解决方案...
在该示例中,我从 "By Changing Variable Cells:" 和 "Subject To Constraints:" 字段中排除了 $C
。完成同样事情的另一种方法是保持原始字段值不变,但添加一个额外的约束 $C = 1
.
或者,作为另一个示例,您可能想要一个从类别 B 中恰好选择两个值的解决方案。您可以修改设置以包括从每个类别中选择的值的总和,并添加一个约束。这是设置 ...
...以及对应的结果...
制定算法
如果您确定要查找的解决方案范围的标准,您可以设置一个 VBA 子程序来循环设置求解器、获取解决方案并存储 "Selected Column" 审核。
如果你想走这条路,我建议你看看本站提供的其他解决方案,尝试设置一些东西,如果有问题再问一个新问题。
编辑 - 遗漏了一个条件
我错过了你的发言 - "the target subset total has a defined makeup: A, B, B, C, C, C, (B or C), (B or C),D, E"
在这种情况下,使用包含每个类别总和的设置,您可以指定这些约束...
- $G$4 = 1
- $G$5 <= 4
- $G$5 >= 2
- $G$6 <= 5
- $G$6 >= 3
- $G$7 = 1
- $G$8 = 1
第一次通过时,它提供了这样的结果:A1、B2、B3、C1、C3、C4、C5、C6、D1、E1,总计 106.38。
我想使用求解器从较大集合的子集中找到目标总和。 (16 个数字的 10 个数字子集)。我对 Solver 不是很熟悉,我不确定设置约束的最佳方法。
我在集合中有 5 个类别的数字,A、B、C、D、E。16 个集合可能包括这些类别的不同组合,但目标子集总数具有明确的构成: A、B、B、C、C、C、(B 或 C)、(B 或 C)、D、E
所以我的问题是,如何将这些规则引入规划求解?
其次,我知道 Solver 提出了 1 个解决方案,有没有办法获得一系列最接近目标的解决方案?所以,如果我有一个不能完全产生目标的集合,我可以看到 3 个最接近目标的解决方案(加号或减号)?
谢谢。
TL/DR - 这是设置您遇到的问题的方法。获得一系列 "close" 的答案超出了 Solver 的范围。如果您定义了额外的搜索条件,您可以使用 VBA 来完成。 (编辑 - 为定义的化妆添加设置)
评论
似乎没有关于"a number must be selected from each category"或"a number must be selected from category X"的标准。相反,你有一堆数字,每个数字都属于一个类别,但你想找到提供特定总数的数字组合 - 然后再调查类别。
初始问题设置
根据您在评论中提供的信息,我汇总了以下内容...
A 列(类别)和 B 列(值)是您提供的信息。 C 列(Selected)只是 0 或 1。D 列(结果)是向下填充的乘法 =B2*C2
。
F2 是 D 列的总和。G2 是此总和的目标值(如您提供的)。 H2 是计算的平方误差 =(F2-G2)^2
.
这是求解器设置...
- 设置Objective:设置为
$H
-计算的平方误差 - 至:设置为最小值。您可以选择 Value Of: 0,但如果没有确切答案,可能会失败。
- 通过更改可变单元格:设置为
$C:$C
或 C 列。 - 受约束:包括
$C:$C = binary
。这会强制值为 0 或 1。 - Select a Solving Method: 设置为 Evolutionary。 GRG Nonlinear有时可以解决这类问题,但比Evolutionary花费的时间要长得多。
以下是结果 - 与您报告的不同。当我强制你的结果时,我得到 106.61 的 CalcTotal(可能是某处的转录错误)...
寻找接近的结果
规划求解是一个优化器,因此它会找到最适合您的 objective 的 "the answer"。
为了让它给你提供不同的答案,你需要给它提供不同的objectives。
例如,您可能想要强制使用 C1 的解决方案,但仍然最接近您的 objective。设置可能如下所示...
...使用此解决方案...
在该示例中,我从 "By Changing Variable Cells:" 和 "Subject To Constraints:" 字段中排除了 $C
。完成同样事情的另一种方法是保持原始字段值不变,但添加一个额外的约束 $C = 1
.
或者,作为另一个示例,您可能想要一个从类别 B 中恰好选择两个值的解决方案。您可以修改设置以包括从每个类别中选择的值的总和,并添加一个约束。这是设置 ...
...以及对应的结果...
制定算法
如果您确定要查找的解决方案范围的标准,您可以设置一个 VBA 子程序来循环设置求解器、获取解决方案并存储 "Selected Column" 审核。
如果你想走这条路,我建议你看看本站提供的其他解决方案,尝试设置一些东西,如果有问题再问一个新问题。
编辑 - 遗漏了一个条件
我错过了你的发言 - "the target subset total has a defined makeup: A, B, B, C, C, C, (B or C), (B or C),D, E"
在这种情况下,使用包含每个类别总和的设置,您可以指定这些约束...
- $G$4 = 1
- $G$5 <= 4
- $G$5 >= 2
- $G$6 <= 5
- $G$6 >= 3
- $G$7 = 1
- $G$8 = 1
第一次通过时,它提供了这样的结果:A1、B2、B3、C1、C3、C4、C5、C6、D1、E1,总计 106.38。