2009-09-30 28 views
0

我目前正在調度應用程序的工作過程中遇到了一個小障礙。由於該領域出於安全原因進行嚴格管理,該軟件需要檢查多個相互依賴的條件以確保可能出行。而不是一個很好的條件樹 - 這將很容易實現 - 我有這個可怕的有向圖。現在大多數情況下,這並不難,除了事實上我可能不知道所有事先要求的信息,但仍需要儘可能多地進行驗證。複雜的一系列條件的部分驗證

我可以實現這個作爲if/else語句的老鼠窩,但這將是一個可維護性的噩夢,因爲法規相當規則的變化。由於圖中沒有周期,我認爲某種形式的廣度優先方法可能是最優的。 我在正確的軌道上嗎?是否有任何其他替代技術來執行這種任務?

回答

0

解決方案完全取決於您所說的有向無環圖(DAG)實際上代表了什麼。節點AND和OR節點,還是有條件的分支?

如果他們是有條件的分支,您不需要任何廣度優先搜索,因爲沒有什麼可以搜索;你只需根據評估條件採取分支。是的,它可以很容易地作爲GOTO意大利麪實施。另一個選擇是創建節點(或數據結構)的數據庫,並有一個「虛擬機」,它通過節點逐一執行。這使得它更易於維護,但也更慢。

如果它是一個AND/OR/NOT圖,那麼你需要評估從樹葉開始的節點的真值。這不是廣度優先搜索,而是一種逆廣度優先的方法。您計算樹葉的值,然後向後計算內部節點的值;最終你會得到一個根節點的評估(true/false)。

0

聽起來像你試圖解決一個常見的編譯問題,稱爲'[常摺疊] [1]'。 (http://en.wikipedia.org/wiki/Constant_folding)。

好的新功能是它適用於DAG(直接非循環圖),而不僅僅適用於樹。基本上這個想法是通過部分表達式來計算你可以得到的。像True AND X = XTrue OR X = True這樣簡單的事情有助於修剪樹的大部分部分。 (我知道的微不足道的實現是一個深度優先和回溯比寬度優先的問題,但無論如何它不是很多代碼)。

我還想知道爲什麼你得到一個圖表不是一個表達式樹。如果可以從A計算B或B的A,則通常不會同時輸入A和B.然後應該可以根據可用的輸入將問題表達爲一組表達式樹。但這是猜測。你能給出更多的細節(例如)爲什麼你有這個圖嗎?