hsuan 的部落格

[Term Project]

"

點燈遊戲

494512243 資工二乙 陳宣筑壹、前言
「點燈遊戲」,就是在一個方形的盤面中,有NM列的燈排成長方形,最普遍的玩法就是把25盞燈排成55(表格1),每一盞燈都有一個開關,每點燃(表格2)或關閉一盞燈都會影響到他和他的上、下、左、右共五盞燈的狀態(亮的變暗,暗的變亮)。遊戲者以控制燈的開關把所有燈都點亮則完成遊戲。

貳、討論       
平常我們玩這個遊戲的時候就是一直去嘗試不同的方式點然後找解,但是人腦的記憶力有限,有些地方我們會重複做了但卻忘記了,如此便消耗了不少時間。以5*5的點燈盤面來說會有2^25=33,554,432種情形。如果用來解其他更大的盤面,那會是一個天文數字,所以一個有效率的解方式必須要有的!!

如果我們把所有的燈分成不點兩種狀態,點某盞燈奇數次之後的結果都是一樣的;點某盞燈偶數次 和沒有點是一樣的。所以我們可以用 1 0 來記錄每一盞燈點與不點的狀態, 再經由記錄狀態來判斷目前的點燈盤面是否已將所有的燈點亮。
Depend on 上一行」的方法是在找資料的時候看到的,與其慢慢的一個一個帶,這個方法只需要去尋找第一列的點燈方式然後利用Backtracking的方式判斷是否會有解,當第一列被決定之後,其餘各列剩下的燈也被決定了,如此一來5*5的點燈盤面便只須要去判斷2^5=32種情形。同理,N*M(N<=M)的盤面也只需用2^N種情形判斷就可以了。
以下為解法:
   
首先產生一個5*5點燈盤面,用搜尋的方式一格一格填入0(沒點到)1(有點到)尋找可能的方法。

   
因為每點一盞燈會影響的只有陣列中上一列下一列和自己這一列,所以在利用遞迴產生01時,產生到第二列的元素時,就可以檢查該元素上一列所產生的01符不符合周圍奇數點燈的條件。如果不合,就退回去再產生上一列的結果。如果符合就再產生下一列,即在第n列檢查第n-1列的元素。
        而當程式到了產生最後一個元素時,檢查第n(本例中n就等於5),如果也合理,此盤面即為所求。        如果第一列都填0,第二列依上述的說明,為滿足讓第一列元素四周都有奇數的燈被點,勢必都要填入1       依上述的方法再往下填入,會發現填到B5時,為了讓B4四週有奇數點,所以填1,但這樣卻造成A5四周有偶數個燈被點,所以此點燈法無效,盤面需backtracking重新產生解法ex:10100不是5*5盤面的解參、結論
目前的結論:
   
在一個 n * m ( n m 列,n
<= m ) 的盤面中,只需要考慮第一列開關的 2^N 種不同之開啟 或關閉的設定情況即可。這些不同的設定情況可以用 n 1 0 來記錄。
現在這份報告在做動作的依據是以前一列的燈為參考依據,且發現使用這種方法在N<=20的狀況下皆有解,並且部份具有對稱性,雖然還沒有找到具有規律性的解法,但是已經省下不少的時間。
未來的發展:
   
其實點燈遊戲的解法還有很多種,像是拼圖法骨牌法鏡射,其實拼圖法是我原本想要研究的題目,但是因為知識上及時間上的不足無法完成,或許拼圖法在解盤面更大的點燈遊戲會比現再這個方法好用且方便也不一定。
肆、心得
   
原本想利用演算法的分析來尋找是否有固定的規則來解這個問題,但是深入了解後發現發明這個遊戲的人真厲害,隨著點燈盤面格式的不同,發現以各行元素都depend on上一列的結果在20*20以下的盤面不管是M*NN*N都有解,而且有些只有唯一解,但是有些又有超多組解,根本就很難以某種固定的規格形式去求出解。但是這個方法和土法煉鋼去找解的方法比較起來,實在有效率很多。

伍、             參考資料
http://www.shes.hcc.edu.tw/~oddest/math172.htm
怎樣來點燈
http://www.shes.hcc.edu.tw/~oddest/math171.htm
http://iicm.cc.ntu.edu.tw/communication/c1_4/page03.html
 [@more@]"

Huffman’s Encode

"

霍夫曼編碼法(Huffman’s Encode)是霍夫曼在1952年所提出的一種無失真壓縮技術,其原理是將欲壓縮之字串,先讀一遍,將字串中的每一相異單字元(Single Character)的出現頻率,做成統計,依此建構霍夫曼樹(Huffman’s Tree)。每一相異單字元,用0與1予以編碼,出現次數逾多者,給予較少的位元編碼,最後將這些位元串組合起來,並加上Huffman’s tree ,就成為壓縮檔案。Huffman編碼法為依資訊源符號出現機率,在對資訊源符號逐一編碼條件下(The symbols be coded one at a time),最佳之編碼方法。

Huffman編碼法的特點在於所編碼出來的檔案具有唯一碼性質的即時碼。也就是各個相異字元所編碼出所位元串並不相同,解碼時能立即解出。也就是說,Huffman編碼法之解碼過程為即時(Instantaneous) 且為唯一(Uniquely Decodable) 之解碼。

參考來源:http://www.cc.chu.edu.tw/~u8702640/Huffman%BDs%BDX%AAk.htm

其實霍夫曼編碼法不算是個效率很好的壓縮,一般不會拿來單獨使用,而常與其他的壓縮演算法配合使用。
不一定每種東西都適合用同一種壓縮的演算法,要視情況而定,「不可逆壓縮模式」來做壓縮,有效提高壓縮效率,但也犧牲了原來檔案,「可逆壓縮模式」卻無法得到相當好的壓縮效率,所以要如何取捨就看使用著了。

[@more@]"

Hamiltonian Circuit Problem

"

通過每一頂點且只通過一次的路徑稱為漢米爾頓路徑;若是要求必須再回到起始頂點的迴路,則稱為漢米爾頓迴路。

由於漢米爾頓路徑及漢米爾頓迴路,到目前還沒有找到一個簡單又可快速判斷的充要條件,因此,我們只能利用這類路徑或迴路的基本特性來做判斷。首先,我們可以從下列之必要條件來判斷一個圖是否有漢米爾頓迴路:

漢米爾頓迴路通過圖中除起點外之任一頂點最多一次。
若一圖有漢米爾頓迴路,則該必具連通性。因為在非連通性的圖中,不可能有通過每一頂點之迴路。
若一圖有漢米爾頓迴路,則圖中任一頂點之進出次數至少是2。因為若有一頂點,其進出次數少於2(即進出次數為0或1),即至多有一個邊連接該頂點,則要通過該頂點的任一迴路務必沿著同一邊回去才能通過其他頂點,如此一來必有一頂點重複通過,此乃不可能也。
若一圖存在漢米爾頓迴路,則任一條漢米爾頓迴路必經由那些次數為2的頂點之兩個邊。
若一頂點,其次數大於2,在建造一條漢米爾頓迴路時,一旦路過該頂點,則其他與該頂點相連接而尚未使用過的邊都不能再考慮使用。
在一個具有n個頂點的圖G=(V,E)中,任一漢米爾頓路徑必恰好經過n-1個邊;而任一漢米爾頓迴路必恰好經過n個邊。
若一圖有漢米爾頓迴路存在,則只要去掉該迴路上的任一個邊,及可得到此圖的漢米爾頓路徑。

參考資料:http://www.cis.nctu.edu.tw/~is83039/discret/discrete6.html

[@more@]"

Prim演算法

"

Prim演算法用於解決最小生成樹問題,基本步驟如下:

1.任選一頂點作為一子樹的根節點
2.將所有的邊依照權重放入優先權佇列
3.在佇列中尋找能與子樹中頂點連接的最輕邊並加入之
4.重覆前一步直到所有頂點皆包含在此子樹中

這個網站有一個簡單的例子。
可以讓大家參考。希望對大家有幫助了解Prim演算法。
http://nthucad.cs.nthu.edu.tw/~yyliu/personal/nou/04ds/prim.html

[@more@]"

[after class]SVG

[新聞]SVG與Flash的硬戰

      由W3C所制定的SVG是網頁向量圖形及動畫的標準,可視為圖形及動畫的格式,也可讓開發人員擺脫HTML的限制,建立互動式圖形輸出Web應用程式。由於SVG資料連結及程式控制的技術是公開的,因此可以整合的應用比Flash廣泛。

      不過Flash在現有的基礎上,工具及應用已經十分成熟,雖然SVG是W3C推出的標準,但由於出現比較晚,技術人員的使用習慣難以改變,所以SVG被應用的機率比較少,再加上支援的軟體有限,所以難以取代Flash的地位。

參考網站:

http://vbb.twftp.org/showthread.php?t=4734

 

[After class] MusicML

看他們這組的報告,其實很辛苦的說,

因為說真的網路上MusicML的資料真的不多,

他們把以前的技術介紹出來,真的很不錯,

加上他們都是不是學音樂的人來說,實在有點辛苦。

不過這個技術對於音樂人來說,其實還是不足的。

如果要在譜上註解,這還是沒辦法辦到的。

不過對於樂譜在網路上,或是轉成MEDI檔,都有一定的助益。

[After class] MusicML

看他們這組的報告,其實很辛苦的說,

因為說真的網路上MusicML的資料真的不多,

他們把以前的技術介紹出來,真的很不錯,

加上他們都是不是學音樂的人來說,實在有點辛苦。

不過這個技術對於音樂人來說,其實還是不足的。

如果要在譜上註解,這還是沒辦法辦到的。

不過對於樂譜在網路上,或是轉成MEDI檔,都有一定的助益。

[After class]MathML

在沒有這個技術之前,很多數學符號都是用圖片顯示在網頁上。

像是積分符號、指數對數、分數之類的,都得變成圖片顯示在網頁上。

然後MathType又是要收費的軟體...所以實在是很不方便。

有了這項技術,相信對很多想在網路上PO教材的老師會方便很多。

對於資訊和技術的分享也會有一定程度的幫助。

[After class]Greedy Algorithm

上完了貪婪演算法以後,還滿多發現的。

了解到了貪婪演算法是種走一步算一步的的演算法。

雖然短視近利,但是對於某些問題來說還算是個不錯的方法。

儘管不能找到全體的最佳解,但是在找部份最佳解的時候是很好用的。

而如果運氣不錯,或者問題有一定的特性,便可以讓解決問題的速度變快很多。

 

[@more@]

[pre class]RDF

  RDF(Resource Description Framework)"資源描述結構"是由W3C主導以及結合多個元資料團體,所發展而成的一個架構,可用來攜帶多種不同的元資料來往於網際網路和WWW上。

  RDF是一個與任何特定電腦語法無關的抽象的資料表達模式,用來呈現一個特性還有值。而所謂的「特性」(Property),可能是資源的屬性:如題名、著者等,資料的題名(Title)欄位即可歸屬於這類。

  資源間的關係:如資料的關連(Relation)和來源(Source)兩欄位即屬於這類範疇。

  RDF的另外一個特點是"語法獨立性",兩段看起來差異很大的RDF陳述,事實上可能是描述相同的一件事,這是因為RDF是一個抽象的資料模式。由於這個抽象的特點,各種不同的元資料均可利用此種抽象的資料模式,來表達它們的內容。

參考網站:http://home.kimo.com.tw/gooloo1234/

訂閱文章