算法(三)遗传算法

使用目的:可以求解局部最大值,当数值范围过大时,不适用,仅适用于局部最优解
步骤:
1 生成种群:随机数范围即是局部的范围,范围过大,会造成无法求出最优解
2 编码 :将数据进行2进制编码,实现方式——处理负数——归一化——乘以基因位数
3 选择 : 选择首先对编码数据进行解码,同时求出适应度(就是函数的解)——求每个适应度概率(适应度除以总适应度)——求出适应度分布(列表每个索引对应的值是这个位置的适应度以及前面所有适应度的和)——利用转轮盘算法获取符合的适应度分布的索引从而获取对应的编码——每次获取两个编码,对这两个编码进行交叉(交换某个区间)
4 变异:对每个编码进行遍历,超过阈值随机改变某个位置的值,比如0变1 ,1变0

代码如下:

import random
import numpy as np


def function(x):
    return -x**2 + 2*x +512

def createDataset(num):
    result = []
    for i in range(num):
        result.append(random.uniform(-1,5))
    return result

def encodeDataset(dataset):
    result = []
    for data in dataset:
        data = bin(int(2**18*(data + 1)/6))
        for i in range(len(data)-2,18):
            data = data[:2] + '0' + data[2:]
        result.append(data)
    return result

def decodeDataset(encode_dataset):
    result = []
    for data in encode_dataset:
        data = 6*int(data,2)/2**18 - 1
        result.append(function(data))
    return result

def selectDataset(encode_dataset):
    decode_dataset = decodeDataset(encode_dataset)
    decode_dataset = np.array(decode_dataset)/np.sum(np.array(decode_dataset))
    pro_dataset = []
    for index,data in enumerate(decode_dataset):
        pro_dataset.append(np.sum(np.array(decode_dataset[:index+1])))
    result = []
    for i,data in enumerate(range(len(encode_dataset)//2)):
        temp = []
        for j in range(2):
            rank = random.random()
            for index,pro in enumerate(pro_dataset):
                if index == 0:
                    if pro > rank:
                        temp.append(encode_dataset[index])
                else:
                    if pro > rank and pro_dataset[index-1]< rank:
                        temp.append(encode_dataset[index])
        temp_s = temp[0][9:15]
        temp[0] = temp[0][0:9] + temp[1][9:15] + temp[0][15:]
        temp[1] = temp[1][0:9] + temp_s + temp[1][15:]
        result.append(temp[0])
        result.append(temp[1])
    return result

def changeDataset(encode_dataset):
    rank = random.random()
    result = []
    for data in encode_dataset:
        if rank > 0.7:
            position = random.randint(2,19)
            if data[position] == '0':
                data = data[:position] + '1' + data[position+1:]
            else:
                data = data[:position] + '0' + data[position+1:]
        result.append(data)
    return result

if __name__ == '__main__':
    num = 100
    dataset = createDataset(num)
    encode_dataset = encodeDataset(dataset)
    for i in range(100):
        encode_dataset = selectDataset(encode_dataset)
        encode_dataset = changeDataset(encode_dataset)

    result = decodeDataset(encode_dataset)
    print(np.mean(np.array(result)))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值