遗传算法的python实现

该文详细介绍了遗传算法的实现过程,包括种群初始化,通过二进制转换计算适应度值,然后进行选择、交叉和变异操作来优化种群。适应度函数为10*sin(5*x)+7*|x-5|+10,交叉率为随机概率,变异率同样影响个体变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Created with Raphaël 2.3.0 种群初始化 适应度计算 选择 交叉 变异

1.种群初始化

self.population = np.round(np.random.rand(pop_size, chromosome_size)).astype(int)

2.适应度计算

  • 二进制转换为区间为[0, 10]的十进制
def binary2decimal(self, population):
    pop1 = np.zeros_like(population)
    y = self.chromosome_size
    for i in range(y):
        pop1[:, i] = 2 ** (y - i - 1) * population[:, i]
    pop = np.sum(pop1, 1)
    pop2 = pop * 10/(1 << y)
    return pop2
  • 使用目标函数计算适应度
self.fit_value = 10 * np.sin(5 * x) + 7 * np.abs(x - 5) + 10

3.选择

def select_chromosome(self):
    total_fitness_value = self.fit_value.sum()
    p_fit_value = self.fit_value/total_fitness_value
    p_fit_value = np.cumsum(p_fit_value)
    point = np.sort(np.random.rand(self.pop_size, 1), 0)
    fit_in = 0
    new_in = 0
    new_population = np.zeros_like(self.population)
    while new_in < self.pop_size:
        if point[new_in] < p_fit_value[fit_in]:
            new_population[new_in, :] = self.population[fit_in, :]
            new_in += 1
        else:
            fit_in += 1
    self.population = new_population

4.交叉

def cross_chromosome(self, cross_rate):
    x = self.pop_size
    y = self.chromosome_size
    new_population = np.zeros_like(self.population)
    for i in range(0, x-1, 2):
        if np.random.rand(1) < cross_rate:
            insert_point = int(np.round(np.random.rand(1) * y).item())
            new_population[i, :] = np.concatenate([self.population[i, 0:insert_point], self.population[i+1, insert_point:y]], 0)
            new_population[i+1, :] = np.concatenate([self.population[i+1, 0:insert_point], self.population[i, insert_point:y]], 0)
        else:
            new_population[i, :] = self.population[i, :]
            new_population[i + 1, :] = self.population[i + 1, :]
    self.population = new_population

5.变异

def mutation_chromosome(self, mutation_rate):
    x = self.pop_size
    for i in range(x):
        if np.random.rand(1) < mutation_rate:
            m_point = int(np.round(np.random.rand(1) * self.chromosome_size).item())
            if self.population[i, m_point] == 1:
                self.population[i, m_point] = 0
            else:
                self.population[i, m_point] = 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值