使用目的:可以求解局部最大值,当数值范围过大时,不适用,仅适用于局部最优解
步骤:
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)))