繁体   English   中英

如何在M包中分配N个数字以最小化某些目标功能?

[英]How to assign N numbers into M pack that minimize some target function?

我有N(例如30个)整数V[i]和M(例如8个)包装,每个包装都有一个期望值P[j]

我想每个整数分配给一个组,下面的表达式计算的总和之间的差V[k]在组,其j和包的预期值j

diff[j] = abs(P[j] - sum(V[k] that in pack j))

目标是找到最小化sum(diff[j])的最佳解决方案。

我不知道这种问题的类型是什么。 可以通过线性编程解决此问题,还是NP完全问题?

无论这是否具有NP难度,您都可以使用易于访问的整数编程软件来有效解决所需实例的问题。 对于您的问题,您可以定义x_ {ij}来定义是否将X [i]分配给组j。 然后,您还将定义变量d_j,它们是公式中的diff [j]。 那么您的模型是:

min_{x, d} \sum_{j=1}^M d_j
s.t.       d_j >= P[j] - \sum_{i=1}^N X[i]x_{ij} \forall j
           d_j >= \sum_{i=1}^N X[i]x_{ij} - P[j] \forall j
           \sum_{j=1}^M x_ij = 1 \forall i
           x_{ij}\in \{0, 1\}

这是一个混合整数优化模型,例如,可以使用R中的lpsolvelpSolveAPI包或MATLAB中的intlinprog函数来intlinprog

通过将另一个NP问题简化为NP,可以证明您的问题是NP。 换句话说,我将证明如果我可以回答这个问题,那么我可以立即回答另一个NP问题。

我要减少的特定问题是子集总和问题

V为数字集。 我们想知道sum(V)==0 P={0} (仅包含0的长度为1的数组)。 在这种情况下,当且仅当子集总和为0问题的最佳解决方案为sum(diff[j])==0 0 换句话说,子集总和问题是您问题的特例,因此您的问题至少与子集总和问题一样困难。

因此,您的问题是NP。 我仍然不确定它是否是NP-Complete。

通过从2分区 (2P)还原,这是NP困难的。 将当前问题更改为询问sum(diff [j])= 0的决策问题。 给定2P的实例,令P[0] = P[1] = sum(V)/2 如果存在两个分区,则显然存在一些sum(diff[j])=0赋值。

对于2分区,有一个psuedo-polytime算法,但是由于它不适用于> = 3分区,因此不太可能解决此问题。

似乎这类似于垃圾箱包装,但我不确定100%,因为您可能会溢出“垃圾箱”而不是“垃圾箱”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM