閱讀530 返回首頁    go 阿裏雲 go 技術社區[雲棲]


測試2

出於好玩的心態,我決定學習一下Go語言。我認為學習新語言最好的方法就是深入學習,並且盡可能多犯錯誤。這樣做雖然可能會很慢,但是可以確保在後麵的過程中再也不會出現編譯的錯誤。

Go語言與我習慣的其他語言不同。Go更喜歡自己單獨實現,而其他像Java這類語言更喜歡繼承。其實在Go語言裏麵根本沒有繼承這種概念,因為它壓根就沒有對象這一說法。比如說C語言,它有結構體,但是沒有類。但是這樣它還是可以有像“構造者”這樣的常見思想和設計模式(一種在這種情況下有序地產生結構體的方式)。

Go語言堅決擁護組合(composition),同時也很反對繼承的做法,在網絡上引起了強烈的討論,同時也讓人們重新思考了語言該往哪個方向發展。所以,從這個角度來看,Go語言與其它語言的差別可能也沒有那麼大。

本文將重點介紹如何用Go語言實現遺傳算法。如果你還沒有參加過GoLang Tour,我還建議你快速看一下這門語言的介紹。

話不多說,讓我們開始從代碼說起吧!第一個例子與我以前做過的很類似:找到一個二次的最小值。

type GeneticAlgorithmSettings struct {
  PopulationSize int
  MutationRate int
  CrossoverRate int
  NumGenerations int
  KeepBestAcrossPopulation bool
}

type GeneticAlgorithmRunner interface {
  GenerateInitialPopulation(populationSize int) []interface{}
  PerformCrossover(individual1, individual2 interface{}, mutationRate int) interface{}
  PerformMutation(individual interface{}) interface{}
  Sort([]interface{})
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

我立馬定義了一組設置,以便在稍後啟動的算法中用到。

第二部分的GeneticAlgorithmRunner這個看起來有點奇怪。GeneticAlgorithmRunner是一個接口,詢問如何生成初始種群,執行corssovers和mutataions,並對答案進行排序,以便在Population中保持最好的個體,這樣下一代才會更加優秀。我認為這看起來很奇怪,因為“接口”通常用於麵向對象的語言,通常會要求對象實現某些特性和方法。這裏沒有什麼差別。這一小段代碼實際上是在說,它正在請求一些東西來定義這些方法的細節。我是這樣做的:

最後更新:2017-11-16 18:04:26

  上一篇:go  30 分鍾學會 Flex 布局
  下一篇:go  Working with Big Data on Alibaba Cloud