遗传算法介绍

遗传算法

用遗传算法求解
f(x)=10xsin(2x)+20xcos(3x)
在区间
在这里插入图片描述

import numpy as np
import math
import random

#判定需要多少二进制位数
def DeciBina(spacinte,accu):
    ls = int(spacinte/accu)
    lenth_min = 0
    lenth_max = 100
    while (lenth_min < lenth_max-1):
        mid = math.ceil((lenth_min+lenth_max)/2)
        if math.pow(2,mid)>ls:
            lenth_max = mid
        if math.pow(2,mid)<ls:
            lenth_min = mid
        if math.pow(2,mid)==ls:
            return mid
    return lenth_max

#生成候选群体
def genegroup(gpnum,lenth):
    pop = [[]]
    for i in range(gpnum):
        temp = []
        for j in range(lenth):
            temp.append(random.randint(0, 1))
        pop.append(temp)
    return pop[1:]

#评价、适应度、选择
def calobjvalue(pop,lenth):
    popnum=len(pop)
    popvalue = []
    for i in range(popnum):
        t = 0
        for j in range(len(pop[i])):
            t+=pop[i][j]*math.pow(2,j)
        t1 = -1 + t*3/math.pow(2,lenth)
        popvalue.append(10*t1*math.sin(2*t1)+20*t1*math.cos(3*t1))
    return popvalue

def calfitvalue(popvalue,c_min):
    num = len(popvalue)
    group_fit = []
    for i in range(num):
        if popvalue[i] <= c_min:
            group_fit.append(c_min)
        else:
            group_fit.append(popvalue[i])
    return group_fit

#选择与繁殖,
#计算累积比率、生成随机数、累计比率和随机数列比较、得到新的群体
def sum(group_fit):
    sumrate = []
    total = 0
    for i in range(len(group_fit)):
        total += group_fit[i]
    total1 = 0
    for j in range(len(group_fit)):
        total1+=group_fit[j]
        rate = total1/total
        sumrate.append(rate)
    return sumrate
def best(pop,group_fit):
    max_fit = 0
    individual = []
    best_index = 0
    for i in range(len(pop)):
        if group_fit[i]>max_fit:
            max_fit = group_fit[i]
            best_index = i
    individual = pop[best_index]
    return individual,max_fit
def chsegrop(pop,group_fit):
    sumrate = sum(group_fit)
    pop_len = len(pop)
    ms = []
    for i in range(pop_len):
        ms.append(random.random())
    ms.sort()
    msindex = 0
    fitindex = 0
    popnew = [[]]
    for i in range(pop_len):
        if sumrate[i]>=ms[i]:
            fitindex = i
        popnew.append(pop[fitindex])
    return popnew[1:]

#是否交换,以及交换的位置
def crossover(popnew,js):
    pop_len = len(popnew)
    pop = popnew
    for i in range(pop_len-1):
        if random.random()<js:
            temp1 = []
            temp2 = []
            cpoint = random.randint(0,len(popnew[i]))
            temp1.extend(popnew[i][0:cpoint])
            temp1.extend(popnew[i+1][cpoint:len(popnew[i+1])])
            temp2.extend(popnew[i+1][0:cpoint])
            temp2.extend(popnew[i][cpoint:len(popnew[i])])
            pop[i] = temp1
            pop[i+1] = temp2
    return pop

#是否变异,以及变异的位置
def mutation(pop,bs):
    py = len(pop[1])
    for i in range(len(pop)):
        if random.random()<bs:
            print('i:%s'%i)
            cpoint = random.randint(0,py-1)
            print('**%s**'%len(pop[i]))
            print('88-%s-88'%len(pop))
            print('cpoint=%s'%cpoint)
            if pop[i][cpoint]==1:
                pop[i][cpoint]=0
            else:
                pop[i][cpoint]=1
    return pop

def main():
    #启发式,评价,交叉,变异
    lenth = DeciBina(3,0.01)
    pop = genegroup(500,lenth)
    result = []
    episode = 0
    while episode<500:
        print(episode)
        popvalue = calobjvalue(pop, lenth)
        group_fit = calfitvalue(popvalue, 0.1)
        individual, max_fit = best(pop, group_fit)
        pop = chsegrop(pop, group_fit)
        print(len(pop))
        pop = crossover(pop, 0.3)
        print(len(pop))
        pop = mutation(pop, 0.25)
        print(len(pop))
        episode+=1

    print(individual)
    print(max_fit)

main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值