Dies ist der Artikel am 5. Tag von "Adventskalender für Group Intelligence and Optimization 2019". Es ist mein erstes Mal, dass ich einen Artikel über Qiita veröffentliche, daher ist es vielleicht etwas langweilig, aber ich hoffe, Sie werden ihn lesen. Da es sich in diesem Artikel um PSO-Parameter handelt, sollten Sie, wenn Sie überhaupt nichts über PSO wissen, den gestrigen Artikel von Ganariy "[Ich möchte die Methode zur Optimierung von Partikelgruppen (PSO) speichern]](https://qiita.com/ganariya) / items / ae5a38a3537b06bd3842) ”wird besser verstanden, wenn Sie es zuerst lesen.
Wie Herr Ganariy im gestrigen Artikel über die Details von PSO erwähnt hat, handelt es sich um einen der meta-heuristischen Algorithmen, die auf der Gewohnheit beruhen, in einem Schwarm von Vögeln und Fischen zu handeln.
Seit der Veröffentlichung des Based Paper im Jahr 1995 wurden verschiedene Modelle vorgeschlagen.
PSO sucht nach der optimalen Lösung, indem jedes Partikel mit der aktuellen Position $ x $ und der Geschwindigkeit $ v $ aktualisiert wird. Die Geschwindigkeit und Position jedes in Bewegung befindlichen Partikels wird durch die folgende Formel aktualisiert.
Als Übersichtsartikel zum Gewicht w wurde 2011 ein Artikel mit dem Titel "Ein neuartiger Algorithmus zur Optimierung des Partikelschwarms mit adaptivem Trägheitsgewicht" veröffentlicht. Ich bin. In diesem Artikel werden Gewichte w in drei Haupttypen eingeteilt.
Das Gewicht ist konstant oder zufällig
In Artikel, der Konstanten angibt, werden Gewichte mit verschiedenen Konstanten getestet, und $ w> 1,2 $ führt zu einer flachen Suche, während $ w < Es wurde gezeigt, dass 0,8 $ dazu neigen, zur lokalen Lösung zu konvergieren.
Außerdem ist es in Paper, das einen zufälligen Wert angibt, schwierig, das optimale Gewicht in einer dynamischen Umgebung zu bestimmen, also einen zufälligen Wert wie die folgende Formel Vorschlagen zu geben.
Zeitlich veränderliche Gewichte
Viele PSO-basierte Methoden verwenden eine Methode, die den Gewichtswert basierend auf der Anzahl der Iterationen bestimmt.
Unter diesen ist die in vielen Veröffentlichungen verwendete Methode das linear abnehmende Gewicht [Referenz: 1, [2](https: // ieeexplore) .ieee.org / document / 785511), 3]. Dies wird durch die folgende Formel ausgedrückt, wobei die maximale Anzahl von Iterationen $ iter_ {max} $ und die Anzahl von Iterationen $ iter $, das Anfangsgewicht $ w_ {max} $ und der Endwert $ w_ {min} $ verwendet werden.
Adaptives Gewicht Es überwacht von Zeit zu Zeit die Situation und ermittelt die Gewichte anhand der Rückkopplungsparameter. Es wurde eine Vielzahl von Methoden vorgeschlagen. Wenn Sie interessiert sind, lesen Sie bitte das Übersichtsartikel.
Von den oben genannten möchte ich das bekannteste und am häufigsten verwendete PSO mit linearem Dekrementgewicht (LDWPSO) implementieren. Die Kugelfunktion wird als Bewertungsfunktion verwendet. Das Programm sieht folgendermaßen aus: Bei der Ausführung wird die 4. Schleife visualisiert und angezeigt.
import numpy as np
import random
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import time
SWARM_SIZE = 100 #Anzahl der Partikel
ITERATION = 30 #Anzahl der PSO-Schleifen
C1 = C2 = 2.0 #Beschleunigungskoeffizient
MIN_X, MIN_Y = -5.0, -5.0 #Mindestreichweite zu Beginn der Suche
MAX_X, MAX_Y = 5.0, 5.0 #Maximale Reichweite zu Beginn der Suche
W_MAX, W_MIN = 0.9, 0.4
#Bewertungsfunktion(z = x^2+y^2)
def evaluation(x, y):
return x**2 + y**2 # Sphere function
# PSO
def pso(position, velocity, personal_best_scores, personal_best_positions, best_position, search_space_x, search_space_y):
#Verschieben Sie die Partikel um die Anzahl der Schleifen
for i in range(ITERATION):
for s in range(SWARM_SIZE):
#Ersetzung von Informationen vor Änderung
x, y = position[s]["x"], position[s]["y"]
vx, vy = velocity[s]["x"], velocity[s]["y"]
p = personal_best_positions[s]
#Aktualisierung der Partikelposition
new_x, new_y = update_position(x, y, vx, vy, search_space_x, search_space_y)
position[s] = {"x": new_x, "y": new_y}
#Aktualisierung der Partikelgeschwindigkeit
new_vx, new_vy = update_velocity(new_x, new_y, vx, vy, p, best_position, i)
velocity[s] = {"x": new_vx, "y": new_vy}
#Finden Sie den Bewertungswert
score = evaluation(new_x, new_y)
# update personal best
if score < personal_best_scores[s]:
personal_best_scores[s] = score
personal_best_positions[s] = {"x": new_x, "y": new_y}
# update global best
best_particle = np.argmin(personal_best_scores)
best_position = personal_best_positions[best_particle]
# PSO Visualization
if i == 0 or i == 1 or i == 2 or i == 3:
print("ITERATION = " + str(i+1))
visualization(personal_best_positions)
#Funktion zur Aktualisierung der Partikelposition
def update_position(x, y, vx, vy, search_space_x, search_space_y):
new_x = x + vx
new_y = y + vy
#Überprüfen Sie, ob es innerhalb des Suchbereichs liegt
if new_x < search_space_x["min"] or new_y < search_space_y["min"]:
new_x, new_y = search_space_x["min"], search_space_y["min"]
elif new_x > search_space_x["max"] or new_y > search_space_y["max"]:
new_x, new_y = search_space_x["max"], search_space_y["max"]
return new_x, new_y
#Funktion zur Aktualisierung der Partikelgeschwindigkeit
def update_velocity(x, y, vx, vy, p, g, i):
#random parameter (0~1)
r1 = random.random()
r2 = random.random()
#Linear abnehmendes Gewicht
L = (ITERATION - i) / ITERATION
D = W_MAX - W_MIN
w = L * D + W_MIN
print(w)
#Geschwindigkeitsaktualisierung
new_vx = w * vx + C1 * (g["x"] - x) * r1 + C2 * (p["x"] - x) * r2
new_vy = w * vy + C1 * (g["y"] - y) * r1 + C2 * (p["y"] - y) * r2
return new_vx, new_vy
#Visualisierungsfunktion
def visualization(positions):
fig = plt.figure()
ax = Axes3D(fig)
# Mesh
#mesh_x = np.arange(-0.5e-3, 0.5e-3, 0.1e-4)
#mesh_y = np.arange(-0.5e-3, 0.5e-3, 0.1e-4)
mesh_x = np.arange(-5.0, 5.0, 0.5)
mesh_y = np.arange(-5.0, 5.0, 0.5)
mesh_X, mesh_Y = np.meshgrid(mesh_x, mesh_y)
mesh_Z = evaluation(mesh_X, mesh_Y)
ax.plot_wireframe(mesh_X, mesh_Y, mesh_Z)
# Particle
for j in range(SWARM_SIZE):
z = evaluation(positions[j]["x"], positions[j]["y"])
ax.scatter(positions[j]["x"], positions[j]["y"], z)
ax.set_xlim([-5.0, 5.0])
ax.set_ylim([-5.0, 5.0])
ax.set_zlim([-1.0, 30.0])
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("f(x, y)")
plt.show()
def run(position, velocity, personal_best_scores, personal_best_positions, best_position, search_space_x, search_space_y):
pso(position, velocity, personal_best_scores, personal_best_positions, best_position, search_space_x, search_space_y)
return best_position, personal_best_scores
def main():
#Startzeitmessung
start = time.time()
#Anfangsposition jedes Partikels,Geschwindigkeit, personal best,globale Best- und Suchraumeinstellungen
position = []
velocity = []
personal_best_scores = []
#Ausgangsposition,Anfangsgeschwindigkeit
for s in range(SWARM_SIZE):
position.append({"x": random.uniform(MIN_X, MAX_X), "y": random.uniform(MIN_Y, MAX_Y)})
velocity.append({"x": random.uniform(0, 1), "y": random.uniform(0, 1)})
# personal best
personal_best_positions = list(position)
for p in position:
personal_best_scores.append(evaluation(p["x"], p["y"]))
# global best
best_particle = np.argmin(personal_best_scores)
best_position = personal_best_positions[best_particle]
# search space
search_space_x, search_space_y = {'min': MIN_X, "max": MAX_X}, {"min": MIN_Y, "max": MAX_Y}
# run
best_position, personal_best_scores = run(position, velocity, personal_best_scores, personal_best_positions, best_position, search_space_x, search_space_y)
#Zeitmessung beendet
process_time = time.time() - start
# Optimal solution
print("Best Position:", best_position)
print("Score:", min(personal_best_scores))
print("time:", process_time)
if __name__ == '__main__':
main()
Eigentlich wäre es schön, wenn ich es mit einem einfachen PSO vergleichen könnte, aber da ich erschöpft bin, bin ich interessiert, weil es ein einfaches PSO wird, indem ich einfach den Wert von $ w_ {min} $ auf 0,9 ändere. Bitte probieren Sie es aus.
Es ist ein ziemlich akademischer Artikel geworden, aber zusammenfassend: ・ Das PSO-Gewicht $ w $ hat einen großen Einfluss auf die Konvergenz zur optimalen Lösung. ・ Es gibt drei Haupttypen von Gewichten -Das am häufigsten verwendete Gewicht ist das linear abnehmende Gewicht, das eines der zeitlich variierenden Gewichte ist. Es wird sein. Auf diese Weise wäre ich dankbar, wenn Sie wissen könnten, dass verschiedene Studien auch mit nur einem Parameter durchgeführt werden.
Recommended Posts