[英]function to find out how many magic squares are in rectangle made of n*m, where n,m - natural numbers
[英]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中的lpsolve
或lpSolveAPI
包或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.