奎因-麦克拉斯基算法(Quine-McCluskey算法)是最小化布尔函数的一种方法。它在功能上等同于卡诺图,但是它具有文字表格的形式,因此它更适合用于电子设计自动化算法的实现,并且它还给出了检查布尔函数是否达到了最小化形式的确定性方法。
方法涉及两步:
#找到这个函数的所有素蕴涵项。
#使用这些素蕴涵项(prime implicant)来找到这个函数的本质素蕴涵项(essential prime implicant),对覆盖这个函数是必须的其他素蕴涵项也同样要使用。
复杂度
尽管在处理多于四个变量的时候比卡诺图更加实用,奎因-麦克拉斯基算法也有使用限制,因为它解决的问题是NP-困难的:奎因-麦克拉斯基算法的运行时间随输入大小而呈指数增长。可以证明对于n个变量的函数,素蕴涵项的数目的上界是3n/n。如果n = 32,则可能超过6.1 * 1014,或617万亿个素蕴涵项。有大量变量的函数必须使用潜在的非最优的启发式方法来最小化。
例子
最小化一个任意的函数:
:f(A,B,C,D) =\sum m(4,8,10,11,12,15) + d(9,14). \,
你能轻易的形成这个表的规范的积之和表达式,简单的通过总和这个函数求值为一的那些极小项(除掉那些不關心項):
:f_{A,B,C,D} = A'BC'D' + AB'C'D' + AB'CD' + AB'CD + ABC'D' + ABCD \,
第一步找到素蕴涵项
当然,这的确不是最小化的。为了优化,所有求值为一的极小项都首先放到极小项表中,不關心項也可以加入這個表中與極小項組合:
现在你可以开始把极小项同其他极小项组合在一起。如果两个项只有一个二进制位的数值不同,则可以这个位的数值可以替代为一个横杠,来指示这个数字无关紧要。不再组合的项标记上 "*"。
第二步找到本质素蕴涵项
没有项可以继续进一步这样组合,所以现在我们构造一个本质素蕴涵项表。纵向是刚才生成的素蕴涵项,横向是早先指定的极小项。
这里的每个本质素蕴涵项都标记了星号 - 第二个素蕴涵项能被第三个和第四个所覆盖,而第三个素蕴涵能被第二个和第一个所覆盖,因此都不是本质的。如果一个素蕴涵项是本质的,则同希望的一样,它必须包含在最小化的布尔等式中。在某些情况下,本质素蕴涵形不能覆盖所有的极小项,此时可采用额外的简约过程。最简单的“额外过程”是反复试验,而更系统的方式是。在当前这个例子中,本质素蕴涵项不能处理所有的极小项,你可以组合这两个本质素蕴涵项與两个非素蕴涵项中的一个而生成:
:f_{A,B,C,D} = BC'D' + AB' + AC \,
:f_{A,B,C,D} = BC'D' + AD' + AC \,
最终的等式在功能上等价于最初的(冗长)等式:
f_{A,B,C,D} = A'BC'D' + AB'C'D' + AB'C'D + AB'CD' + AB'CD + ABC'D' + ABCD' + ABCD \,
参见
- 逻辑综合
- 布尔代数
- 规范形式 (布尔代数)
- 威拉德·冯·奥曼·蒯因
- 图灵归约
- 交互式证明系统
- 隨機預言機
外部链接
*[https://web.archive.org/web/20080117073434/http://www.omnistream.co.uk/qm/ Web-Based Quine-McCluskey Algorithm],an open source implementation written in PHP.([http://www.phpclasses.org/quine_mccluskey PHP Class])
*[https://web.archive.org/web/20080207022238/http://user.cs.tu-berlin.de/~lordmaik/projects/quinemccluskey/quinemccluskey/quineapplet.htm Java-Applet] Applet to minimize a boolean function based on QuineMcCluskey Algorithm. (German page)
- [http://www.inf.ufrgs.br/logics/ Karma 3] , A set of logic synthesis tools including Karnaugh maps, Quine-McCluskey minimization, BDDs, probabilities, teaching module and more. Logic Circuits Synthesis Labs (LogiCS) - UFRGS, Brazil.
- [http://134.193.15.25/vu/course/cs281/lectures/simplification/quine-McCluskey.html Lecture on the Quine–McCluskey algorithm]
- A. Costa [http://www.dei.isep.ipp.pt/~acc/bfunc/ BFunc] ,QMC based boolean logic simplifiers supporting up to 64 inputs / 64 outputs (independently) or 32 outputs (simultaneously)
- [https://web.archive.org/web/20080130134530/http://www25.brinkster.com/denshade/QuineMcCluskey.html Java applet] to display all the generated primes.
- Python [http://cheeseshop.python.org/pypi/qm/0.1 Implementation]
- [http://sourceforge.net/projects/quinessence/ Quinessence] ,an open source implementation written in Free Pascal.
- A literate program written in Java [http://en.literateprograms.org/Quine-McCluskey_algorithm_%28Java%29 implementing the Quine-McCluskey algorithm] 。
- [http://automatics.hit.bg/#minBool minBool] a Matlab implementation.
- [https://web.archive.org/web/20071216072432/http://cran.r-project.org/src/contrib/Descriptions/QCA.html QCA] an open source, R based implementation used in the social sciences, by Adrian Duşa
- A series of two articles describing the algorithm(s) implemented in R: [https://web.archive.org/web/20070823084159/http://www.compasss.org/Dusa2007.pdf first article] and [http://www.compasss.org/Dusa2007a.pdf second article]。
- The R implementation is exhaustive and it offers complete and exact solutions. It processes up to 20 input variables.
- [https://web.archive.org/web/20091026213335/http://geocities.com/abeautifulmind1998/ a Java program to display the boolean expresssion ..... by Manoranjan Sahu]
- [http://www-ihs.theoinf.tu-ilmenau.de/~sane/projekte/qmc/embed_qmc.html an applet for a step by step analyze of the QMC- algorithm by Christian Roth]
- [http://sourceforge.net/projects/qmcs SourceForge.net C++ program implementing the algorithm.]
- [http://search.cpan.org/~kulp/Algorithm-QuineMcCluskey-0.01/lib/Algorithm/QuineMcCluskey.pm Perl Module]
评论 (0)