因此,我编写了以下代码,以产生对我有用的特征的分区对,并且我正在尝试并行化源自这些输出的程序。
注意: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]
前两个函数是可靠的,但在最后一个函数中使用。最后一个函数生成我称之为“重”矩阵的行和列总和,并根据这些值计算“轻”矩阵(rp,cp)的行和列总和,然后测试优势以查看是否轻矩阵是可行的,其中轻矩阵只有重矩阵一半权重的 0 和 1。问题是当我开始处理主导和共轭函数时,我生成了大量数据,其中大约一半。有没有办法以某种方式更快地完成这项工作,或者更快地删除不必要的数据?还有一种方法可以并行化另一个函数,该函数将在 partition_lists 的输出上运行更多进程?