我的第一個想法是用單純形算法進行線性規劃,但我認爲這是錯誤的或至少是不完整的。基本上,大多數(如果不是全部)規則都是線性的,這個規則就是線性規劃處理這種規則的(或者是規則)。
修復可能是統一的。也就是說,儘可能少地表達您的規則WRT。如果你有一個規則f(a)= g(b),你可以通過定義b = g'(f(a))來有效地消除b,並在其他地方代替你找到b。由於實際替代效率低下,您可以只記下a和b之間的關係。
由於併發症較少,基本方法是聯合查找。在完全平等的情況下,您可以通過添加從b到a的鏈接來消除b。當'找到'b時,你就可以識別一個(或者它所鏈接的任何東西)。因此,在任何時候,您都可以高效地將任何規則轉換爲僅使用未消除變量的表單。在這種情況下的複雜 - 你需要保持g'(f(a))風格的東西的運行軌跡,因爲你遵循鏈接。由於這一切都是線性的,它不應該是一個大問題,但也不是微不足道的。
您可能需要能夠回溯統一 - 記下您在堆棧上設置的鏈接,以便在展開堆棧時以正確的順序再次將它們清零。
我不確定你是否有任何相對條件(小於或等於),但如果是這樣,一旦你已經消除了儘可能多的變量,你仍然需要一些線性編程。如果你有兩個剩餘的變量,這在概念上很簡單。對於這兩個變量的每個線性條件,請在2D圖上繪製一條線,以便線的一邊代表有效區域。這些條件傳統上是「標準化的」,所以有效的一方總是包含原點。基於交點,最靠近原點的線段形成凸多邊形。一個最佳解決方案在其中一個角落,並且使用線性評分規則(您正在優化的東西)進行評估,在您的情況下,該評分規則將被定義爲給出「最佳」形狀,其中存在某些不明確或優先級衝突你的規則 - 例如你不能一直推線一個點,所以在某些點上會被阻塞。
如果您剩下兩個以上的變量,則需要多維等價的凸多邊形 - 這就是所謂的單純形。單純形算法的實際實現涉及矩陣。
這已經過於簡單化了,它可能在某些細節上是錯誤的,而且就我所能解釋的事情而言。 IIRC你可以在Sedgewick中獲得這些組件技術的很好的描述,儘管現在維基百科可能一樣好。
單純形求解器有時用於窗口布局 - 例如,我認爲wxWidgets使用一個來調整窗口中的控件的大小。統一是邏輯編程的一個定義特徵(Prolog等),但底層的聯合發現原則很簡單。關鍵技巧是弄清楚如何將2D圖形翻譯成一系列表達如何改變的規則,並理解如何表達和操縱這些規則,特別是以矩陣形式。
此問題已被約束。這意味着可能有方法來改變這個數字並保持所有的角度都一樣。例如,你可以延長B,E和G十英里。告訴我們你想要做什麼。 (並標記頂點,而不是段) – Beta 2010-11-28 18:34:09
好的redid,希望這有助於 – John 2010-11-28 18:44:42