簡體   English   中英

簡化布爾表達式的算法

[英]Algorithm to simplify boolean expressions

我想簡化表單的一個非常大的布爾函數:

f(a1,a2,....,an)= (a1+a2+a5).(a2+a7+a11+a23+a34)......(a1+a3+an).

'' 是指OR

'+'表示AND

可能有100個這樣的術語('。'相互之間)n的值可能高達30。

有沒有可行的算法來簡化這個?

注意:這不是實驗室分配,是我的項目中通過粗糙集生成規則的一小部分,其中f是不相似函數。

眾所周知的方法是:

第二種方式最常用於計算機上。 這是表格和直截了當的。 第一種方法是手動完成的最佳方式,更有趣,但你不能可靠地使用它超過4個變量。

典型的方法是使用布爾代數將語句簡化為最簡單的形式。

例如,如果你有類似的東西:

(A AND B) OR (A AND C)

你可以將它轉換為更簡單的形式:

A AND (B OR C)

如果將a值表示為intlong ,其中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。 在它之上它是凌亂的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM