我希望简化一个非常庞大的布尔函数,形式如下:
f(a1,a2,....,an)= (a1+a2+a5).(a2+a7+a11+a23+a34)......(a1+a3+an).
'.'表示或
'+'表示且
可能会有100个这样的术语(它们之间带有'.')n的值可能高达30。
是否有可行的算法来简化这个问题?
注意:这不是实验任务,而是我在粗糙集合生成规则项目中的一个小部分,其中f是不相似函数。
我希望简化一个非常庞大的布尔函数,形式如下:
f(a1,a2,....,an)= (a1+a2+a5).(a2+a7+a11+a23+a34)......(a1+a3+an).
'.'表示或
'+'表示且
可能会有100个这样的术语(它们之间带有'.')n的值可能高达30。
是否有可行的算法来简化这个问题?
注意:这不是实验任务,而是我在粗糙集合生成规则项目中的一个小部分,其中f是不相似函数。
常见的实现方式有:
在计算机上,第二种方法是最常用的。它表格化且易于理解。第一种方式适合手工计算并具有趣味性,但是可靠地处理超过4个变量的计算可能较为困难。
如果您将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。超过这个数字就会变得混乱。