一、遗传算法简介
遗传算法(Genetic Algorithm)是优化问题中的一种进化算法。这种算法源于生物学中进化理论的基本思想,通过模拟生物的进化过程来解决问题。遗传算法具有非常广泛的适用范围,在机器学习、数据挖掘、优化等领域都有广泛的应用。
遗传算法的核心思想是通过模拟自然界中的进化过程,进行优化的求解过程。具体来说,遗传算法首先需要设定一个初始种群,然后通过选择、交叉、变异等操作,对种群不断进行迭代和进化,最终得到最优解。
二、遗传算法的基本流程
遗传算法的基本流程如下:
- 初始化:创建一个种群,其中每一个个体对应一个问题的解。
- 评估:对每个个体进行评估,得到该个体对应问题的解的适应度。
- 选择:根据适应度对种群进行选择,选择前若干个个体作为下一步的父代。
- 交叉:对父代进行交叉,生成下一代个体。
- 变异:对下一代进行变异,引入新的基因。
- 替换:用新的个体替换原有的个体,生成新的种群。
- 终止:如果满足停止条件,则算法停止,返回最优解。
三、遗传算法的应用案例
案例1:函数最优化问题
以下面的函数为例,来演示如何使用遗传算法求解函数最优化问题。
def function(x):
return x*x + 5*math.sin(x)
使用遗传算法求解函数最优化问题,需要设计好适应度函数。在这里,用函数的取值来作为个体的适应度。具体的实现如下:
import random
import math
def function(x):
return x*x + 5*math.sin(x)
# 适应度函数
def fitness_func(individual):
return function(individual)
# 种群规模
POPULATION_SIZE = 100
# 交叉率
CROSSOVER_RATE = 0.8
# 变异率
MUTATION_RATE = 0.1
# 最大迭代次数
MAX_ITERATION = 100
# 种群类
class Population:
def __init__(self, size):
self.individuals = []
for i in range(size):
individual = random.uniform(-10, 10)
self.individuals.append(individual)
# 获取种群中适应度最高的个体
def get_best_individual(self):
return max(self.individuals, key=fitness_func)
# 获取种群的平均适应度
def get_average_fitness(self):
total_fitness = sum([fitness_func(individual) for individual in self.individuals])
return total_fitness / len(self.individuals)
# 选择
def selection(self):
fitness_list = [fitness_func(individual) for individual in self.individuals]
fitness_sum = sum(fitness_list)
fitness_prob = [fitness / fitness_sum for fitness in fitness_list]
selected = random.choices(self.individuals, weights=fitness_prob, k=POPULATION_SIZE)
return selected
# 交叉
def crossover(self, individuals):
new_individuals = []
for i, individual in enumerate(individuals):
if random.random() < CROSSOVER_RATE and i != 0:
parent1 = individual
parent2 = individuals[i-1]
m_rate = random.random()
new_individual = m_rate * parent1 + (1 - m_rate) * parent2
new_individuals.append(new_individual)
return new_individuals
# 变异
def mutation(self, individuals):
new_individuals = []
for individual in individuals:
if random.random() < MUTATION_RATE:
new_individual = random.uniform(-10, 10)
else:
new_individual = individual
new_individuals.append(new_individual)
return new_individuals
# 更新种群
def update(self):
selected = self.selection()
crossed = self.crossover(selected)
mutated = self.mutation(crossed)
self.individuals = mutated
在这里,我们设置种群大小为100,交叉率为0.8,变异率为0.1,最大迭代次数为100。定义一个Population类,实现选择、交叉、变异等操作。最终得到该函数的最优解。
案例2:0-1背包问题
0-1背包问题是一个经典的组合优化问题,被广泛应用于生产排程、资源分配等领域。以下是0-1背包问题的一个例子:
有一张表格,每行表示一件物品与其相应的权值和重量,背包的容量为C。假设每样物品只有一个,即只有一件可用,如何选择才能使得背包中的物品总权值最大?
使用遗传算法求解0-1背包问题,需要设计好适应度函数。在这里,用背包中物品的权值之和来作为个体的适应度。具体的实现如下:
import random
# 物品类
class Item:
def __init__(self, weight, value):
self.weight = weight
self.value = value
# 适应度函数
def fitness_func(individual, items, capacity):
total_weight = sum([items[i].weight for i in range(len(individual)) if individual[i] == 1])
if total_weight > capacity:
return 0
else:
total_value = sum([items[i].value for i in range(len(individual)) if individual[i] == 1])
return total_value
# 种群规模
POPULATION_SIZE = 100
# 交叉率
CROSSOVER_RATE = 0.8
# 变异率
MUTATION_RATE = 0.1
# 最大迭代次数
MAX_ITERATION = 100
# 种群类
class Population:
def __init__(self, size, items, capacity):
self.individuals = []
self.items = items
self.capacity = capacity
for i in range(size):
individual = [random.randint(0, 1) for _ in range(len(items))]
self.individuals.append(individual)
# 获取种群中适应度最高的个体
def get_best_individual(self):
return max(self.individuals, key=lambda x: fitness_func(x, self.items, self.capacity))
# 获取种群的平均适应度
def get_average_fitness(self):
total_fitness = sum([fitness_func(individual, self.items, self.capacity) for individual in self.individuals])
return total_fitness / len(self.individuals)
# 选择
def selection(self):
fitness_list = [fitness_func(individual, self.items, self.capacity) for individual in self.individuals]
fitness_sum = sum(fitness_list)
fitness_prob = [fitness / fitness_sum for fitness in fitness_list]
selected = random.choices(self.individuals, weights=fitness_prob, k=POPULATION_SIZE)
return selected
# 交叉
def crossover(self, individuals):
new_individuals = []
for i, individual in enumerate(individuals):
if random.random() < CROSSOVER_RATE and i != 0:
parent1 = individual
parent2 = individuals[i-1]
m_point = random.randint(1, len(self.items)-1)
new_individual = parent1[:m_point] + parent2[m_point:]
new_individuals.append(new_individual)
return new_individuals
# 变异
def mutation(self, individuals):
new_individuals = []
for individual in individuals:
if random.random() < MUTATION_RATE:
m_point = random.randint(0, len(self.items)-1)
individual[m_point] = 1 - individual[m_point]
new_individuals.append(individual)
return new_individuals
# 更新种群
def update(self):
selected = self.selection()
crossed = self.crossover(selected)
mutated = self.mutation(crossed)
self.individuals = mutated
在这里,我们设置种群大小为100,交叉率为0.8,变异率为0.1,最大迭代次数为100。定义一个Population类,实现选择、交叉、变异等操作。最终得到该问题的最优解。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/196876.html
微信扫一扫
支付宝扫一扫