【问题标题】:Combinatorial Optimization - Variation on Knapsack组合优化 - 背包的变体
【发布时间】:2011-09-14 02:37:08
【问题描述】:

这是一个现实世界的组合优化问题。

我们获得了特定产品的大量价值主张。价值主张有不同的类型,但每种类型都是独立的,并为整个产品增加了同等的利益。在构建产品时,我们可以包含每种类型的任何非负整数“单元”。然而,在添加了某种类型的第一个单元之后,该类型的额外单元的边际收益不断减少。事实上,新单元的边际收益是添加新单元后该类型单元数量的倒数。我们的产品必须至少有一个某种类型的单元,并且由于这个要求,我们必须对整体价值进行一个小的修正。

T[] 是一个数组,表示产品的某个生产运行中每种类型的数量。那么整体值V由(伪代码)给出:

V = 1
For Each t in T
    V = V * (t + 1)
Next t
V = V - 1 // correction

在成本方面,相同类型的单位具有相同的成本。但是不同类型的单位都有独特的、非理性的成本。类型的数量很大,但我们得到了一个类型成本数组C[],它从最小到最大排序。让我们进一步假设类型数量数组T[] 也按成本从小到大排序。那么总成本U就是每个单位成本的总和:

U = 0
For i = 0, i < NumOfValueTypes
    U = U + T[i] * C[i]
Next i

到目前为止一切顺利。那么问题来了:给定产品P 的价值V 和成本U,找到产品Q 的成本U' 和价值V',具有最小的U' 使得@987654335 @, V'/U' &gt; V/U.

【问题讨论】:

  • 我不明白这个问题。你的意思是:给定 P 的值为 V 和成本 U。问题是找到具有最小成本 U' 的产品 Q,使得 U'>U 和V'/U' > V/U ?
  • 你从不使用这句话:“但是,在添加某种类型的第一个单元后,该类型的额外单元的边际收益不断减少。实际上,一个新单元的边际收益是添加新单位后,该类型的单位数量的倒数。” T[] 真的代表每种类型的好处吗?
  • 你能发布一个完整的例子并完成它吗?我不确定你在问什么。
  • @Ricky,是的,这完全正确,我已经编辑了帖子以澄清它。
  • @Ricky,关于您的第二条评论,T[] 与通过在第一个代码块中产生V 的公式有关的好处。您可以将T[] 视为一种特征集,但随着相同类型的特征堆积起来,它们不会产生相同的好处。是的,T[] 是一个非负整数数组。

标签: algorithm optimization combinations


【解决方案1】:

您描述的问题是非线性整数规划问题,因为它包含整数变量t 的乘积。它的可行性集不是封闭的,因为严格不等式可以通过使用非严格不等式并在右侧添加一个小的正数(epsilon)来解决。那么这个问题可以在 AMPL 中表述如下:

set Types;
param Costs{Types};      # C
param GivenProductValue; # V
param GivenProductCost;  # U
param Epsilon;

var units{Types} integer >= 0; # T
var productCost = sum {t in Types} units[t] * Costs[t];

minimize cost: productCost;
s.t. greaterCost: productCost >= GivenProductCost + Epsilon;
s.t. greaterValuePerCost:
  prod {t in Types} (units[t] + 1) - 1 >=
    productCost * GivenProductValue / GivenProductCost + Epsilon;

这个问题可以使用非线性整数规划求解器来解决,例如Couenne

【讨论】:

  • 谢谢。我认为你在正确的轨道上。我会试试你的答案。
  • 顺便说一句,在这种情况下,“非字符串”不等式是什么意思?
  • @ThomasMcLeod:这是一个错字,我的意思是“不严格”。固定。
  • epsilon 构造是有问题的,因为数组T[] 可能非常大,而且我无法提前知道我是否可能缺少使用任何特定 epsilon 的解决方案。我想知道是否有任何方法可以使用开放的可行性集来做到这一点。事实证明,尽管 C[] 中的值是非理性的,但 U 的值是离散的,可以投影到整数上。我目前正在做的是遍历U 的这些预测值,然后使用算法找到最大的对应V。这适用于小数字,但运行时间在U 中呈指数增长。
  • @ThomasMcLeod:我不知道在开放可行性集上运行的任何 MP 方法。但是,由于 GreaterValuePerCost 的左侧是整数,并且 (productCost * GivenProductValue / GivenProductCost) 不一定是整数,因此即使删除 Epsilon 也不太可能获得相等性。如果它们恰好相等,您可以按照orinanobworld.blogspot.com/2012/04/k-best-solutions.html 中的说明截断解决方案,直到找到满足严格不等式的解决方案。
【解决方案2】:

老实说,我认为没有简单的方法可以解决这个问题。最好的办法是编写系统并使用求解器求解(Excel 求解器可以解决问题,但您可以使用Ampl 来求解这个非线性程序。)

计划:

Define: U;
        V;
        C=[c1,...cn];

Variables: T=[t1,t2,...tn];

Objective Function: SUM(ti.ci)

Constraints:

For all i: ti integer
SUM(ti.ci) > U 
(PROD(ti+1)-1).U > V.SUM(ti.ci)

它适用于 excel,(您只需将 >U 替换为 >=U+d ,其中 d 是成本的有效数字 - (即如果 C=[1.1, 1.8, 3.0, 9.3] d =0.1)因为excel 不允许求解器中存在严格不等式。)

我想使用像 Ampl 这样的真正求解器会完美运行。

希望对你有帮助,

【讨论】:

    猜你喜欢
    • 2019-02-08
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多