Algorithm 折叠背包时,容量变化基于所选物品而不是数量

Algorithm 折叠背包时,容量变化基于所选物品而不是数量,algorithm,linear-programming,knapsack-problem,np-hard,Algorithm,Linear Programming,Knapsack Problem,Np Hard,折叠式背包问题是普通背包问题的推广,其中背包容量是所含物品数量的非增函数 有人知道什么名字,文献,算法。。。关于背包容量根据您选择的项目而变化的变体,即域是项目的动力集而不是项目数?对于“容量”的一般值,我相信您需要对集合元素进行某种枚举。如果我理解正确,它或多或少地对应于一个任意布尔值,即子集是否可行,其元素的权重之和是否低于其容量 背包问题中的“容量”是出现在约束右侧的东西,即 sum p_i x_i <= C 在经典的背包和 sum p_i x_i <= C (sum x_i

折叠式背包问题是普通背包问题的推广,其中背包容量是所含物品数量的非增函数


有人知道什么名字,文献,算法。。。关于背包容量根据您选择的项目而变化的变体,即域是项目的动力集而不是项目数?

对于“容量”的一般值,我相信您需要对集合元素进行某种枚举。如果我理解正确,它或多或少地对应于一个任意布尔值,即子集是否可行,其元素的权重之和是否低于其容量

背包问题中的“容量”是出现在约束右侧的东西,即

sum p_i x_i <= C
在经典的背包和

sum p_i x_i <= C (sum x_i)
在倒塌的背包里

因为这些都是线性约束,它们以某种程度上可预测的方式运行,避免了寻找所有可能的组合,即幂集元素来解决问题

现在,如果你对幂集的每个元素都有一个任意的容量值C_J,那么你的容量不是向量x的可预测函数,因此,从需要检查的列表中删除子集J的唯一方法是,如果它的值sum_J a_i x_i小于您已经发现可行的其中一个子集的值,则从容量中没有任何信息

这尤其意味着无法用整数规划对此进行建模,因为它要求每个C_J至少有一个约束条件,仅计算每个可行子集的成本将更有效

我会使用枚举算法,尽量减少搜索树

让我们按不增加的值a\u 0>=a\u 1>=…>=a\n

我们可以通过减少基数来寻找所有可能的子集。这是因为对于一些基数k,你知道,最大基数为k的最佳可能子集的值为M_k=sum{i=0}^k a_i,所以你可以在检查所有子集之前停止搜索,我想不出另一种方法来剪切搜索树

算法是:

从M:=0和k=n开始

重复:

如果基数k的值A比M好,则求其最佳子集 M:=最大A,M:迄今为止找到的最佳子集的值 如果M>=M_{k-1},停止:我们找到了最佳值 否则k:=k-1 要搜索基数k的最佳子集,可以使用a_i的顺序:

从{0,…,k}开始,递归地检查子集{0}uj',J'是{1,…,n}的基数k-1的子集, 然后用{2,…,n}等的基数k-1的子集J′检查形式{1}uj′的所有子集。 一旦找到可行子集,就更新绑定M

这也是因为不包含a_0,…,a_i的基数k的子集是以a_{i+1}+…+为界的a{i+k+1},当它低于当前界限M时,您可以立即停止

注:
我没有假设容量C_J。知道容量在集合论意义上是否在增加肯定很有趣,也就是说,如果J中包含了C_,你是指幂集基数的函数吗?出于好奇,你能举一个模型的例子吗?容量取决于你选择的项目集,而不是它的数量。设{a,b,c}为物品,如果你试图拾取{a},{a,b}或{a,c},背包的容量是不同的。很抱歉,这个问题不清楚。研究我的问题越多,我就知道C函数中有一些假设。如果X是Y的子集,则CX=>CY。这也意味着对于所有X,它都包含该CX