導航:首頁 > 源碼編譯 > 圖的點著色問題演算法

圖的點著色問題演算法

發布時間:2023-03-20 20:24:25

『壹』 「四色定理」在實際中有什麼應用

四色定理是圖的著色問題的一個結果。圖的著色本質是給圖中的頂點貼標簽(labeling),但是要滿足一定的條件。「色」只是一種標簽。

四色定理的描述雖然提到了地圖,但是地圖繪制並不需要四色定理:他只要著色,不需要用最少的顏色。實際畫地圖時一般不用四種顏色。

著色問題的應用,主要排程和分配問題上。
比如我有幾個任務,每個任務都需要一天。而我知道其中幾樣任務是沖突的,不能安排在同一天完成。現在我希望四天完成。這就是四色問題了:所用的圖以任務為頂點,沖突的任務間連邊,用日期做顏色,對圖著色。

再比如我有一些員工,我希望把他們分成四個小組。但是我知道其中幾個員工互相之間有矛盾,不能安排在同一組。那麼這又是四色問題:所用的圖以員工為頂點為,矛盾的員工間連邊,用組做顏色,對圖著色。

四色定理說:如果上面提到的圖是平面圖(有高效演算法判定),那麼可能四天完成/可能分成四組。

『貳』 用c#編碼一個圖的m-著色問題

給出一個圖的m-著色的程序段,回溯法:
/* 圖的鄰接矩陣Graph[n,n]表示無向連通圖G,
1,2,3,..m代表不同的顏色
頂點i所著色用x[i]表示,初始值都賦為0
*/
void NextValue(int k)
{
int j, flag;
do{
x[k] = (x[k]+1) % (m + 1)//分配給x[k]一種新的顏色
if (x[k] == 0)
return; //x[k]的顏色已用完
flag = 1; //x[k]是否可用的標記
for (j = 0; j < n; j++)
if (Graph[k,j] == 1 && x[k] == x[j]){
flag = 0; //x[k]不可用
break;
}
while (flag);
}
void MColoring(int k)
{
while (x[k] < m){ //產生x[k]的合理分配
NextValue(k); //找x[k]的一個合理分配
if (x[k] == 0)
return; //無解,結束調用
if (k == n) { //著完n個頂點,找到完整著色法,輸出
Output(x,k) //輸出當前解
else
MColoring(k+1)
}
}

/*
遞歸演算法:
void Coloring(區域 n)
1. 令顏色集ClrSet={ 沒有被區域n的鄰居區域使用的顏色 }.
2. 如果ClrSet是空集,返回.
3. 對ClrSet中的每種顏色c,作循環:
3.1 為區域n著色c。
3.2 如果所有區域都已著色(n是最後一個區域),那麼顯示/保存著色結果.
3.3 否則對下一個尚未著色的區域(n+1),調用Coloring(n+1).
4. 把區域n變為沒有著色的區域.
--------------------------------------------------------
*/
template<int node_count = 8>
class CColoring
{
private:
typedef int node_type;
typedef int color_type;
typedef std::set<node_type> node_set;
typedef std::vector<color_type> color_array;

public:
void operator()(const int _Matrix[node_count][node_count])
{
matrix = _Matrix;

colors_of_nodes.resize(node_count, 0);

total_count = 0;

coloring(0);
}

private:
void coloring(node_type n)
{
// 顏色的使用情況
std::vector<bool> used_colors;

node_type m;
color_type c;

// 初始化顏色的使用情況
used_colors.resize(color_count, false);

// 遍歷每個與區域n相鄰的區域m
for(m = 0; m < node_count; ++m)
{
if(matrix[n][m])
{
// 獲取m的顏色
c = colors_of_nodes[m];
// m已著色
if(c != 0)
used_colors[c] = true;
}
}

// 遍歷每個未被n的鄰居使用的顏色c
for(c = 1; c < color_count; ++c)
{
if(!used_colors[c])
{
// 為n著色c
colors_of_nodes[n] = c;

// 著色完畢
if(n >= node_count - 1)
{
++total_count;

// 輸出結果
_tprintf(_T("---------------------\n"));
_tprintf(_T("Method %d:\n"), total_count);
for(m = 0; m < node_count; ++m)
{
_tprintf(_T("node: %d, color: %d\n"), m, colors_of_nodes[m]);
}
}
// 還有區域沒有著色
else
{
// 為下一個未著色的區域,調用coloring()
coloring(n + 1);
}
}
}

// 將n設置為沒有著色的區域
colors_of_nodes[n] = 0;
}

// 0表示無色,1-4表示4種不同顏色
static const int color_count = 5;
// 鄰接矩陣
const int (* matrix)[node_count];
// 各區域對應的顏色
color_array colors_of_nodes;
// 總的著色方案數
int total_count;
};

void main()
{
int Matrix[4][4] =
{
{ 0, 1, 0, 0 },
{ 1, 0, 0, 0 },
{ 0, 0, 0, 1 },
{ 0, 0, 1, 0 },
};

CColoring<4> coloring;
coloring(Matrix);
}

『叄』 圖著色問題的簡介

圖著色問題(Graph Coloring Problem, GCP)又稱著色問題,是最著名的NP-完全問題之一。
數學定義:給定一個無向圖G=(V, E),其中V為頂點集合,E為邊集合,圖著色問題即為將V分為K個顏色組,每個組形成一個獨立集,即其中沒有相鄰的頂點。其優化版本是希望獲得最小的K值。

圖的m-著色判定問題猜純——給定無向連通圖G和m種不同的顏色。用這些顏色為圖G的各頂點著色,每個頂點著一種顏色,是否有一種著色法使G中任意相鄰的2個頂點著不同顏色?
圖的m-著色優化問題——若一個圖最少需要m種顏色才能使圖中任意春磨相鄰的扒兆斗2個頂點著不同顏色,則稱這個數m為該圖的色數。求一個圖的最小色數m的問題稱為m-著色優化問題。

『肆』 圖著色問題的路線著色問題

道路著色問題(Road Coloring Problem)是圖論中最著名的猜想之一。通俗的說,這個猜想認為,可以繪制一張「萬能地圖」,指導人們到達某一目的地,不管他們原來在什麼位置。這個猜想最近被以色列數學家艾夫拉漢· 特雷特曼(Avraham Trahtman)在2007年9月證明。
舉個例子。在維基網給出的圖例中,如果按圖中所示方式將16條邊著色,那麼不管你從哪裡出發,按照「藍紅紅藍紅紅藍紅紅」的路線走9步,你最後一定達到黃色頂點。路線著色定理就是說在滿足一定條件的有向圖中,這樣的著色方式一定存在。嚴格的數學描述如下。我們首先來定義同步著色。G是一個有限有向圖並且G的每個頂點的出度都是k。G的一個同步著色滿足以下兩個條件:1)G的每個頂點有且只有一條出邊被染成了1到k之間的某種顏色;2)G的每個頂點都對應一種走法,不管你從哪裡出發,按該走法走,最後都結束在該頂點。有向圖G存在同步著色的必要條件是G是強連通而且是非周期的。一個有向圖是非周期的是指該圖中包含的所有環的長度沒有大於1的公約數。路線著色定理這兩個條件(強連通和是非周期)也是充分的。也就是說,有向圖G存在同步著色當且僅當G是強連通而且是非周期的。
特雷特曼在數學上的這一成果極為令人矚目,英國《獨立報》為此事專門發表了一篇題為「身無分文的移民成了數學超級明星」的文章,給予了高度的評價。
以色列人也為特雷特曼取得的成就感到無比的驕傲。特拉維夫電視台中斷了正常的節目播放,以第一時間發布了這一重大消息,連中東其他國家的主流媒體也作了大篇幅的相關報道。
得知特雷特曼解決這一難題的消息後,多年從事路線著色問題研究的加拿大數學家喬爾·弗里德曼說,「路線著色問題的解決令數學共同體非常興奮。」讀過特雷特曼論文的中國數學家和語言學家周海中教授認為,特雷特曼的數學知識非常淵博,解題方法十分巧妙,這一謎題得到破解,無疑是數學史上的一個華彩樂章。 演算法描述:color[n]存儲n個頂點的著色方案,可以選擇的顏色為1到m。
當t=1時,對當前第t個頂點開始著色:若t>n,則已求得一個解,輸出著色方案即可。否則,依次對頂點t著色1-m, 若t與所有其它相鄰頂點無顏色沖突,則繼續為下一頂點著色;否則,回溯,測試下一顏色。 #include<stdio.h>intcolor[100];boolok(intk,intc[][100])//判斷頂點k的著色是否發生沖突{inti,j;for(i=1;i<k;i++){if(c[k][i]==1&&color[i]==color[k])returnfalse;}returntrue;}voidgraphcolor(intn,intm,intc[][100]){inti,k;for(i=1;i<=n;i++)color[i]=0;k=1;while(k>=1){color[k]=color[k]+1;while(color[k]<=m)if(ok(k,c))break;elsecolor[k]=color[k]+1;//搜索下一個顏色if(color[k]<=m&&k==n){for(i=1;i<=n;i++)printf(%d,color[i]);printf( );}elseif(color[k]<=m&&k<n)k=k+1;//處理下一個頂點else{color[k]=0;k=k-1;//回溯}}}voidmain(){inti,j,n,m;intc[100][100];//存儲n個頂點的無向圖的數組printf(輸入頂點數n和著色數m: );scanf(%d%d,&n,&m);printf(輸入無向圖的鄰接矩陣: );for(i=1;i<=n;i++)for(j=1;j<=n;j++)scanf(%d,&c[i][j]);printf(著色所有可能的解: );graphcolor(n,m,c);} 利用相交圖(interference graph)來表示程序變數的生命期是否相交,將寄存器分配給變數的問題,可以近似地看成是給相交圖著色:相交圖中,相交的節點不能著同一顏色;每一種顏色對應一個寄存器。Chaitin等人最早提出了基於圖著色的寄存器分配方法其著色思路採用了Kempe的著色方法,即,任意一個鄰居節點數目少於k的節點,都能夠被k著色。判斷一個圖是否能夠被k(k>=3)種顏色著色,即k著色問題,被Karp證明是一個NP-complete問題。
但是,寄存器分配不僅僅是圖著色的問題。當寄存器數目不足以分配某些變數時,就必須將這些變數溢出到內存中,該過程成為spill。最小化溢出代價的問題,也是一個NP-complete問題。如果簡化該問題——假設所有溢出代價相等,那麼最小化溢出代價的問題,等價於k著色問題,仍然是NP-complete問題。
此外,如果兩個變數的生命期僅僅因為出現在同一個拷貝指令中而相鄰,那麼,通過將這兩個變數分配到同一個寄存器,就可以消除該拷貝指令,成為coalescing。這個方向的努力在Chaitin的文章以後的1/4個世紀,成為推動寄存器分配的主要動力之一,涌現出了包括aggressive coalescing,conservative coalescing和optimistic coalescing。但是,將兩個變數分配到同一個寄存器,等價於將這兩個變數合並成同一個變數,生命期合並,因而會加劇相交圖的聚簇現象,降低相交圖的可著色性。Bouchez等人證明了目前的coalescing問題都是NP-complete的。
為了降低相交圖的聚簇現象,提高相交圖的可著色性,可以通過將變數拷貝給一個臨時變數,並將以後對該變數的使用替換成對該臨時變數的使用,從而將一個變數的生命期分解成兩個變數的生命期,稱為live range splitting。顯然,這是一個與coalescing的作用相反的過程。Bouchez等人考慮了該方法的復雜度。
此外,寄存器分配還需要考慮寄存器別名(aliasing)和預著色(pre-coloring)的問題。寄存器別名是指,在某些體系結構中,一個寄存器的賦值可能會影響到另外一個寄存器。比如,在x86中,對AX寄存器的賦值,會影響AL和AH寄存器。預著色是指,某些變數必須被分配到特定的寄存器。比如,許多體系結構會採用特定寄存器來傳遞函數參數。
George和Appel發展了Chaitin的演算法,更好地考慮了coalescing過程和賦值過程,以及各過程之間的迭代,在基於圖著色的寄存器分配方法中具有廣泛的影響。

閱讀全文

與圖的點著色問題演算法相關的資料

熱點內容
畫江湖推倒常宣靈小說 瀏覽:158
java表格居中 瀏覽:404
能來回穿梭現代和民國的小說 瀏覽:830
法國版未刪 瀏覽:755
java中字元串輸入 瀏覽:185
可愛女友糖糖圓圓小詩 瀏覽:272
如何在雲南交投app辦etc 瀏覽:829
尺度大的男同志電影 瀏覽:925
主角為秦霄的穿越小說 瀏覽:707
大尺度床戲多的電影 瀏覽:395
台灣性電影 瀏覽:942
華為手機聊天加密軟體 瀏覽:833
台灣電影愛情片他女朋友死了 瀏覽:813
電影音樂下載 瀏覽:158
池恩瑞的作品 瀏覽:912
澳門電影免費觀看網站大全 瀏覽:243
電腦多組命令 瀏覽:806
abkdb編譯 瀏覽:710
尺度計演算法大全 瀏覽:926