[英]Method to minimize boolean function in SOP-form
我正在處理布爾函數,我只能(但安全地)假設它們作為SOP進入並且不包含否定(例如(A && B && C)||(A && B && D) )。 析取的數量通常> 5,連詞的數量通常> 10。
因為在我的情況下計算每個變量的值很難並且結果被認為是短暫的 ,我需要能夠最小化關於變量出現的所述函數。 這種最小化的結果不需要是任何正常形式,並且允許任意深度嵌套。
在問過類似問題之前,SO 指出了使用扇出最小化,卡諾圖,QM或BDD的一般解決方案。 在處理這些方法之前 - 這會大大誇大我的代碼 - 我想仔細檢查關於輸入函數的先驗已知事實是否不會產生使用較小但盡管不那么通用的最小化方法的可能性。
應用吸收和分配規律的AFAICS將始終提供最小的形式。 是否有可能利用這些功能作為SOP而沒有否定的事實? 在我看來,對變量應該有一個簡單的交集和並集運算的遞歸算法,它將產生所需的結果。
可以描述一下這個算法嗎?
編輯:征求意見:在對該主題做了一些研究之后,在我看來,這里提出的問題等同於找到給定函數的簡化BDD的最優變量排序。
背景:最小化的函數被傳遞到作業隊列以計算所有必需變量的值。 之后評估該功能。 考慮應用示例:
這是一個簡單的算法:
讓我們考慮一個例子:ABC + ABD
有
首先將表達式轉換為2D表(它不是k-map):
T1 T2
A 1 1
B 1 1
C 1 0
D 0 1
**begin**
**While** the table is not empty do :
**if** a row or a column have only zeros, **then**
remove it from table and continue.
**end if**
**if** there is a row or more with only ones **then**
factor the vars corresponding to the rows
and remove the rows from the table
**else**
get the rows having a max number of ones,
do their scalar prod
from the scalar prod obtained,
get the columns corresponding to zeros (terms)
and put aside the one having a min number of ones
and remove its column from the table
**end else**
**end while**
close brackets
**end**
申請表上面:
T1 T2
A 1 1
B 1 1
C 1 0
D 0 1
迭代1:有兩行只有一個,A和B,因為它們並從表中刪除它們:
表達式將從以下開始:AB(...並且表現在是:
T1 T2
C 1 0
D 0 1
迭代2:沒有行只有一行。 兩行的最大數量為1,其標量為0 0,兩列為零,T1和T2都具有相同的數字1,無分鍾,將其中一個放在一邊,讓我們取T1並刪除它來自表格:表達式將從以下開始:AB(T1 +和T1是1 * C + 0 * D = C表達式將從以下開始:AB(C + ......表現在是:
T2
C 0
D 1
迭代3:行C只有零,我們將刪除它,行D只有一個,我們將它排除並從表中刪除它
表達式現在是:AB(C + D(...
表現在是:空的
iteration4:表是空的 - >結束時間
近括號 :
表達式為AB(C + D)
它不是一個最優算法,但它不如k-maps更通用,因為它考慮到表達式是SOP而沒有否定的事實
根據您的假設,您需要一個函數來在執行所需函數之前評估您的簽名。
沒有一個先驗算法可以為你做這個,至少在java中,因此你需要編寫它並繼續迭代,直到找到最一般的抽象。
在那里你有所有應用在邏輯中的屬性,因為你不想使用NOT操作,前三個對你最有用。 我希望這有幫助。
我會用“常識”算法做到這一點; 我不確定它是最優的,但在這種情況下很難表達“最優性”。 我假設你沒有按照評估條款的順序有任何“偏好”,但這可以毫無困難地包含在程序中。
設x_1
... x_n
是你的決策變量, y_1
... y_m
是每個j
的形式prod_{i in I_j} x_i
的連接子句:你希望最小化的表達式是從j=1
到m
的總和的y_j
。
決策變量可以首先“分區”:
I_j
,它們無論如何都需要進行評估; 首先執行此操作(然后從集合I_j
刪除它們) I_j
集合中,則不需要對它們進行評估(也可以從集合I(j)
刪除它們)。 如果所有子句中出現的x_i
之一為false,則表達式為false; 結束。
否則,目標是找到其中一個集合I_j
例如所有x_i
都為真(或證明不存在)。
通過增加基數來訂購I_j
,以最小化評估的數量。 如果x_i
已經被評估為真,則保持數組(比如z_i
),例如z_i=1
,否則保持為假。 對於該有序列表中的每個集合I_j
:
對於I_j
每個i
:
求x_i
(如果z_i
為假);
x_i
為false,則刪除I_j
和包含i
所有集合。 z_j
1
存儲在z_j
並繼續 如果此循環結束(所有x_i
都為真),則表達式為true。 結束。
I_j
的列表為空,則表達式為false。 結束。 I_j
。 它的優點是實現起來非常簡單,我相信它應該非常有效。
從復雜性的角度來看,我認為有一些部分相關的結果似乎表明這個問題很難。
根據Elbassioni,Makino和Rauf的“關於單調布爾公式的可讀性”(pdf鏈接),確定CNF或DNF中的布爾公式是否可以重寫為每個變量最多出現的公式是NP難的k次(k> = 2)。 請注意,此結果與問題陳述不匹配,因為原始公式不是單調的(即:可能包含否定)。
根據Goldsmith,Hagen和Mundelhenk的“DNF的復雜性和單調公式的同構性”(pdf link) ,計算任意單音布爾函數的最小DNF是NP難的。 此結果不完全匹配,因為DNF中未給出原始公式,並且輸出公式僅限於DNF。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.