ナップザックの疑似ポリタイム アルゴリズムを に使用できますk=2
。私たちができる最善のことは、sum(S)/2 です。ナップザック アルゴリズムを実行する
for s in S:
for i in 0 to sum(S):
if arr[i] then arr[i+s] = true;
次に、sum(S)/2、次に sum(S)/2 +/- 1 などを見てください。
'k>=3' の場合、これは 3 分割問題のように NP 完全であると思います。
k>=3 に対してそれを行う最も簡単な方法は、力ずくで実行することです。これが 1 つの方法です。
import copy
arr = [1,2,3,4]
def t(k,accum,index):
print accum,k
if index == len(arr):
if(k==0):
return copy.deepcopy(accum);
else:
return [];
element = arr[index];
result = []
for set_i in range(len(accum)):
if k>0:
clone_new = copy.deepcopy(accum);
clone_new[set_i].append([element]);
result.extend( t(k-1,clone_new,index+1) );
for elem_i in range(len(accum[set_i])):
clone_new = copy.deepcopy(accum);
clone_new[set_i][elem_i].append(element)
result.extend( t(k,clone_new,index+1) );
return result
print t(3,[[]],0);
シミュレーテッド アニーリングは良いかもしれませんが、特定の解の「近傍」が明確ではないため、遺伝的アルゴリズムの方が適している可能性があります。サブセットのグループをランダムに選択することから始め、サブセット間で数値を移動することで「変異」します。