在遗传算法中使用Golang实现轮盘选择法

我正在构建一个模拟轮盘选择函数用于遗传算法。首先,我想在主函数中计算fitnessScoresum。在计算出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))}

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注