遗传算法(SGA)的python代码

遗传算法是启发式算法的一种。算法擅长解决全局最优问题。什么是启发式算法?什么是全局最优?

遗传算法模拟生物遗传过程中染色体的交叉、变异。怎么建模问题?比如将输入转化为编码序列(如: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])))

还有什么算法针对解决最优解问题?蚁群算法,模拟退火了解一下(●'◡'●)

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半九拾

援助一个bug吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值