遗传算法混合粒子群算法代码
以下是一个简单的遗传算法与粒子群算法混合的代码示例:
import random
# 遗传算法参数
population_size = 50
chromosome_length = 20
mutation_rate = 0.01
crossover_rate = 0.6
tournament_size = 5
# 粒子群算法参数
particle_size = 20
max_iteration = 100
c1 = 2
c2 = 2
w = 0.7
# 初始化种群
def initialize_population():
population = []
for _ in range(population_size):
chromosome = [random.randint(0, 1) for _ in range(chromosome_length)]
population.append(chromosome)
return population
# 计算适应度
def fitness(chromosome):
return sum(chromosome)
# 交叉操作
def crossover(parent1, parent2):
child1 = parent1.copy()
child2 = parent2.copy()
if random.random() < crossover_rate:
point = random.randint(1, chromosome_length-1)
child1 = parent1[:point] + parent2[point:]
child2 = parent2[:point] + parent1[point:]
return child1, child2
# 变异操作
def mutate(chromosome):
for i in range(chromosome_length):
if random.random() < mutation_rate:
chromosome[i] = 1 - chromosome[i]
# 选择操作
def tournament_selection(population):
tournament = random.sample(population, tournament_size)
tournament.sort(key=lambda x: fitness(x), reverse=True)
return tournament[0]
# 遗传算法主循环
def genetic_algorithm():
population = initialize_population()
for _ in range(max_iteration):
new_population = []
for _ in range(population_size):
parent1 = tournament_selection(population)
parent2 = tournament_selection(population)
child1, child2 = crossover(parent1, parent2)
mutate(child1)
mutate(child2)
new_population.append(child1)
new_population.append(child2)
population = new_population
population.sort(key=lambda x: fitness(x), reverse=True)
return population[0]
# 初始化粒子群
def initialize_particles():
particles = []
for _ in range(particle_size):
particle = {
'position': [random.randint(0, 1) for _ in range(chromosome_length)],
'velocity': [random.uniform(-1, 1) for _ in range(chromosome_length)],
'pbest': None,
'pbest_fitness': float('-inf'),
'gbest': None,
'gbest_fitness': float('-inf')
}
particles.append(particle)
return particles
# 更新粒子的速度和位置
def update_particles(particles, gbest):
for particle in particles:
for i in range(chromosome_length):
r1 = random.uniform(0, 1)
r2 = random.uniform(0, 1)
particle['velocity'][i] = w * particle['velocity'][i] + c1 * r1 * (particle['pbest'][i] - particle['position'][i]) + c2 * r2 * (gbest[i] - particle['position'][i])
particle['position'][i] += particle['velocity'][i]
if particle['position'][i] < 0:
particle['position'][i] = 0
elif particle['position'][i] > 1:
particle['position'][i] = 1
# 更新粒子的个体最优和全局最优
def update_pbest_gbest(particles):
for particle in particles:
particle_fitness = fitness(particle['position'])
if particle_fitness > particle['pbest_fitness']:
particle['pbest'] = particle['position'].copy()
particle['pbest_fitness'] = particle_fitness
if particle_fitness > particle['gbest_fitness']:
particle['gbest'] = particle['position'].copy()
particle['gbest_fitness'] = particle_fitness
# 粒子群算法主循环
def particle_swarm_optimization():
particles = initialize_particles()
gbest = None
gbest_fitness = float('-inf')
for _ in range(max_iteration):
update_particles(particles, gbest)
update_pbest_gbest(particles)
for particle in particles:
if particle['gbest_fitness'] > gbest_fitness:
gbest = particle['gbest'].copy()
gbest_fitness = particle['gbest_fitness']
return gbest
# 混合遗传算法和粒子群算法
def hybrid_algorithm():
ga_solution = genetic_algorithm()
ps_solution = particle_swarm_optimization()
ga_fitness = fitness(ga_solution)
ps_fitness = fitness(ps_solution)
if ga_fitness > ps_fitness:
return ga_solution
else:
return ps_solution
# 测试
solution = hybrid_algorithm()
print("Solution:", solution)
print("Fitness:", fitness(solution))
这个代码示例是一个简化的版本,实际应用中可能需要根据具体问题进行调整和优化
原文地址: https://www.cveoy.top/t/topic/iTJY 著作权归作者所有。请勿转载和采集!