将子集和的近似算法转换为php代码

时间:2013-08-21 14:07:44

标签: php optimization subset-sum np

Cross-posted in MathExchange to elicit more responses

=============================================== =================================

我在StackOverflow中写了我的原始问题,当时我意识到它被问到before

事实证明我有一个所谓的子集和问题,所以我去wikipedia找到了这个部分。

The algorithm for the approximate subset sum problem is as follows:
 initialize a list S to contain one element 0.
 for each i from 1 to N do
   let T be a list consisting of xi + y, for all y in S
   let U be the union of T and S
   sort U
   make S empty 
   let y be the smallest element of U 
   add y to S 
   for each element z of U in increasing order do
      //trim the list by eliminating numbers close to one another
      //and throw out elements greater than s
     if y + cs/N < z ≤ s, set y = z and add z to S 
 if S contains a number between (1 − c)s and s, output yes, otherwise no

但是我在理解用维基百科写的伪代码时遇到了问题。

例如,我认为目标是找到可以匹配S的最接近的数字集。

但是这里是一个清单。这个带有元素0的S列表是什么?

究竟是什么if y + cs/N < z ≤ s?我怎么用代码写出来呢?

我希望有人可以帮我翻译成php代码。

至少我对此更为熟悉。它不一定是完整的翻译。

只要答案让我理解这个近似算法足以让我自己用PHP代码编写,那就可以了。

1 个答案:

答案 0 :(得分:3)

回答您在math.stackexchange.com上逐一发布的子问题:

S和小s之间有什么区别?S是一个列表变量,最初是列表{{1并且在代码执行过程中被修改。小[0]是一个保持不变的数字。具体来说,s是此问题的数字:

  

给定一组整数和一个整数 s ,是否有任何非空子集加到 s

s是什么?粗略地说,S表示我们可以使用的所有“有用”总和的集合到目前为止我们看到的元素(如果我没有记错的话)。

“包含元素0的列表”是否表示包含单个数字的列表,该数字为零?是的,这就是这个意思。

S的含义是什么?这意味着y + cs/N < z ≤ sy + c*s/N < z。因此,只要z ≤ s if(或两者),y + c*s/N ≥ z就会失败。

有些问题你没有问,但似乎有可能出现:

什么是z > s N是我们给出的集合中的元素数量。

什么是N xi是我们给出的集合中的 i -th元素。