我正在构建一个模拟轮盘选择函数用于遗传算法。首先,我想在主函数中计算fitnessScore
的sum
。在计算出fitnessScore
的总和后,我希望使用Go语言的math/rand
包从这个sum
中随机选择一个值。在这种情况下,我应该如何使用rand
包?如何修正spin_wheel := rand.sum
来随机选择一个值?
package mainimport( "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))}
回答:
例如,
package mainimport ( "fmt" "math/rand" "time")// 根据权重(概率)返回选中的权重// 适应度比例选择法:// https://en.wikipedia.org/wiki/Fitness_proportionate_selectionfunc rouletteSelect(weights []float64) float64 { // 计算总权重 sum := 0.0 for _, weight := range weights { sum += weight } // 获取一个随机值 value := rand.Float64() * sum // 根据权重定位随机值 for _, weight := range weights { value -= weight if value <= 0 { return weight } } // 仅当出现舍入误差时 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))}