2015-10-07 57 views
0

我正在爲遺傳算法構建一個模擬輪盤選擇函數。首先,我想將fitnessScoresum加在主函數中。在合計fitnessScore之後,我想在Go中使用math/rand包隨機化sum中的一個值。我應該如何在這種情況下使用rand軟件包如何修復spin_wheel := rand.sum以便隨機選擇一個值?使用Golang的遺傳算法中的輪盤選擇

package main 

import(
    "fmt" 
    "time" 
    "math/rand" 
) 

func rouletteWheel(fitnessScore []float64) []float64{ 
    sum := 0.0 
    for i := 0; i < len(fitnessScore); i++ { 
     sum += fitnessScore[i] 
    } 

    rand.Seed(time.Now().UnixNano()) 
    spin_wheel := rand.sum 
    partial_sum := 0.0 
    for i := 0; i < len(fitnessScore); i++{ 
     partial_sum += fitnessScore[i] 
     if(partial_sum >= spin_wheel){ 
      return fitnessScore 
     } 
    } 
    return fitnessScore 
} 

func main(){ 
    fitnessScore := []float64{0.1, 0.2, 0.3, 0.4} 
    fmt.Println(rouletteWheel(fitnessScore)) 
} 
+0

能否請你澄清你想要做什麼?我個人沒有親眼看到您的代碼如何模擬輪盤賭輪...輪盤賭包含有34個離散值。出於某種原因,你正在做一筆總額並使用實際數字,但我不明白如何應用於輪盤賭遊戲?據我瞭解,你應該做'rand.Int31n(33)'產生一個介於0-33之間的數字,加上1得到輪盤輪的值,因爲它不是零索引,並保留索引32和33來表示0和00值。 – evanmcdonnal

+2

我不明白這是如何編譯的。 'rand.sum'將從rand中未導出;它可能存在,但是package main中的代碼無法得到它。另外'對於我:= 0;我 gbulmer

+0

這不是普通的輪盤賭法。它是由[link](https://www.youtube.com/watch?v=9JzFcGdpT8E)提供的遺傳算法的一部分。該視頻的作者使用Java,並將其移植到Golang中。是的,我意識到rand.sum問題,這就是爲什麼我要求幫助解決它。任何想法的傢伙? – zuma89

回答

1

例如,

package main 

import (
    "fmt" 
    "math/rand" 
    "time" 
) 

// Returns the selected weight based on the weights(probabilities) 
// Fitness proportionate selection: 
// https://en.wikipedia.org/wiki/Fitness_proportionate_selection 
func rouletteSelect(weights []float64) float64 { 
    // calculate the total weights 
    sum := 0.0 
    for _, weight := range weights { 
     sum += weight 
    } 
    // get a random value 
    value := rand.Float64() * sum 
    // locate the random value based on the weights 
    for _, weight := range weights { 
     value -= weight 
     if value <= 0 { 
      return weight 
     } 
    } 
    // only when rounding errors occur 
    return weights[len(weights)-1] 
} 

func main() { 
    rand.Seed(time.Now().UnixNano()) 
    weights := []float64{0.1, 0.2, 0.3, 0.4} 
    fmt.Println(rouletteSelect(weights)) 
} 
+0

當前解決方案返回一個整數。如果我想返回十進制數呢? – zuma89

+0

@ zuma89:你想要這個修改後的解決方案嗎? – peterSO

+0

是的,這是我需要的。欣賞!!!謝謝。 – zuma89