標籤:情況 恰恰 將不 產生 關聯 文章 函數 映射 進一步
我是一個數學工作者,專業方向是圖論。研究圖論已經十年有餘。一個月前,一個偶然的機會讓我萌生了一個念頭,那就是我想嘗試用C++寫出我所學過的圖論方面的演算法。作為一個數學工作者,過去一直是紙上談兵,我之前並沒有真正寫過多少程式。確實,只知道寫證明的純理論的數學工作者往往自視甚高地看不起工程中實際寫程式的程式員(即使程式員圈子裡也有不少厲害的數學工作者),另一個方向的鄙視鏈好像也一定程度上存在著。於是,我不想只作一個“思想上的巨人行動上的矮子”,便有了這個系列的部落格。
首先聲明,我不是專業的程式員,只是大學裡教數學的一個教書匠。程式寫得不好還請諸位指教。另一方面,工作上壓力也蠻大,有不少教學工作和論文方面的工作。所以我的部落格可能無法定期更新。
然後說說我們的主要目標。目前我的目標是寫一下有關“圖的頂點染色”方面的演算法,如果我足夠“有毅力”可以堅持下去的話(其實,之前也想做這件事情,後來都慢慢放棄了),將來看情況再寫寫其他方面,甚至於純粹的離散數學方面的內容。下面開始正題。
(一)圖論和頂點染色的相關簡介。
圖論的研究對象是“圖”,我們在數學上一般用G,H,F這幾個字母表示。設G是一個圖,一般認為G有兩部分組成,分別是頂點集V(G)和邊集E(G),它們有時也簡寫作V和E,因而有時也將圖G更準確地表示為G(V,E)。畫在紙上看,一般是用小圓點表示圖的頂點,而用串連兩個小圓點的線表示邊。實際上,這恰恰暗示著圖G還有隱含的第三個部分,那就是頂點和邊的關聯關係,一般說,邊e與頂點u和v相關聯,直觀上看,就是圖上有一條線e將頂點u和v相連。由於這些“線”實際上只是體現邏輯上的關聯關係,所以這些具體的畫法一般沒有什麼要求,當然筆者專業的拓撲圖論以及和圖論有些沾邊的“組合幾何學”(幾何圖論)有些例外,一般情況下是不做要求的。
設e是一個邊,它關聯的兩個頂點是u和v,則稱u和v是它的兩個端點,並且稱u和v是相鄰的。如果u=v,那麼我們稱這個邊e是一個loop(國內中文書裡翻譯這個loop有好幾種名字,為了不造成混亂,涉及學術名詞時,我盡量保持英文表述,除非中文已經有了確切的約定俗成)。如果關聯著u和v的邊不只一條,那麼我們就稱這一組邊是一組平行邊(也叫重邊)。如果一個圖沒有平行邊也沒有loop,那麼我們就稱這種圖是一個簡單圖(simple graph)。
下面說一下頂點染色。考慮圖G(V,E)。設c是一個從V到集合{1, 2, ... , k}的映射(如果“映射”這個詞你聽起來不習慣,也可以把它換成“函數”,完全沒毛病),那麼我們就說c是圖G上的一個k-頂點染色,簡稱k-染色(k-colouring),c的像集(或者說範圍){1, 2, ... , k}中的每個數字都叫做這個染色所用的顏色。如果進一步地,染色c能保證:任何邊不會串連顏色相同的頂點,那就說這個染色c是好的(proper)。
設c是圖G的所有好的染色中顏色個數最少的一個,那麼就說c是G的最優的頂點染色,並且稱c所用的顏色個數是G的色數(chromatic number),記作χ(G)。求圖G的色數的問題就是“圖的頂點染色問題”。
(二)遊戲怎麼玩?
1. 從圖的頂點染色的定義可以看出,平行邊的存在在染色問題中是沒有意義的,而loop的存在在染色問題中是致命的。所以,我們在染色問題中只考慮簡單圖。
2. 我們的程式需要用各種算例來檢驗,我將把這些算例用文字檔的形式儲存。每個算例都是一個隨機圖,它的每條邊的存在性由一個指定的機率給出,換言之,這個圖的邊集是等機率的。所以我們首先需要一個產生隨機圖的程式,這個程式將在下一篇中給出,要求是輸入兩個參數,一是圖的頂點數,二是每條邊出現的機率。這兩個參數能控製圖的稠密程度,一般來說,圖越稠密頂點染色的程式的實際耗時很可能越大,所以它們將是十分重要的參數。
3. 以後的演算法中會出現其他一些概念,由於涉及圖論概念可能很多,所以我將不會一次性寫完,而是每次唯寫這一篇所需要的概念。並在文章結尾處留下本篇所涉及者。
(三)本篇所列概念(依照出現次序)
圖;頂點集V(G);邊集E(G);關聯關係;
端點;相鄰的頂點;loop;平行邊,重邊;簡單圖;
k-頂點染色,k-染色;顏色;好的染色;
最優的頂點染色;色數χ(G);圖的頂點染色問題。
關於圖的頂點染色問題的各種演算法的C++實現之初探(一)——引言與簡介