简化布尔表达式的算法
Posted
技术标签:
【中文标题】简化布尔表达式的算法【英文标题】:Algorithm to simplify boolean expressions 【发布时间】:2016-06-30 01:59:54 【问题描述】:我想简化一个非常大的布尔函数形式:
f(a1,a2,....,an)= (a1+a2+a5).(a2+a7+a11+a23+a34)......(a1+a3+an).
'.'表示或
'+' 表示与
可能有 100 个这样的术语('.' 彼此) n 的值可能高达 30。
有没有可行的算法来简化这个?
注意:这不是一个实验室作业,它是我关于通过粗集生成规则的项目的一小部分,其中 f 是相异函数。
【问题讨论】:
由于并非所有语言都使用该符号,您能否具体说明.
和 +
运算符是什么?我假设 OR 和 AND?
“简化”是什么意思?
如果是这种情况,那么“简化”的主要方法是是否有可以拉出的 ALL OR 组中的术语。除此之外,您也许可以进行重组,但我认为不会有大规模的简化。
规则是静态的还是动态的?
通过简化函数 f,我们最多可以生成一个 ai.aj.ak.al-> 形式的规则,其中 ai,aj 等是条件属性。
【参考方案1】:
典型的方法是使用boolean algebra 将语句简化为最简单的形式。
如果,例如,你有类似的东西:
(A AND B) OR (A AND C)
你可以把它转换成更简单的形式:
A AND (B OR C)
【讨论】:
【参考方案2】:如果您将 a 值表示为 int
或 long
,其中 a1 的值为 2,a2 的值为 4,a3 的值为 8,依此类推:
int a = (a1 ? 2^1 : 0) + (a2 ? 2^2 : 0) + (a3 ? 2^3 : 0) + ...;
(为了保持简单而浪费了一点时间,而忽略了 a0 = 1 会更好的事实)
您对所有条款都这样做:
long[] terms = ...;
terms[0] = 2^0 + 2^3 + 2^5 // a1+a2+a5
terms[1] = 2^2 + 2^7 + 2^23 + 2^34 // (a2+a7+a11+a23+a34)
然后就可以找到结果了:
foreach(var term in terms)
if (a & term == term) return true;
return false;
但这仅适用于最多 n=64。上面是乱七八糟的。
【讨论】:
是的!我尝试了类似的方法,但最后我得到了一个规则,例如 a1+a2+..+ak-> dicision,但我必须得到 a1.a2....ak->dicision 的形式,所有的术语和彼此,如何从这里得到它? @sb15 不确定您的意思。 for 循环创建 OR,只要其中一项与它的所有位匹配,就会返回 true。实际上:结果 = a&term[0] == term[0] |一个&术语[1] == 术语[1] | ... a&term[m] == term[m]【参考方案3】:众所周知的方法是:
如果变量个数小于5,使用Karnaugh Map Algorithm 如果变量数为 5 个或更多,请使用Quine McCluskey Algorithm第二种方式最常用于计算机。它是表格和直截了当的。第一种方法是最好的手工方法,而且更有趣,但你不能可靠地将它用于超过 4 个变量。
【讨论】:
以上是关于简化布尔表达式的算法的主要内容,如果未能解决你的问题,请参考以下文章