让我描述一下我的问题:我有大约 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 的总和应该(不)至少达到