有趣的演算法世界---什麼是演算法 (轉)

worldblog發表於2007-08-14
有趣的演算法世界---什麼是演算法 (轉)[@more@]

 

  什麼是演算法?
  如果您想進入這個世界的話,您就不應該不知道,這個美麗的世界,她究竟是什麼?
  什麼是演算法?是呀,這是個問題。它的意義,可比於那個“To be,or not to be”,如果我們也如哈姆雷特般的徘徊起來:)……

  我們不妨先回顧上次的一個問題,SAT問題。
  當然,考慮問題總應從最簡單處入手啦。看下面簡單的例子,10個邏輯變數的:

  C0 : -x0 V -x3 V x5 

  C1 : -x1 V -x6 V x7 

  C2 : -x5 V x8  V x9

  這個子句集合可以都為真嗎?呵呵,要解決它,我們是有辦法的,要不就這樣,10個邏輯變數,我們給出一組賦值:

  TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE

  去測試C0、C1和C2,如果子句都是取值為真,則這組賦值滿足要求,返回它,結束。否則,我們試下一組:

  TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,FALSE

  ……

  如果搜尋所有的賦值後,沒有使這個集合的所有子句都為真的賦值,則輸出此集合不可滿足。

  這是我們的一個思路。當然,我們可以寫出一個“描述精確步驟的字元文字”,它表示了我們一步一步解決問題的辦法。我們加以歸納,這就是演算法的定義,即一步一步求解問題的方法,它有如下的特徵:

 (1)必為一有限文字的表示; 

  (2)每一步必有可能在有限的時間內機械的完成。

  這個描述,固然很好理解,但作為基本的概念,演算法可有形式化的定義?我們知道,如果是有窮自動機,它的演算法是有形式化定義的,而一般意義的演算法,我還未見到。自己也想應如何定義,卻不知所終。

  但對於演算法之內涵,還是有可討論的地方。我先來問您:

  演算法可否可以無窮?

  “哈哈,我寫了一個‘演算法’,執行到世界末日也不會結束……”,這是個演算法嗎?是嗎?不是嗎?呵呵,您是如何想的,不妨說說看。我的看法,當然是;演算法當然可以無窮執行。(這裡我們講演化計算的康老師有個例子:你寫個鐘錶的演算法,它永不停息的走下去……不也是個演算法嗎?)

  那麼,我來問第二個問題:

  是什麼使某些問題很難解決,而又使另一些問題很容易解決?

  舉例來說,上次的例子,求自然數前n項和,比如n=1000,這個問題計算機可在一瞬間計算出來,而1000個變數的SAT問題,計算機只怕有些難以計算了。為什麼?是什麼因素起了決定作用,使的我們的演算法如此的不同?我們可充分的理解了它的實質嗎?毫無疑問目前還沒有,幾十年來的研究成果就是,我們有了一個標準,把問題劃分為幾類,我們知道什麼是難題。僅知道它是難題。

  問題遠不止這些。但我們不會畏懼未知!

  事實上,就是因為這些困難的存在,就是因為有無限的荒原,有戈壁,有沙灘,我們的這個世界才有了她獨特的魅力……我相信無數的人希望在這裡開拓出一片綠色的原野,希望在這裡勞作,冒險,品嚐爭取、擁有或失敗的歡樂!

  呵呵,您準備好了嗎?是否有充分的信心,隨我進入這個世界?如果是的話,我再給您說說我眼中的這個世界,她的獨特,優美,搖曳多姿……

  這個世界,與她的兄弟姐妹有著千絲萬縷的關係。

  首先,演算法的世界,因數學模型的不同會有大不同
  我們來看這個例子,不要說它簡單哦:):

  e.g.1  求方程的根:  ax+b=0  (a!=0)
 
  問問自己,您會如何解決?使用計算機,我想您肯定會這樣想:
  存在x1,使得 a*x1+b<0, 存在x2,使得 a*x2+b>0,那麼,在區間[x1,x2]內使用折半法迭代搜尋!
  如果您這樣解決,我一點都不奇怪。事實上,我的第一反應,也是這樣的解法。這個演算法的數學背景是,誤差控制內的數值方法。
  當然,非常優秀的演算法。也適合本題。

  但是,如果您把它留給任何一個學過簡易方程的小學生的話,我想他(她)的解法毫無疑問是這樣的:
  ax+b=0
  ax=-b
  x=-b/a  (a!=0)
  呵呵,怎麼樣?您或許會說,“哦……是呀,如果手算(換句話,人算:),我當然也這樣解決。可是,用計算機呀……”。
  用計算機就不可以了嗎?
  您注意到,人解決問題的方式是邏輯思維,不是按步長搜尋或迭代的。如果我們一開始考慮的數學模型是另外一個樣子的話,我們的演算法將是完全不一樣的:

  定義:
  個體域: 實數集R
  函詞:  add(a,b): a+b
  mul(a,b): a*b

  謂詞:  Equal(a,b): a==b
  規則:  Any x,y in R, Equal(add(x,y),0)->Equal(x,add(0,-y))
  Any x,y,z in R, Equal(mul(x,y),z) and ┐(Equal(y,0))->Equal(x,mul(z,1/y))

  規則集中給出的是最重要的兩個,其他的就沒有加進來;但已經可以討論問題了。我們依據這個邏輯,使用類似與機器證明的演算法,完全可以推出方程的解。

  您認為怎麼樣?或許,對於方程您還不在意數學模型的問題,但是,做一個大型的專家系統,您必須來細緻的考慮這個問題了。

  後注:這個問題我的本意不是讓您定義一個f,引數為a,b,返回 -b/a :)。呵呵,或許例子過於簡單了。可我需要您著重體現出“計算”的過程。

  其次,演算法的世界因計算機體系結構的不同而大不同

  我們仍然考慮上次的一個簡單的問題,求和:)。現在為:

  e.g.2  有n個資料,求和

  您如何來解決?呵呵,是不是我問的很傻?或者,您怪我把您看的太傻?哈哈,沒有沒有,如果您問多數的員(包括在校學生的準程式設計師),多半人會說:

  一個迴圈:  sum=0;
   For i=0 To n-1 Do 
     sum+=a[i];
  其中a[]存放資料。如果他又是個細心的人,他會考慮sum會不會資料,這樣他或許會考慮一個資料結構來存放結果。

  沒有問題的演算法,一定程度上滿足了題目的要求。但是,您的演算法是基於單處理機的!這個工作,如果您的公司裡有一個機群,您或許不應該使用這個演算法了,您需要一個並行演算法。那麼,您需要把問題分割,並考慮通訊的開銷。演算法就會完全改變了!

  最後,一個淺顯的特點,演算法的世界因問題的規模不同而大不同。
  一開始就分析的SAT問題是個很好的例子。10個邏輯變數我們或許可以窮舉,但窮舉絕對不是本問題的可採取的演算法!否則它的時間開銷將是按指數級增長的!

  兼於我做了個這個問題的專案,演化計算來解決的,我後面還將更全面的分析這個問題。包括爬山法,A演算法,A*演算法,當然還有最後的解決方案,演化計算。

  總而言之,演算法世界可謂多姿又多采。因為我對於她的熱愛,所以我自願來做嚮導,雖然這個嚮導不好,但仍然盼望您不要因此拒絕風景的美麗哦!

  下次將討論數學,演算法的淵源。

  本帖的題目:

  國王的城堡(percy lee提出:):
  有個國王,他的領土內有n個城堡。國王疑心很重,他認為敵人有可能偷襲並佔領任何一個城堡。因此他給他的將軍和財政大臣發了一道旨意,命令他們共同完成一項工程,在這n個城堡間修建大道,以保證任何k個城堡被敵軍佔領後,我方的城堡仍然可以透過大道相互支援。將軍毫無疑問要不惜一切代價完成使命,而財政大臣的任務就是使所有的花費盡可能低。這項工程應該如何完成?(假設花費只和道路的長度有關)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-956686/,如需轉載,請註明出處,否則將追究法律責任。

相關文章