天天看點

一道算法題,看看大家的思路

  題目描述:有31,-41,59,26,-53,58,97,-93,-23,84十個數。SUM(N,M)表示從第N個數到到第M個數的和。例如:SUM(2,3)=-41+59=18。問:最大的和是多少?對應的N和M是多少?

  這個題目并不難,實作的方法多種多樣。最壞的算法,周遊所有的情況,求出最大和。

  我在這兒提一個算法的思路,不是最優的,主要是講解這個算法的。

  根據題目,構造生物S,生物S有三個屬性N、M、V。N表示開始的下标,M表示結束的下标,和題目中的定義一樣。V表示從第N個數到第M個數的和,V和N、M是相關的。是以,可以用S(N,M)表示這個生物。

  先期構造10個這樣的生物。稱為第一代。

  生物有兩個特性,繁衍性和變異性。

  繁衍性:生物S1(N1,M1)和生物S2(N2,M2)繁衍的後代為生物S3(N1,M2)和生物S4(N2,M1)

  變異性:生物S1(N1,M1)産生變異,得到S2(N2,M1)或者是S2(N1,M2)

  第一代生物通過繁衍和變異得到10個後代(繁衍和變異的比例自定)。這樣一共有20個生物。然後這20個生物采用優勝劣汰的方法,保留10個V最大的生物,淘汰10個生物。這稱為自然選擇的一代。

  模拟大自然的自然選擇,通過初期的10個生物,經過5代的自然選擇,基本上就能得到最優解。

  模拟生物算法(遺傳算法),就是利用繁衍和變異以及優勝劣汰,保留最優的生物,得到最優解。在某些實際問題中,能達到不錯的效果。不過模拟生物算法(遺傳算法)不能保證一定能在最優解收斂,但基本上能保證在局部最優解上實作收斂。

  本題用模拟生物算法(遺傳算法)并不是最合适,我隻是利用這道題簡單介紹模拟生物算法的基本思想。

  歡迎各位提出本題的最優算法,空間上的最優算法、時間上的最優算法。

繼續閱讀