1

そこで、私にとって有用な特性を生み出すパーティションのペアを生成するために、次のコードを書きました。これらの出力から生じるプログラムを並列化しようとしています。

注: r と n はほぼ任意ですが、2 から 16 の範囲になる傾向があります。

from itertools import combinations_with_replacement

def conjugate(p1):
    p = list(p1)
    if p == []:
        return p1
    else:
        l = len(p)
        conj =  [l]*p[-1]
        for i in xrange(l-1,0,-1):
            conj.extend([i]*(p[i-1] - p[i]))
        return conj

def dominates(p1,p2):
    sum1 = 0
    sum2 = 0
    min_length = min(len(p1), len(p2))
    if min_length == 0:
        return len(p1) >= len(p2)

    for i in range(min_length):
        sum1 += p1[i]
        sum2 += p2[i]
        if sum2 > sum1:
            return False
    return bool(sum(p1) >= sum(p2))


def partition_lists(r,n):
    half = n*r/2
    combDict = {}
    for a in range(half,n*r+1):
        combDict[a] = []
    for a in combinations_with_replacement(range(0,n+1),r):
        if sum(a) >= half:
            combDict[sum(a)].append(list(reversed(a)))
    for key,item in combDict.iteritems():
        for i in range(len(item)):
            for j in range(len(item)):
                rp = [2*n - 2*a for a in item[i]]
                cp = [2*n - 2*a for a in item[j]]
                rpN = filter(lambda a: a != 0, reversed(rp))
                cpN = filter(lambda a: a != 0, reversed(cp))
                if dominates(conjugate(rpN),cpN):
                    yield item[i],item[j]

最初の 2 つの関数はしっかりしていますが、最後の関数で使用されています。最後の関数は、私が「重い」行列と呼んでいるものの行と列の合計を生成し、これらの値に基づいて、「軽い」行列 (rp,cp) の行と列の合計を計算し、優位性をテストして軽い行列は実行可能です。軽い行列は、重い行列の半分の重みの 0 と 1 だけです。問題は、大量のデータを生成し、支配関数と共役関数に取り掛かると、その約半分を処理することです。どういうわけかこれをより速く行う方法、または不要なデータをより早く切り取る方法はありますか? また、partition_lists からの出力でより多くのプロセスを実行する別の関数を並列化する方法はありますか?

4

0 に答える 0