Intelligenter Optimierungsalgorithmus-Partikelschwarmmodell (einschließlich Python-Fallcode)

Übersicht über Partikelschwarmoptimierungsmodelle

        Particle Swarm Optimization (PSO) ist ein auf Schwarmintelligenz basierender Optimierungsalgorithmus. Er wurde erstmals 1995 von den amerikanischen Sozialpsychologen James Kennedy und Russell Eberhart vorgeschlagen. PSO ist inspiriert von Beobachtungen des Gruppenverhaltens in der Natur, beispielsweise von Vogelschwärmen und Fischschwärmen.

305c460e9e2e4d24af3bd08612fa1ecd.png

        Die Grundidee von PSO besteht darin, die optimale Lösung des Problems zu finden, indem die Zusammenarbeit und der Informationsaustausch einzelner Personen in der Gruppe simuliert werden. In PSO werden Individuen „Partikel“ genannt und jedes Partikel stellt eine mögliche Lösung im Suchraum dar. Diese Partikel finden die optimale Lösung, indem sie sich im Suchraum bewegen, und die Richtung und Geschwindigkeit ihrer Bewegung wird durch individuelle Erfahrungen und Gruppenerfahrungen beeinflusst.

Grundmodell von PSO

  1. Partikeldarstellung: Jedes Partikel hat einen Positionsvektor und einen Geschwindigkeitsvektor, die jeweils die aktuelle Position und Bewegungsgeschwindigkeit im Suchraum darstellen.
  2. Fitnessfunktion: Die Zielfunktion des Problems wird als Fitnessfunktion definiert, und das Ziel des Partikels besteht darin, diese Fitnessfunktion zu minimieren oder zu maximieren.
  3. Individuelle optimale Lösung: Jedes Partikel merkt sich die beste Position, die es im Suchraum gefunden hat, was als individuelle optimale Lösung bezeichnet wird.
  4. Globale optimale Lösung: Im gesamten Partikelschwarm wird es ein Partikel geben, das sich die globale optimale Lösung merkt, also die Position mit der besten Fitness in der gesamten Gruppe.
  5. Aktualisierungsregeln: Partikel passen ihre Position und Geschwindigkeit entsprechend bestimmten Aktualisierungsregeln an (normalerweise einschließlich individueller Erfahrung und Gruppenerfahrung).

Die allgemeine Form von Aktualisierungsregeln ist:

8f3bd574abad49b3a56d862d1ba6dead.png

In:

b4fc612da3864a5992796b78172f1619.png

        Dieser Algorithmus hat bei verschiedenen Problemen gute Ergebnisse erzielt, insbesondere bei kontinuierlichen Optimierungsproblemen. Bei der Verwendung von PSO müssen die Parameter des Algorithmus entsprechend dem spezifischen Problem angepasst werden, wie z. B. die Anzahl der Partikel, Lernfaktoren, Trägheitsgewichte usw.

 

84252ebf3e2e45d9a1af150bd8baaaf4.png

Wann sollte die Partikelschwarmoptimierung eingesetzt werden?

        Particle Swarm Optimization (PSO) ist ein Schwarmintelligenz-Algorithmus zur Lösung von Optimierungsproblemen. PSO eignet sich für eine Vielzahl von Optimierungsproblemen, aufgrund seiner spezifischen Vorteile und anwendbaren Szenarien ist es jedoch in einigen Fällen besser geeignet.

        ​ ​​ Kontinuierliche Optimierungsprobleme: PSO wird hauptsächlich zur Lösung kontinuierlicher Optimierungsprobleme verwendet, bei denen die Zielfunktion kontinuierlich differenzierbar ist. Dazu gehören viele technische und wissenschaftliche Anwendungen, wie z. B. Parameteroptimierung von Modellen für maschinelles Lernen, Anpassung neuronaler Netzwerkgewichte, Signalverarbeitung, Entwurf von Steuerungssystemen usw.

        Uneingeschränkte Probleme: PSO hat lockerere Einschränkungen für das Problem und eignet sich daher für uneingeschränkte Optimierungsprobleme. Wenn das Problem komplexe Einschränkungen aufweist, kann es erforderlich sein, PSO zu verbessern oder andere Optimierungsalgorithmen auszuwählen, die für die Behandlung eingeschränkter Probleme besser geeignet sind.

        Hochdimensionaler Raum: PSO schneidet in hochdimensionalen Suchräumen gut ab. Bei Problemen mit einer großen Anzahl von Variablen kann PSO den Suchraum effektiv erkunden und die global optimale Lösung finden.

        Globale Optimierung: Der Gruppenkollaborationsmechanismus von PSO sorgt für eine bessere Konvergenz bei globalen Optimierungsproblemen. Es hilft zu vermeiden, in lokal optimalen Lösungen stecken zu bleiben, insbesondere wenn der Suchraum komplex ist oder mehrere lokal optimale Lösungen vorhanden sind.

        Einfache Implementierung: Die Implementierung von PSO ist relativ einfach und erfordert nicht zu viele Parameteranpassungen. Dies macht ihn zu einem Optimierungsalgorithmus, der einfach zu verwenden und zu verstehen ist und sich besonders für Anfänger oder Anwendungsszenarien eignet, die weniger empfindlich auf Algorithmusdetails reagieren.

        Dynamische Umgebung: PSO weist eine gute Anpassungsfähigkeit an Optimierungsprobleme in dynamischen Umgebungen auf. Aufgrund seiner Echtzeit-Aktualisierungsfunktion kann sich PSO schnell an Änderungen in der Zielfunktion oder im Suchraum anpassen.

        Obwohl PSO in vielen Fällen eine gute Leistung erbringt, ist es bei einigen Problemen möglicherweise nicht so gut wie andere Optimierungsalgorithmen. Daher sollten Sie bei der Auswahl eines Optimierungsalgorithmus eine vernünftige Wahl treffen, die auf den Merkmalen des spezifischen Problems sowie den Vor- und Nachteilen dieses Problems basiert der Algorithmus.

Fallcode 1

        ​​​​Das Folgende ist ein einfacher Python-Beispielcode für den Partikelschwarm-Optimierungsalgorithmus. Bei diesem Beispiel handelt es sich um ein einfaches Einzelvariablen-Optimierungsproblem. Das Ziel besteht darin, die Funktion f(x)=x^2+5 zu minimieren.

import random

# 粒子群优化算法
def particle_swarm_optimization(obj_func, num_particles, num_iterations):
    # 初始化粒子群
    particles = [{'position': random.uniform(-10, 10),
                  'velocity': random.uniform(-1, 1),
                  'pbest_position': 0,
                  'pbest_value': float('inf')} for _ in range(num_particles)]

    # 寻找全局最优解的粒子
    gbest_particle = min(particles, key=lambda p: obj_func(p['position']))

    # PSO参数
    inertia_weight = 0.5
    cognitive_coefficient = 1.5
    social_coefficient = 1.5

    # 开始优化迭代
    for _ in range(num_iterations):
        for particle in particles:
            # 更新速度和位置
            r1, r2 = random.uniform(0, 1), random.uniform(0, 1)
            particle['velocity'] = (inertia_weight * particle['velocity'] +
                                    cognitive_coefficient * r1 * (particle['pbest_position'] - particle['position']) +
                                    social_coefficient * r2 * (gbest_particle['pbest_position'] - particle['position']))
            particle['position'] += particle['velocity']

            # 更新个体最优解
            current_value = obj_func(particle['position'])
            if current_value < particle['pbest_value']:
                particle['pbest_value'] = current_value
                particle['pbest_position'] = particle['position']

                # 更新全局最优解
                if current_value < gbest_particle['pbest_value']:
                    gbest_particle = {'pbest_position': particle['pbest_position'],
                                      'pbest_value': particle['pbest_value']}

    return gbest_particle['pbest_position']

# 示例问题:最小化函数 f(x) = x^2 + 5
def objective_function(x):
    return x**2 + 5

# 运行粒子群优化算法
best_solution = particle_swarm_optimization(objective_function, num_particles=30, num_iterations=100)

# 打印结果
print("最优解:", best_solution)
print("最优解对应的目标函数值:", objective_function(best_solution))

 

        Dies ist nur ein einfaches Beispiel. Bei tatsächlichen Anwendungen sind je nach Komplexität des Problems möglicherweise weitere Anpassungen und Verbesserungen erforderlich. Bei tatsächlichen Problemen müssen die Anzahl der Partikel, die Anzahl der Iterationen, Parameter usw. angepasst werden, um eine bessere Leistung zu erzielen.

Fallcode 2

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D


def fit_fun(x):  # 适应函数
    return sum(100.0 * (x[0][1:] - x[0][:-1] ** 2.0) ** 2.0 + (1 - x[0][:-1]) ** 2.0)


class Particle:
    # 初始化
    def __init__(self, x_max, max_vel, dim):
        self.__pos = np.random.uniform(-x_max, x_max, (1, dim))  # 粒子的位置
        self.__vel = np.random.uniform(-max_vel, max_vel, (1, dim))  # 粒子的速度
        self.__bestPos = np.zeros((1, dim))  # 粒子最好的位置
        self.__fitnessValue = fit_fun(self.__pos)  # 适应度函数值

    def set_pos(self, value):
        self.__pos = value

    def get_pos(self):
        return self.__pos

    def set_best_pos(self, value):
        self.__bestPos = value

    def get_best_pos(self):
        return self.__bestPos

    def set_vel(self, value):
        self.__vel = value

    def get_vel(self):
        return self.__vel

    def set_fitness_value(self, value):
        self.__fitnessValue = value

    def get_fitness_value(self):
        return self.__fitnessValue


class PSO:
    def __init__(self, dim, size, iter_num, x_max, max_vel, tol, best_fitness_value=float('Inf'), C1=2, C2=2, W=1):
        self.C1 = C1
        self.C2 = C2
        self.W = W
        self.dim = dim  # 粒子的维度
        self.size = size  # 粒子个数
        self.iter_num = iter_num  # 迭代次数
        self.x_max = x_max
        self.max_vel = max_vel  # 粒子最大速度
        self.tol = tol  # 截至条件
        self.best_fitness_value = best_fitness_value
        self.best_position = np.zeros((1, dim))  # 种群最优位置
        self.fitness_val_list = []  # 每次迭代最优适应值

        # 对种群进行初始化
        self.Particle_list = [Particle(self.x_max, self.max_vel, self.dim) for i in range(self.size)]

    def set_bestFitnessValue(self, value):
        self.best_fitness_value = value

    def get_bestFitnessValue(self):
        return self.best_fitness_value

    def set_bestPosition(self, value):
        self.best_position = value

    def get_bestPosition(self):
        return self.best_position

    # 更新速度
    def update_vel(self, part):
        vel_value = self.W * part.get_vel() + self.C1 * np.random.rand() * (part.get_best_pos() - part.get_pos()) \
                    + self.C2 * np.random.rand() * (self.get_bestPosition() - part.get_pos())
        vel_value[vel_value > self.max_vel] = self.max_vel
        vel_value[vel_value < -self.max_vel] = -self.max_vel
        part.set_vel(vel_value)

    # 更新位置
    def update_pos(self, part):
        pos_value = part.get_pos() + part.get_vel()
        part.set_pos(pos_value)
        value = fit_fun(part.get_pos())
        if value < part.get_fitness_value():
            part.set_fitness_value(value)
            part.set_best_pos(pos_value)
        if value < self.get_bestFitnessValue():
            self.set_bestFitnessValue(value)
            self.set_bestPosition(pos_value)

    def update_ndim(self):

        for i in range(self.iter_num):
            for part in self.Particle_list:
                self.update_vel(part)  # 更新速度
                self.update_pos(part)  # 更新位置
            self.fitness_val_list.append(self.get_bestFitnessValue())  # 每次迭代完把当前的最优适应度存到列表
            print('第{}次最佳适应值为{}'.format(i, self.get_bestFitnessValue()))
            if self.get_bestFitnessValue() < self.tol:
                break

        return self.fitness_val_list, self.get_bestPosition()

if __name__ == '__main__':
    # test 香蕉函数
    pso = PSO(4, 5, 10000, 30, 60, 1e-4, C1=2, C2=2, W=1)
    fit_var_list, best_pos = pso.update_ndim()
    print("最优位置:" + str(best_pos))
    print("最优解:" + str(fit_var_list[-1]))
    plt.plot(range(len(fit_var_list)), fit_var_list, alpha=0.5)

 

 

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/m0_56694518/article/details/134934279
Recomendado
Clasificación