【问题标题】:Looking for a multidimensional optimization algorithm寻找多维优化算法
【发布时间】:2023-03-25 19:55:01
【问题描述】:

问题描述

  • 有不同的categories,其中包含任意数量的elements
  • 共有三个不同的attributes A、B 和 C。每个元素都有这些attributes 的其他分布。此分布通过正整数值表示。例如,元素 1 具有属性A: 42 B: 1337 C: 18。这些属性的总和在元素上不一致。有些元素比其他元素拥有更多。

现在的问题:

我们希望从每个类别中准确选择一个元素,以便

  • 我们在属性 A 和 B 上达到了一定的阈值(超过它也是可能的,但不是必需的)
  • 同时获得最大数量的 C.

示例:我们希望在所有选定元素上的总和至少达到 80 A 和 150 B,并希望尽可能多的 C。


我已经考虑过这个问题,无法想象一个有效的解决方案。样本量约为 15 个类别,每个类别最多包含约 30 个元素,因此暴力破解似乎不是很有效,因为可能存在 30^15 种可能性。

我的模型是我将其视为具有深度的树类别数。每个深度级别代表一个类别,让我们可以选择从该类别中选择一个元素。当传递一个节点时,我们将表示元素的属性添加到我们想要优化的总和中。

如果我们在同一级别上多次点击相同的属性组合,我们会将它们合并,以便我们可以剥离已计算值的多次计算。如果我们达到一个路径在所有三个属性中的价值都较低的水平,我们就不再从那里遵循它。

但是,在最坏的情况下,这棵树中仍然有大约 30^15 个节点。

你们中有人能想出一种算法来帮助我解决这个问题吗?或者你能解释一下为什么你认为不存在这样的算法吗?

【问题讨论】:

  • 如果您可以创建一个场景,这样我就可以看到您在说什么,这将有所帮助。我认为这是一个优化问题,但是如果你有一个满足要求的非最优解决方案,那是否足够?
  • 我正在寻找最佳解决方案。但是,也可以接受接近最佳的解决方案。满足要求是必须的。

标签: algorithm performance


【解决方案1】:

这个问题与knapsack problem 的变体非常相似。我会首先查看这个问题的解决方案,看看你能把它应用到你所说的问题上。

【讨论】:

  • 这方面的主要区别是,我没有属性 A 和 B 的上限。只要 C 保持最大,我可以尽可能多地超过它们。因此,动态编程方法将不起作用。另外,我有背包问题没有的“每个类别一个元素”的限制。
  • 鉴于集合的大小,除非您有很多时间,否则不可能找到最佳解决方案。因此,为 A 和 B 创建一个具有接近上限的启发式方法可能会为您提供接近最优的答案,这反过来又会导致“类似于”背包问题。
【解决方案2】:

我的第一个倾向是尝试分支定界。你可以做广度优先或深度优先,我更喜欢深度优先,因为我认为它更干净。

简单地说,你有一个树遍历过程walk,它可以枚举所有可能性(也许它只有一个 5 级嵌套循环)。它增加了两件事:

  • 在此过程的每一步,它都会在那个时候跟踪cost,这只会增加成本。 (如果成本也能降低,那就更像是极小极大博弈树搜索。)

  • 该过程有一个参数budget,它不会搜索成本可能超过预算的任何分支。

然后你有一个外循环:

for (budget = 0; budget < ... ; budget++){
    walk(budget);
    // if walk finds a solution within the budget, halt
}

花费的时间在预算中呈指数级增长,因此更简单的案例花费的时间更少。您重新进行搜索这一事实并不重要,因为每个级别的预算所花费的时间都与之前所有级别的总和一样多或更多。

将此与某种关于您考虑分支的顺序的启发式方法结合起来,它可能会为您给出的典型问题提供一个可行的解决方案。

如果这不起作用,您可以使用基本的启发式编程。也就是手工做一些case,注意你是怎么做的。然后用同样的方式编程。

希望对你有帮助。

【讨论】:

  • 我理解这是因为 cost 是属性 A 和 B 的总和,直到图形的当前节点,并且 budget 是超出我们想要达到的阈值的合理数量。但是,我没有看到在您的方法中属性 C 的总和在哪里最大化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
  • 2022-01-07
  • 1970-01-01
  • 2018-03-17
相关资源
最近更新 更多