首先簡要的說明一下,vcp(vertex coloring problem)也就是最基礎的graph coloring 問題,即,在乙個無向圖上給每個節點染色,要求相鄰節點的顏色不同,同時使顏色總數最小。
然後從vcp中延伸出了pcp(partition coloring problem),描述是,整個圖已經被分成了k個部分,你需要在每個部分中選擇乙個點,使這些點構成的誘導子圖在vcp問題中,染色數最小化。
目前有兩種明確的演算法來解決pcp問題,一種是branch-and-cut,另一種是branch-and-price。
但是首先,讓我們用一些線性規劃方程來描述pcp。
顯然,我們顏色數的上界是pcp中給出的劃分數k,因為最差的情況一定是每個節點的顏色都互不相同,所以定義y_c=表示顏色c是否被使用,x_vc=表示v點是否被染成了顏色c,那麼我們的目的顯然是sum_^k y_c最小,同時滿足sum_^k sum_ x_vc =1 (即每個分割都只有乙個點被染色),x_vc+x_uc≤y_c(即相鄰的兩個點不能染成相同的顏色)
但是這個約束會受到對稱性(這裡不太清楚,**上沒有細說)的影響,使其只適用於規模較小的圖。
我們使用另外一種約束方法。
另s為v的乙個類似於冪集的集合,s中的任意乙個集合都是v的乙個子集,同時與每個劃分交集大小不超過1,且任意兩點之間不存在邊。我們會發現這實際上是pcp中的一種顏色選擇。那麼我們繼續定義ξ_s=即,s中的所有點是否相同。
那麼,我們的約束就變成了最小化sum ξ_s,約束10大概是想要表示對於每個劃分,必須且只能有乙個點被染成一一種顏色?(但是感覺它的描述存在問題),之後將ξ_s放寬為非負實數。
upd:上面的約束大概開始是通過限制ξ_s只能為1、0來約束,之後放寬為非負實數的話,也就是說存在多個顏色選擇方案涉及到劃分i,那麼ξ_s就變成了小數
但是第二個約束的解被證明不會比第一種約束更優。
upd:似乎不是最優,而是最小化的值更大。。。因為維護的不是同乙個東西。。。但是看到後面怎麼又感覺第二個會比第乙個更優?好像第乙個之後把取值也改成非負實數後就出問題了。。。
/*定義p(v)為v所在的劃分的編號,那麼每個顏色選擇的編號c(s)就可以定義為其中所在劃分最小的那個編號。這在答案中一定是不會重複的。*/
解決第二個約束的樸素思想是列舉s集合的元素,s的規模是指數級的。**提出用列生成演算法去解決這個約束。
具體的branch-and-price演算法,是由乙個列生成演算法和乙個分支計畫(branch scheme)構成的。大概就是我們預先給出乙個對約束的分配,用乙個估價函式,對當前的分配進行評估,把不滿足要求的點調出來,再次分配,不斷重複,直到沒有衝突。
問題在於我們如何定義這個估價函式(文中定義了乙個optimal vector?),文中把它轉化成了mwssp。。。(這一段不是很難理解?)
之後是branch scheme的介紹,也不是很難理解?主要是兩條分支(搜尋?)條件
發現**的核心其實是後面的搜尋方式的描述。。。而且也不是很難理解。。。主要就是講ls的具體操作辦法,以及定義一次搜尋的好壞之類的。。。
這篇**應該放在第二位去讀的。。。當我讀了第二篇之後我才意識到這算是其中的乙個操作的具體描述之類的。。。(mac打字聲音真大。。。無論我怎麼刻意壓制聲音。。。)
接下來是第二篇**,講的是混合進化演算法在graph coloring上的應用。核心思想就是我們用遺傳演算法作為整個混合演算法的框架,在選擇crossover的兩個值時,區別於遺傳演算法的隨機選擇,這裡會有乙個選擇機制(具體是什麼我給忘了,好像文章中也沒有說的太過具體。。。)
在進行crossover之後,混合演算法並不是直接將其插入種群當中,而是採用貪心和ls對其進行優化,這裡的ls演算法具體使用的是ts。
就像爬山法一樣?(我不是很清楚爬山法,只是覺得很形象就拿來用了。。。upd:剛剛查了一下,發現ts就是爬山法?(問句表示不確定的語氣))為了防止演算法停留在區域性最優解上,就用乙個tb table來記錄之前的交換,強制之後的n次ls不能再次交換,這裡的n是由乙個公式給出的,裡面的引數需要具體調節。
大概就是這樣?這篇**感覺十分淺顯易懂。。。
過幾天寫**了解一下?。。。。
學習學習再學習
如果乙個技能足夠複雜 比如從零學程式設計 那就不要指望讀完一本書就可以打天下。多買幾本書同類的書 因為每個作者的出發點是不一樣的,哪怕對同乙個概念都有不同的解釋說明。理解知識的重要過程之一就如牛的反芻一樣,要嚼一遍 嚥下去 再吐出來 再嚼一遍 再嚥下去 所以,既然一本書可以讀幾遍,那麼同一話題多應該...
學習 學習 再學習
原本要使用vs2005開發乙個b s專案的,沒有想到只能先暫時停停了,居然跟不上技術的發展了,呵呵,一直使用delphi delphi也沒能跟上 沒有想到轉到vs2005上竟然有這麼多要學的東西,當然目的是了做乙個好的系統。最近一直在學習asp.net ajax,雖然專案停了,但是我覺得值得,有很多...
只是學習 學習 再學習
通過做 讓我學會了很多東西 什麼 flash div css html js as 雖然都只是皮毛 不過 算是了解那麼一點點吧 哈哈 我還突然發現 我的 數學和英語 進步了不少 而且還都是很實用的 比在學校的進步可快多了 那句話說的很不錯 在你了解了一些皮毛之後你會發現很多東西你都必須去學。因為少一...