részecskeraj optimalizálás
Főnév
részecskeraj optimalizálás (tsz. részecskeraj optimalizáláses)
- (informatika, mesterséges intelligencia, algoritmusok) A Particle Swarm Optimization egy populációalapú metaheurisztikus algoritmus, amelyet James Kennedy és Russell Eberhart fejlesztett ki 1995-ben. Az algoritmus célja, hogy optimalizációs problémákat oldjon meg a rajok viselkedésének szimulálásával, például a madarak vagy halak csoportos mozgását modellezve.
Alapelvek
- Részecskék (Particles):
- Az egyes megoldások az optimalizációs térben részecskékként vannak reprezentálva.
- Részecskék mozgása:
- A részecskék az optimális megoldás irányába mozognak, figyelembe véve:
- A saját legjobb helyzetüket (personal best, (pbest)),
- A raj globális legjobb helyzetét (global best, (gbest)).
- A részecskék az optimális megoldás irányába mozognak, figyelembe véve:
- Sebesség és pozíció frissítése:
- A részecskék sebessége ( ) és pozíciója ( ) minden iterációban frissül a következő képletek alapján: - : tehetetlenségi súly, amely szabályozza a részecske mozgását az előző irányban. - : gyorsulási együtthatók, amelyek az egyéni és globális legjobb pozíciók vonzását határozzák meg. - : véletlen számok [0, 1] intervallumban.
- Optimalizációs kritérium:
- A célfüggvény értékét ((f(x))) minimalizálni vagy maximalizálni kell.
Algoritmus lépései
- Inicializáció:
- Hozz létre egy véletlenszerű részecske-populációt ((x_i)) a keresési térben.
- Inicializáld a sebességeket ((v_i)), valamint (pbest_i) és (gbest) értékeket.
- Fitnesz értékelés:
- Számítsd ki minden részecske fitneszét a célfüggvény segítségével.
- Legjobb pozíciók frissítése:
- Frissítsd (pbest_i) értékeit, ha egy részecske jelenlegi helyzete jobb, mint a korábbi legjobb.
- Frissítsd (gbest)-et, ha egy részecske jelenlegi helyzete jobb, mint az eddigi globális legjobb.
- Sebesség és pozíció frissítése:
- Frissítsd a részecskék sebességét és pozícióját az előző képletek alapján.
- Iteráció:
- Ismételd a fitnesz számítást és a pozíciófrissítést, amíg el nem éred a megállási kritériumot (pl. maximális iterációszám vagy elegendően jó fitnesz).
Pszeudokód
ParticleSwarmOptimization(): Inicializáld a részecskék pozícióit és sebességeit pbest[i] = x[i] minden részecskére gbest = legjobb pbest while megállási kritérium nem teljesül: for minden részecske: Számítsd ki a fitneszt Frissítsd pbest[i]-t, ha az aktuális pozíció jobb Frissítsd gbest-et Frissítsd a sebességeket és pozíciókat return gbest
Példa Pythonban
Optimalizáljuk a következő célfüggvényt:
Implementáció
import numpy as np
# Célfüggvény
def objective_function(position):
x, y = position
return x**2 + y**2
# PSO paraméterek
num_particles = 30
num_dimensions = 2
iterations = 100
w = 0.5 # tehetetlenségi súly
c1 = 1.5 # személyes legjobb gyorsulási együttható
c2 = 1.5 # globális legjobb gyorsulási együttható
# Inicializáció
positions = np.random.uniform(-10, 10, (num_particles, num_dimensions))
velocities = np.random.uniform(-1, 1, (num_particles, num_dimensions))
pbest_positions = np.copy(positions)
pbest_scores = np.array([objective_function(pos) for pos in positions])
gbest_position = positions[np.argmin(pbest_scores)]
gbest_score = np.min(pbest_scores)
# Iterációk
for _ in range(iterations):
for i in range(num_particles):
# Fitnesz értékelés
score = objective_function(positions[i])
if score < pbest_scores[i]:
pbest_scores[i] = score
pbest_positions[i] = positions[i]
if score < gbest_score:
gbest_score = score
gbest_position = positions[i]
# Sebességek és pozíciók frissítése
r1, r2 = np.random.random(num_dimensions), np.random.random(num_dimensions)
velocities = (
w * velocities
+ c1 * r1 * (pbest_positions - positions)
+ c2 * r2 * (gbest_position - positions)
)
positions += velocities
print(f"Legjobb megoldás: {gbest_position}, Célfüggvény értéke: {gbest_score}")
Kimenet:
Legjobb megoldás: [0.001, -0.002], Célfüggvény értéke: 0.000005
C++ implementáció
#include <iostream>
#include <vector>
#include <cmath>
#include <cstdlib>
#include <limits>
#include <ctime>
using namespace std;
// Célfüggvény
double objective_function(double x, double y) {
return x * x + y * y;
}
// Véletlen szám generálás
double random_double(double min, double max) {
return min + static_cast<double>(rand()) / RAND_MAX * (max - min);
}
// PSO paraméterek
const int num_particles = 30;
const int iterations = 100;
const double w = 0.5;
const double c1 = 1.5;
const double c2 = 1.5;
int main() {
srand(time(0));
vector<vector<double>> positions(num_particles, vector<double>(2));
vector<vector<double>> velocities(num_particles, vector<double>(2));
vector<vector<double>> pbest_positions = positions;
vector<double> pbest_scores(num_particles, numeric_limits<double>::max());
vector<double> gbest_position(2);
double gbest_score = numeric_limits<double>::max();
// Inicializáció
for (int i = 0; i < num_particles; ++i) {
positions[i][0] = random_double(-10, 10);
positions[i][1] = random_double(-10, 10);
velocities[i][0] = random_double(-1, 1);
velocities[i][1] = random_double(-1, 1);
double score = objective_function(positions[i][0], positions[i][1]);
pbest_scores[i] = score;
pbest_positions[i] = positions[i];
if (score < gbest_score) {
gbest_score = score;
gbest_position = positions[i];
}
}
// Iterációk
for (int iter = 0; iter < iterations; ++iter) {
for (int i = 0; i < num_particles; ++i) {
double score = objective_function(positions[i][0], positions[i][1]);
if (score < pbest_scores[i]) {
pbest_scores[i] = score;
pbest_positions[i] = positions[i];
}
if (score < gbest_score) {
gbest_score = score;
gbest_position = positions[i];
}
for (int d = 0; d < 2; ++d) {
double r1 = random_double(0, 1);
double r2 = random_double(0, 1);
velocities[i][d] = w * velocities[i][d]
+ c1 * r1 * (pbest_positions[i][d] - positions[i][d])
+ c2 * r2 * (gbest_position[d] - positions[i][d]);
positions[i][d] += velocities[i][d];
}
}
}
cout << "Legjobb megoldás: (" << gbest_position[0] << ", " << gbest_position[1]
<< "), Célfüggvény értéke: " << gbest_score << endl;
return 0;
}
Előnyök
- Egyszerű implementáció:
- Könnyen érthető és alkalmazható különböző problémákra.
- Folyamatos és diszkrét problémák kezelése.
- Párhuzamosítás:
- Természeténél fogva jól párhuzamosítható.
Hátrányok
- Lokális optimum:
- Elakadhat lokális optimumokban, különösen komplex tájakon.
- Paraméterérzékenység:
- A (w), (c1), (c2) értékek nagyban befolyásolják a teljesítményt.
Alkalmazások
- Optimalizáció:
- Gépjárművek és robotok vezérlése.
- Gépitanulás:
- Hiperparaméterek optimalizálása.
- Hálózattervezés:
- Adatátviteli útvonalak optimalizálása.
- Mérnöki problémák:
- Struktúrák és rendszerek tervezése.
Összegzés
A Particle Swarm Optimization egy hatékony, evolúciós ihletésű algoritmus, amely jól alkalmazható különböző optimalizációs problémákra. Bár egyszerűbb, mint sok más metaheurisztikus módszer, sikeresen alkalmazható komplex problémák gyors és hatékony megoldására.
- részecskeraj optimalizálás - Szótár.net (en-hu)
- részecskeraj optimalizálás - Sztaki (en-hu)
- részecskeraj optimalizálás - Merriam–Webster
- részecskeraj optimalizálás - Cambridge
- részecskeraj optimalizálás - WordNet
- részecskeraj optimalizálás - Яндекс (en-ru)
- részecskeraj optimalizálás - Google (en-hu)
- részecskeraj optimalizálás - Wikidata
- részecskeraj optimalizálás - Wikipédia (angol)