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。