遗传算法是启发式算法的一种。算法擅长解决全局最优问题。什么是启发式算法?什么是全局最优?
遗传算法模拟生物遗传过程中染色体的交叉、变异。怎么建模问题?比如将输入转化为编码序列(如:10110101)编码长度如何设计?
本文只分享代码,上面的问题,一概不回答。搬运代码请留赞。不留也没关系。希望能帮到你。
# 遗传算法
# iter
# 初始化种群
# 种群第一代G=0
# 计算适应度
# 选择,交叉,变异
# 产生下一代种群
import numpy as np
import random
# 核心计算
def foo(x):
return sum(x)
# 选择
def select(parent):
# 锦标赛选择法
x1, x2 = random.sample(parent, 2)
if x1[1] <= x2[1]:
return x1
else:
return x2
def cross(x1, x2):
# 单点交叉
idx = np.random.choice(range(1, len(x1) - 1))
return np.concatenate((x1[:idx],x2[idx+1:])), np.concatenate((x2[:idx],x1[idx+1:]))
def mutate(x, mu):
# 单点变异
if np.random.rand() <= mu:
s = np.random.choice(range(0, len(x)))
x[s] = x[s] ^ 1
return x
# 定义x 的维度
nVar = 100
# 种群规模
nPop = 30
# 迭代次数
maxIt = 100
# 子代种群规模
nPc = 0.8
nC = round(nPop * nPc/2) * 2
# 变异概率
nMu = 0.3
# 初始化种群
parent = [[[],0]] * nPop
for i in range(nPop):
parent[i][0] = np.random.randint(0,2,nVar)
parent[i][1] = foo(parent[i][0])
# 迭代遗传
for it in range(maxIt):
Offs = list(zip([[[],0]] * int(nC/2),[[[],0]] * int(nC/2)))
Offs = [[list(y) for y in line] for line in Offs]
# 选择,交叉
for j in range(int(nC/2)):
p1, p2 = select(parent),select(parent)
Offs[j][0][0], Offs[j][1][0] = cross(p1[0], p2[0])
# 变异
Offs = [x for y in Offs for x in y]
for k in range(nC):
Offs[k][0] = mutate(Offs[k][0], nMu)
Offs[k][1] = foo(Offs[k][0])
# 筛选精英
parent = parent + Offs
parent = sorted(parent, key=lambda x:x[1])[:nPop]
print("迭代次数:{},最小值:{}".format(str(it), str(parent[0][1])))
还有什么算法针对解决最优解问题?蚁群算法,模拟退火了解一下(●'◡'●)