Thursday, June 26, 2008

Stay Hungry, Stay Foolish

  • Steve Jobs' 2005 Stanford Commencement Address
  • Steve Jobs於2005年給史丹福大學畢業生發表的演講辭,很有深度的演講。

Sunday, June 08, 2008

WCCI 2008 in Hong Kong

  • WCCI 2008 in HK
  • 由IEEE舉辦的World Congress on Computational Intelligence 2008,結合了IJCNN, FUZZ-IEEE,CEC的WCCI今年在香港舉辦,能夠參加這個議會已經超出我的預期的範圍,我也是整個議會裡少數幾個Undergraduate Student,對此我真的很幸運有機會去見識一下目前的計算機智慧的走向。

    這次會議從6/1~6/6為期六天(6/1為Tutorial),而我和教授兩人則早在5/31抵達香港,因為教授是信仰天主教,也因為如此我去參加了我生平第一次的教會,一間落座九龍尖沙咀的聖安德烈教堂做禮拜。

    (由於門口寫著嚴禁拍攝,我只好從wiki上取得照片,實際的情景會比照片上顯得綠意盎然許多。)

    6/1日的下午我們就先去香港會議展覽中心報到,也在當晚的餐敘盡可能認識一些朋友

    離開Hong Kong Convention and Exhibition Centre之後,我馬上就坐著MTR到中環然後達著Star Ferry從中環坐到尖沙咀,為得就是要一睹維多利亞港灣的夜景。

    到了尖沙咀之後,二話不說就衝到觀景台上拍下了尖沙咀大鐘樓的外貌。

    於是就抱著流浪的心情四處亂逛,忽然看見了這一個status,我實在不知道她是誰,但我還是把他給拍下來了。

    逛著逛著眼見時間也不早了,遊客也紛紛離去,我就答著MTR回到旺角住處。

    • 6/2
    • 會議的第一天,一早就飄起細雨,聽了一整個早上的Evolutionary Computation Presentation,疲憊的我坐在會議中心的休息區對外面的風景拍了這麼一張照片

      下午依然是同樣的行程,雨越下越大,似乎也表達出我的心情,6/2下雨的香港夜晚,讓我停止了對這繁華的城市探索之路。

    • 6/3
    • 今天起了個大早(6:00 a.m),因為從行程表得知Davie Fogel要來做今天Plenary Session的Speaker,於是就趕快盥洗換裝好,迅速前往會展中心佔個好位置。

      The Burden of Proof,光是看這個標題其實很難猜出他想要表達的意思,當時我也是這麼想的,直到Fogel的Presentation接近尾聲時我才了解他想要傳達的意境,我們除了花很多心力在人工智慧上之外,也別忘了這個世界還有更多值得我們關心的議題,像是環境與生態的問題。

      聽完早上的Plenary Session之後喝個咖啡當作早餐就直接前往今天最有趣的一個行程-Competition Session -Game,星期二的這一場主要是以othello以及Pac-Man這兩個經典遊戲為主,othello部份則是以3-truple的evaluate function為主題,但因為othello本身並不是那麼有趣,所以重點還是放在Pac-Man的人工智慧比賽上。不禁覺得很可惜沒有趕上這班競賽列車。

      當天晚上望角的街上飄著雨,正猶豫著是否要趕去中環搭山頂火車上去太平山上,但想到既然難得來了,小小的雨算什麼,於是就搭著MTR去中環,一下地鐵從匯豐銀行走到中銀大廈,眼見雨勢越來越大,心想是不是該打堂退鼓,因為褲子已經濕一半了,但我還是沒有放棄繼續沿著花園道往上走,只是走著走著(不知走多久了)前方走來一對上海來的夫婦問我說山頂纜車在哪?真是有夠巧我也在找這個地方,於是我們三個遊客就沿路問人,原來三頂纜車的搭乘點我們早就錯過了(看樣子我近視不淺),正當我們一行人很高興的準備走到山頂纜車搭車處時,忽然間一道閃電閃過,接著而來的就是雷聲巨響,這一幕可真是怵目驚心,因為我看到的不只是閃電,還有火光。頓時心想,我會不會去山上被雷劈死,但我還是去搭乘了。

      雖然外面是下著大雨,但卻無法動搖我們這一群遊客使命必達的堅定意志,一上火車大家除了拍照之外就是關窗,因為雨勢越來越大,且雨水都噴進來了(說實在那個窗有夠難關的,應該要重新設計過)

      因為雨勢實在太大,所以我沒有前往關景台上拍攝照片,只有在這些應該是紀念品商店閒晃,忽然看見久違的李小龍蠟像,也在這邊買了一些紀念品。

      眼看雨勢沒有要變小的跡象,我只好又搭著火車結束今天的行程。

    • 6/4
    • 今天中午的invited Session去聽了關於Objective的演講,說實在聽完之後還真的不知道在說什麼,光是Multi-Objective就已經很奇特了,那未來又會是甚麼?

      當天晚上我就為自己規劃一個亂走路線,望角->中環->紅磡->九龍塘->望角,很不幸的計畫跟現實總是有落差,我到了中環的渡輪碼頭之後才發現往紅磡沒有開了,我只好在附近隨處逛逛

      鑑於上次來時沒有好好拍他一下,我又拍了一張中環碼頭的照,忽然間右邊來了一堆日本團,於是我就很賤的走在他們前面(嘿嘿!你們不能到處跑),雖然自由行沒有專業的導遊來安排行程,常常會不知該往何處,但是那種自由自在的感覺,不是那種被指定說什麼時候該走,什麼時候該停的人可以了解的(嘿嘿~)。

      我在尖沙咀的碼頭向外拍了這麼一張美麗的照片。接著就搭船到灣仔。步行到銅鑼灣,不知道是哪個廣場裡在集會遊行,為了不要湊熱鬧我就趕緊離開是非之地,走著走著走到天后站了,時間不早也該回住處了。

    • 6/5
    • 明天就要離開香港了,所以今天就是在香港的最後一夜,有甚麼遺願要趕快在這一晚完成(奇怪,我是來參加研討會的是來觀光),於是我今天決定要再闖一次太平山。

      這一次我可終於照到火車了(夜景還真的不適合開閃光。)

    來到山頂的觀景台上當然就是要拍照啦!縱使外面在下著雨也要使命的拍

    山頂廣場的俯視圖。

    我買了一個甜筒站在廣場前面看著對面的電視牆邊吃我的冰,怎麼有種旅人的滄桑感...

    在山頂廣場待了很久,待到店家都紛紛要打烊我再搭著山頂火車離開。

    回到中環後我獨自一個人(一直都一個人)待在皇后像廣場逗留,正當我讚嘆這裡不止景美且可以上網的同時,我的銳利的視覺感應告訴我旁邊有黑色不明物體移動,那就是我們熟悉的小強蟑螂,偏偏在這個時候跑出來給我掃興。

    有趣的是旁邊有一個大型電子廣告看板,畫面上播放著美麗的花朵綻放的動畫(其實只是幾何圖形的漸變),原來他是...CHANEL的廣告看板

    時間真的不早了,而且走了那麼久也累了,再拍幾張照片也該結束在香港的最後一個晚上。

    背後那黃色發光的建築是香港立法會大樓。

  • 6/6
  • 今天是會議的最後一天了,而我今天彷彿是來到日本的機器人發表會上一樣,因為我今天所聽的主題都跟人機互動有關,而這個領域的專家多半是日本人,所以常常會有整個Session裡都是日本的講者的情況發生,只是部份的講者英文不是很好,所以常有出糗的情況發生,為了不讓他們緊張,所以我就沒有拍照了。

    中午趁空檔我在會議室的走道上拍了這麼一張照片

    下午因為去聽Advanced Intelligent Interaction聽到快4:30pm. 所以當我一到大廳時他們已經閉幕完畢在吃東西了(囧...)

    無論如何,我還是要在看板前拍一張照,證明我來過了。


[C/C++] Connected Component

  • Connected Component
  • Download:conncpn.cpp

    Connected Component是圖學理論裡一個很重要且很基本的定理,他主要的用意就是將一張圖畫分成數個區塊,一般分為四方向鄰邊偵測(上下左右),以及八方向鄰邊偵測(上下左右,右上,右下,左上,左下)。下圖是一個10x10的矩陣,乍看之下所有有效數值都是1,如果以八方向來劃分共可分成六堆,分堆原則很簡單,如果某一個元素他的八方向鄰邊皆為0,那他就自成一堆,反之則與鄰邊的數值成為一堆。

    以八方向為例,只需要檢測左,左上,上,這三個方向數值即可:

    檢測的程式碼片段如下:

    void findCpn(int **map, int row, int col)
    {
        int i,j,currn=0,max;
        for(i=1;i<row+1;i++){
            for(j=1;j<col+1;j++){
                if(max = (findMax(map[i][j-1], map[i-1][j], map[i-1][j-1]))){
                    if(map[i][j-1] && map[i][j-1] != max) checkAndReplace(map,i,j-1,map[i][j-1],max);
                    if(map[i-1][j-1] && map[i-1][j-1] != max) checkAndReplace(map,i-1,j-1,map[i-1][j-1],max);
                    if(map[i-1][j] && map[i-1][j] != max) checkAndReplace(map,i-1,j,map[i-1][j],max);
                    if(map[i][j]) map[i][j] = max;
                }else if(map[i][j]) map[i][j]=++currn;
            }
        }
    }
    比較有效率的撰寫方式會使用到Tree的結構來做分堆,由於筆者比較懶所以就直接使用類似老鼠走迷宮的遞迴模式來做鄰邊的分類,如下程式碼:

    void checkAndReplace(int **map,int i,int j,int ori,int modi)
    {
        if(map[i][j]==ori){
            map[i][j]=modi;
            checkAndReplace(map,i-1,j,ori,modi);
            checkAndReplace(map,i,j-1,ori,modi);
            checkAndReplace(map,i,j+1,ori,modi);
            checkAndReplace(map,i+1,j,ori,modi);
            checkAndReplace(map,i-1,j-1,ori,modi);
            checkAndReplace(map,i+1,j-1,ori,modi);
            checkAndReplace(map,i-1,j+1,ori,modi);
            checkAndReplace(map,i+1,j+1,ori,modi);
        }
    }
    遞迴的部份觀念非常簡單,就以某個指定的map[i][j]為中心,向八個方向做檢測。

    最後的輸出結果如下:

    所以你可以很清楚的看到,原始的地圖經過conncpn的程式運算之後就會劃分成如上的區塊。(這裡為了demo方便使用了recursive的形式,正常來講不應該這樣實做,因為會損失很大的效率)