与重复问题的大组合

数据挖掘 算法
2022-03-03 03:32:25

让我描述一下我的问题:我有大约 1500 个项目,所有项目都由 15 个数字(有理数、正数和负数)属性描述。

作为一个最小化的例子:

Item A:
- value I: 34
- value II: 12335
- value III: -10
- value IV: 0
....

Item B:
- value I: 500
- value II: -2332
- value III: 0
- value IV: 9
...

不,我必须将它们结合起来并找到最佳组合。有大约 70 个项目的空间,每个项目可以使用 n 次。

每个组合的性能可以通过使用 3 个属性的简单数学公式来确定,而其他属性必须匹配最小或最大要求才能确定组合是否有效。

因为有些物品对单个属性有很好的价值,但对其他属性是负面的,所以必须采取其他物品来补偿这些负面方面

现在我正在寻找一种方法/算法/工具来找到最佳组合或至少接近它。

我的方法是(在伪代码中)

//approach A
while(true)
  var best = generateRandomCombination()
  var challenger = generateRandomCombination()
  best = betterPerformanceIndicator(best, challenger)

在某些时候,我必须停止它并使用结果。试了一下,让它运行一个小时并记录每一个改进。可怕的表现,太多的随机性意味着重复。当然,它并没有接近我自己产生的结果。

//approach B
var best = generateRandomCombination();
while(true)
  var challenger = replaceSingleItemWithRandomOne(best)
  while (!challenger.isBetter(best) && untestedItemsLeft()){
    challenger = replaceWithOtherItem(best);
  }
  best = betterPerformanceIndicator(best, challenger)  

这种方法是某种近似,但我认为由于需要补偿,仅更改一项不会很有效。

所以我看到了两种可能的改进方法:-也许我应该给项目某种权重-替换比项目更多

您对改进我的方法或用更好的方法替换它有什么建议吗?这是某种数据挖掘问题吗?我应该学什么来处理它?

(如果我的问题在这里是错误的,我很抱歉。如果你能将我重定向到正确的堆栈交换部分会很好)

由于评论而添加的信息:

  • 一开始我必须修复容器属性,以确定是否有空间容纳 70、71 或其他物品。并确定每个属性的乘数。例如:“值 I”的容器乘数将为 1,1 - 将项目 A 和项目 B 相加得到 (34 + 500) * 1,1 = 587,4。
  • 所以你看,添加项目是简单的数学(加法和乘法)关于速度,我的第一个方法是使用列表用java编写的,但我没有跟踪这些单一操作的速度。
  • 项目的顺序不会影响结果,所以它是关于构建一个无序集,就像尼尔问的那样。
  • 计算总值的公式是:

    ( (所有 valueI 的总和) 乘以 (所有 valueII 和 valueIII 的总和) 的平方根)

  • min 和 max 要求只是自然数,所有 valueN 的总和应该(不)至少达到
1个回答

这听起来像是一个背包问题背包问题可以通过多种方式解决鉴于您的限制,可能可以接受近似解决方案,例如首次拟合递减 (FFD)。