轮盘赌算法

轮盘赌算法思想
在这里插入图片描述
举个例子
若有群体pop,里面存在的个体为:

pop = [‘a’ ,‘b’, ‘c’, ‘d’, ‘e’]

他们的适应度(用于衡量被选择的概率)为:

obj = [1 ,3, 0, 2, 4]

判断是否选择的标准为一个随机生成的有序的序列:

ms = [0.05 , 0.2 , 0.7 , 0.8 ,0.9]

按照上述流程,计算出的相应的结果为:
1.被选择概率

p= [0.1 , 0.3, 0 , 0.2 , 0.4]

2.累积概率

q= [0.1 , 0.4 , 0.4 , 0.6 , 1.0]

即当前个体累积概率为之前所有样本的概率与自身所占概率之和。

3.选择过程
q[0] > ms [0] ---------第0个个体在此次被选择 j++
q[0] < ms [1] ---------第0个个体在此次不被选择 i++
q[1] > ms [1] ---------第1个个体在此次被选择 j++
q[1] < ms [2] ---------第1个个体在此次不被选择 i++
q[2] < ms [2] ---------第2个个体在此次不被选择 i++
q[3] < ms [2] ---------第3个个体在此次不被选择 i++
q[4] > ms [2] ---------第4个个体在此次不被选择 j++
q[4] > ms [3] ---------第4个个体在此次不被选择 j++
q[4] > ms [4] ---------第4个个体在此次不被选择 j++
最终选择的个体为第0、1、4三个个体,可见具有大概率选择那些本身适应度就比较大的个体。

import random


def sum(fit_value):
    total = 0
    for i in range(len(fit_value)):
        total += fit_value[i]
    return total

# =============================================================================
# 累积概率计算
# =============================================================================
def cumsum(fit_value):
    t = 0
    for i in range(len(fit_value)):
        t = t + fit_value[i]
        fit_value[i] = t
    return fit_value

# =============================================================================
# 轮盘赌算法
# =============================================================================
def ga_selection(pop, fit_value):
    
    #计算累积概率
    newfit_value = []#存储每个个体的累积概率
    # 适应度总和
    total_fit = sum(fit_value)
    for i in range(len(fit_value)):
        #计算每个适应度占适应度总和的比例
        newfit_value.append(fit_value[i] / total_fit)
    # 计算累计概率
    cumsum(newfit_value)
    
    #生成随机数序列用于选择和比较
    ms = []#随机数序列
    pop_len = len(pop)
    for i in range(pop_len):
        ms.append(random.random())
    ms.sort()
    
    
    #轮盘赌选择法
    fitin = 0
    newin = 0
    newpop = pop
    while newin < pop_len:
        #选择--累积概率大于随机概率
        if(ms[newin] < newfit_value[fitin]):
            newpop[newin] = pop[fitin]
            newin = newin + 1
        #不选择--累积概率小于随机概率
        else:
            fitin = fitin + 1
    pop = newpop

if __name__ == '__main__':
    pop = ['a' ,'b', 'c', 'd', 'e']
    obj = [1 ,3, 0, 2, 4]
    #newfit_value = [0.1 , 0.4 , 0.4 , 0.6 , 1.0]
    ga_selection(pop, obj)
    print(pop)

轮盘赌算法也应用于遗传算法中选择和复制比较好的个体。

  • 9
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值