pso粒子群优化算法,改进的PSO算法,ga遗传算法,l 重因子混合算法,可做对比算法,解决路径规划,传感器覆盖等问题,亲手写成,程序可运行,只需改优化函数和约束就可,有详细注释,有助于学习理解

在当今的科技领域,路径规划和传感器覆盖等问题一直是研究的热点。为了解决这些复杂的问题,智能优化算法发挥了重要作用,今天就来聊聊pso粒子群优化算法、改进的PSO算法、ga遗传算法以及l重因子混合算法在这些场景下的应用。

1. PSO粒子群优化算法

PSO算法源于对鸟群觅食行为的模拟。想象一群鸟在一个区域内寻找食物,每只鸟都不知道食物具体位置,但知道自己当前位置与食物的距离。鸟群通过个体经验和群体经验来调整飞行方向和速度,最终找到食物。

下面是一个简单的Python实现PSO算法求解一元函数最值的代码示例(为了便于理解,这里简化到一元函数场景,实际路径规划和传感器覆盖问题会更复杂):

import numpy as np


# 定义目标函数
def objective_function(x):
    return x ** 2


# PSO参数设置
num_particles = 50  # 粒子数量
num_iterations = 100  # 迭代次数
c1 = 1.5  # 学习因子1
c2 = 1.5  # 学习因子2
w = 0.7  # 惯性权重
bounds = (-10, 10)  # 搜索空间边界


# 初始化粒子位置和速度
particles_positions = np.random.uniform(bounds[0], bounds[1], num_particles)
particles_velocities = np.random.uniform(-1, 1, num_particles)
personal_best_positions = particles_positions.copy()
personal_best_fitness = np.array([objective_function(x) for x in particles_positions])
global_best_index = np.argmin(personal_best_fitness)
global_best_position = personal_best_positions[global_best_index]
global_best_fitness = personal_best_fitness[global_best_index]


# PSO迭代过程
for i in range(num_iterations):
    r1 = np.random.rand(num_particles)
    r2 = np.random.rand(num_particles)
    particles_velocities = w * particles_velocities + c1 * r1 * (personal_best_positions - particles_positions) + c2 * r2 * (
                global_best_position - particles_positions)
    particles_positions = particles_positions + particles_velocities
    particles_positions = np.clip(particles_positions, bounds[0], bounds[1])
    fitness = np.array([objective_function(x) for x in particles_positions])
    improved_indices = fitness < personal_best_fitness
    personal_best_positions[improved_indices] = particles_positions[improved_indices]
    personal_best_fitness[improved_indices] = fitness[improved_indices]
    current_best_index = np.argmin(personal_best_fitness)
    if personal_best_fitness[current_best_index] < global_best_fitness:
        global_best_position = personal_best_positions[current_best_index]
        global_best_fitness = personal_best_fitness[current_best_index]


print(f"全局最优解位置: {global_best_position}")
print(f"全局最优解值: {global_best_fitness}")

代码分析:

  • objective_function 定义了我们要求解的目标函数,这里是一个简单的二次函数 x 2。在实际路径规划和传感器覆盖场景中,这个函数会根据具体问题定义,比如路径规划中可能是路径长度,传感器覆盖中可能是覆盖面积等。
  • 初始化部分,设定了粒子数量、迭代次数、学习因子和惯性权重等参数。随机生成粒子的初始位置和速度,并记录每个粒子的历史最优位置和全局最优位置。
  • 在迭代过程中,根据PSO算法公式更新粒子的速度和位置,clip 函数保证粒子位置在设定的搜索空间内。计算每个粒子的适应度(目标函数值),更新粒子的历史最优位置和全局最优位置。

2. 改进的PSO算法

改进的PSO算法通常针对标准PSO算法容易陷入局部最优等问题进行优化。比如可以动态调整惯性权重 w,使得算法在前期有较好的全局搜索能力,后期有较好的局部搜索能力。

这里简单示意如何动态调整惯性权重 w

# 改进的PSO,动态调整惯性权重
num_particles = 50
num_iterations = 100
c1 = 1.5
c2 = 1.5
w_max = 0.9
w_min = 0.4
bounds = (-10, 10)

particles_positions = np.random.uniform(bounds[0], bounds[1], num_particles)
particles_velocities = np.random.uniform(-1, 1, num_particles)
personal_best_positions = particles_positions.copy()
personal_best_fitness = np.array([objective_function(x) for x in particles_positions])
global_best_index = np.argmin(personal_best_fitness)
global_best_position = personal_best_positions[global_best_index]
global_best_fitness = personal_best_fitness[global_best_index]

for i in range(num_iterations):
    w = w_max - (w_max - w_min) * i / num_iterations
    r1 = np.random.rand(num_particles)
    r2 = np.random.rand(num_particles)
    particles_velocities = w * particles_velocities + c1 * r1 * (personal_best_positions - particles_positions) + c2 * r2 * (
                global_best_position - particles_positions)
    particles_positions = particles_positions + particles_velocities
    particles_positions = np.clip(particles_positions, bounds[0], bounds[1])
    fitness = np.array([objective_function(x) for x in particles_positions])
    improved_indices = fitness < personal_best_fitness
    personal_best_positions[improved_indices] = particles_positions[improved_indices]
    personal_best_fitness[improved_indices] = fitness[improved_indices]
    current_best_index = np.argmin(personal_best_fitness)
    if personal_best_fitness[current_best_index] < global_best_fitness:
        global_best_position = personal_best_positions[current_best_index]
        global_best_fitness = personal_best_fitness[current_best_index]


print(f"改进PSO全局最优解位置: {global_best_position}")
print(f"改进PSO全局最优解值: {global_best_fitness}")

分析:可以看到与标准PSO算法相比,这里定义了 wmaxwmin,在每次迭代中动态计算惯性权重 w,这样随着迭代次数增加,惯性权重逐渐减小,算法从全局搜索慢慢转向局部搜索,有可能更好地找到全局最优解。

3. GA遗传算法

遗传算法借鉴了生物进化中的遗传、变异和选择机制。把问题的解编码成染色体(通常是二进制串或实数向量),通过模拟生物进化过程,使种群中适应度高的个体有更多机会遗传到下一代,最终找到最优解。

pso粒子群优化算法,改进的PSO算法,ga遗传算法,l 重因子混合算法,可做对比算法,解决路径规划,传感器覆盖等问题,亲手写成,程序可运行,只需改优化函数和约束就可,有详细注释,有助于学习理解

以下是一个简单的遗传算法求解一元函数最值的Python代码示例:

import numpy as np


# 定义目标函数
def objective_function(x):
    return x ** 2


# 遗传算法参数设置
population_size = 50
num_generations = 100
chromosome_length = 20
pc = 0.8
pm = 0.1
bounds = (-10, 10)


# 初始化种群
def initialize_population(population_size, chromosome_length):
    return np.random.randint(0, 2, size=(population_size, chromosome_length))


# 解码染色体
def decode_chromosome(chromosome, bounds):
    decimal_value = 0
    for i in range(len(chromosome)):
        decimal_value += chromosome[i] * (2 ** i)
    x = bounds[0] + decimal_value * (bounds[1] - bounds[0]) / (2 ** len(chromosome) - 1)
    return x


# 计算适应度
def calculate_fitness(population, bounds):
    fitness = np.zeros(population_size)
    for i in range(population_size):
        x = decode_chromosome(population[i], bounds)
        fitness[i] = 1 / (1 + objective_function(x))
    return fitness


# 选择操作
def selection(population, fitness):
    total_fitness = np.sum(fitness)
    selection_probabilities = fitness / total_fitness
    selected_indices = np.random.choice(population_size, size=population_size, p=selection_probabilities)
    return population[selected_indices]


# 交叉操作
def crossover(parent1, parent2, pc):
    if np.random.rand() < pc:
        crossover_point = np.random.randint(1, len(parent1) - 1)
        child1 = np.concatenate((parent1[:crossover_point], parent2[crossover_point:]))
        child2 = np.concatenate((parent2[:crossover_point], parent1[crossover_point:]))
        return child1, child2
    return parent1, parent2


# 变异操作
def mutation(chromosome, pm):
    for i in range(len(chromosome)):
        if np.random.rand() < pm:
            chromosome[i] = 1 - chromosome[i]
    return chromosome


# 遗传算法主循环
population = initialize_population(population_size, chromosome_length)
for generation in range(num_generations):
    fitness = calculate_fitness(population, bounds)
    new_population = selection(population, fitness)
    for i in range(0, population_size, 2):
        parent1 = new_population[i]
        parent2 = new_population[i + 1]
        child1, child2 = crossover(parent1, parent2, pc)
        child1 = mutation(child1, pm)
        child2 = mutation(child2, pm)
        new_population[i] = child1
        new_population[i + 1] = child2
    population = new_population

# 找到最优解
best_chromosome_index = np.argmax(calculate_fitness(population, bounds))
best_chromosome = population[best_chromosome_index]
best_x = decode_chromosome(best_chromosome, bounds)
best_fitness = objective_function(best_x)

print(f"遗传算法全局最优解位置: {best_x}")
print(f"遗传算法全局最优解值: {best_fitness}")

代码分析:

  • initialize_population 函数随机生成初始种群,每个个体是一个二进制串。
  • decode_chromosome 函数将二进制串解码为实际的数值,以便计算目标函数值。
  • calculatefitness 函数根据目标函数计算每个个体的适应度,这里采用 1 / (1 + objectivefunction(x)) 的形式,使得目标函数值越小,适应度越大。
  • selection 函数根据适应度进行选择,适应度高的个体有更大概率被选中进入下一代。
  • crossovermutation 函数分别执行交叉和变异操作,增加种群的多样性。

4. l重因子混合算法

l重因子混合算法结合了多种算法的优势,例如可以将PSO算法的快速收敛性和遗传算法的全局搜索能力结合起来。具体实现可能是在算法执行过程中,根据不同阶段或条件,动态切换使用不同算法的操作。

假设我们在一定迭代次数后,从PSO算法切换到遗传算法继续优化:

import numpy as np


# 定义目标函数
def objective_function(x):
    return x ** 2


# PSO部分参数设置
num_particles = 50
pso_num_iterations = 50
c1 = 1.5
c2 = 1.5
w = 0.7
bounds = (-10, 10)


# GA部分参数设置
population_size = 50
ga_num_generations = 50
chromosome_length = 20
pc = 0.8
pm = 0.1


# 初始化粒子位置和速度
particles_positions = np.random.uniform(bounds[0], bounds[1], num_particles)
particles_velocities = np.random.uniform(-1, 1, num_particles)
personal_best_positions = particles_positions.copy()
personal_best_fitness = np.array([objective_function(x) for x in particles_positions])
global_best_index = np.argmin(personal_best_fitness)
global_best_position = personal_best_positions[global_best_index]
global_best_fitness = personal_best_fitness[global_best_index]


# PSO迭代
for i in range(pso_num_iterations):
    r1 = np.random.rand(num_particles)
    r2 = np.random.rand(num_particles)
    particles_velocities = w * particles_velocities + c1 * r1 * (personal_best_positions - particles_positions) + c2 * r2 * (
                global_best_position - particles_positions)
    particles_positions = particles_positions + particles_velocities
    particles_positions = np.clip(particles_positions, bounds[0], bounds[1])
    fitness = np.array([objective_function(x) for x in particles_positions])
    improved_indices = fitness < personal_best_fitness
    personal_best_positions[improved_indices] = particles_positions[improved_indices]
    personal_best_fitness[improved_indices] = fitness[improved_indices]
    current_best_index = np.argmin(personal_best_fitness)
    if personal_best_fitness[current_best_index] < global_best_fitness:
        global_best_position = personal_best_positions[current_best_index]
        global_best_fitness = personal_best_fitness[current_best_index]


# 转换为遗传算法种群
population = np.array([np.array([int(bit) for bit in format(int((x - bounds[0]) * (2 ** chromosome_length - 1) / (bounds[1] - bounds[0])), 'b').zfill(chromosome_length)]) for x in particles_positions])


# 遗传算法主循环
for generation in range(ga_num_generations):
    fitness = calculate_fitness(population, bounds)
    new_population = selection(population, fitness)
    for i in range(0, population_size, 2):
        parent1 = new_population[i]
        parent2 = new_population[i + 1]
        child1, child2 = crossover(parent1, parent2, pc)
        child1 = mutation(child1, pm)
        child2 = mutation(child2, pm)
        new_population[i] = child1
        new_population[i + 1] = child2
    population = new_population

# 找到最优解
best_chromosome_index = np.argmax(calculate_fitness(population, bounds))
best_chromosome = population[best_chromosome_index]
best_x = decode_chromosome(best_chromosome, bounds)
best_fitness = objective_function(best_x)

print(f"l重因子混合算法全局最优解位置: {best_x}")
print(f"l重因子混合算法全局最优解值: {best_fitness}")


# 遗传算法部分函数定义
def initialize_population(population_size, chromosome_length):
    return np.random.randint(0, 2, size=(population_size, chromosome_length))


def decode_chromosome(chromosome, bounds):
    decimal_value = 0
    for i in range(len(chromosome)):
        decimal_value += chromosome[i] * (2 ** i)
    x = bounds[0] + decimal_value * (bounds[1] - bounds[0]) / (2 ** len(chromosome) - 1)
    return x


def calculate_fitness(population, bounds):
    fitness = np.zeros(population_size)
    for i in range(population_size):
        x = decode_chromosome(population[i], bounds)
        fitness[i] = 1 / (1 + objective_function(x))
    return fitness


def selection(population, fitness):
    total_fitness = np.sum(fitness)
    selection_probabilities = fitness / total_fitness
    selected_indices = np.random.choice(population_size, size=population_size, p=selection_probabilities)
    return population[selected_indices]


def crossover(parent1, parent2, pc):
    if np.random.rand() < pc:
        crossover_point = np.random.randint(1, len(parent1) - 1)
        child1 = np.concatenate((parent1[:crossover_point], parent2[crossover_point:]))
        child2 = np.concatenate((parent2[:crossover_point], parent1[crossover_point:]))
        return child1, child2
    return parent1, parent2


def mutation(chromosome, pm):
    for i in range(len(chromosome)):
        if np.random.rand() < pm:
            chromosome[i] = 1 - chromosome[i]
    return chromosome

分析:这段代码先执行PSO算法一定迭代次数,然后将PSO算法得到的粒子位置转换为遗传算法的初始种群,再执行遗传算法。这样结合两种算法,希望在前期利用PSO快速收敛到一个较好区域,后期利用遗传算法的全局搜索能力进一步优化。

在实际应用于路径规划和传感器覆盖问题时,我们只需根据具体问题修改优化函数(目标函数)和约束条件,这些算法都有较好的扩展性和适应性,相信对于想要深入学习智能

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐