Python中的Quine-McCluskey算法

Python中的Quine-McCluskey算法,python,algorithm,Python,Algorithm,我正在尝试用python编写,但我想看看是否有任何版本可以替代。谷歌搜索显示,几乎没有有用的结果。我在寻找4x4地图缩减,而不是2x2或3x3。有什么想法或参考资料吗?在您提供链接的维基百科中,底部有一些“外部链接”,其中包括与您的项目相关的有趣链接: 这难道不能满足你的需要吗 “一系列两篇文章,描述在R:and中实现的算法。R实现是详尽的,它提供完整而精确的解决方案。它处理多达20个输入变量。” 您可以使用ToR语言来运行Quine-McCluskey算法的R代码。请注意,这里重写了rpy

我正在尝试用python编写,但我想看看是否有任何版本可以替代。谷歌搜索显示,几乎没有有用的结果。我在寻找4x4地图缩减,而不是2x2或3x3。有什么想法或参考资料吗?

在您提供链接的维基百科中,底部有一些“外部链接”,其中包括与您的项目相关的有趣链接:

  • 这难道不能满足你的需要吗

  • 一系列两篇文章,描述在R:and中实现的算法。R实现是详尽的,它提供完整而精确的解决方案。它处理多达20个输入变量。

    您可以使用ToR语言来运行Quine-McCluskey算法的R代码。请注意,这里重写了rpy:rpy2

    另外,为什么不使用Adrian Duşa在2007年对算法进行的改进来编写一个新的Python脚本呢


vi启动了,多亏了对第二篇文章的引用,我的心都被编码出来了。谢谢!:)这个算法是只计算质数牵连还是也计算本质质数牵连?@HighwayJohn:不管结果如何,它肯定不是极小值;我有一个10位的例子,有149个,这里的算法将其归结为137个求和,但我知道最小求和的上限是119。
def combine(m, n):
    a = len(m)
    c = ''
    count = 0
    for i in range(a): 
        if(m[i] == n[i]):
            c += m[i]
        elif(m[i] != n[i]):
            c += '-'
            count += 1

    if(count > 1): 
        return None
    else:            
        return c


def find_prime_implicants(data):
    newList = list(data)
    size = len(newList)
    IM = []
    im = []
    im2 = []
    mark = [0]*size
    m = 0
    for i in range(size):
        for j in range(i+1, size):
            c = combine( str(newList[i]), str(newList[j]) )
            if c != None:
                im.append(str(c))
                mark[i] = 1
                mark[j] = 1
            else:
                continue

    mark2 = [0]*len(im)
    for p in range(len(im)):
        for n in range(p+1, len(im)):
            if( p != n and mark2[n] == 0):
                if( im[p] == im[n]):
                    mark2[n] = 1


    for r in range(len(im)):
        if(mark2[r] == 0):
            im2.append(im[r])

    for q in range(size):
        if( mark[q] == 0 ):
            IM.append( str(newList[q]) )
            m = m+1

    if(m == size or size == 1):
        return IM
    else:
        return IM + find_prime_implicants(im2)


minterms = set(['1101', '1100', '1110', '1111', '1010', '0011', '0111', '0110'])

minterms2 = set(['0000', '0100', '1000', '0101', '1100', '0111', '1011', '1111'])

minterms3 = set(['0001', '0011', '0100', '0110', '1011', '0000', '1000', '1010', '1100', '1101'])

print 'PI(s):', find_prime_implicants(minterms)

print 'PI2(s):', find_prime_implicants(minterms2)

print 'PI3(s):', find_prime_implicants(minterms3)