16.28 Heuristische Optimierungstoolbox
|
|||||||||||||||||||
16.28 Heuristische Optimierungstoolbox16.28.1 Optimierungsframework16.28.1.1 Einleitung und ÜberblickDas Optimierungsframework bietet die Möglichkeit eine frei definierbare Optimierungsaufgabe heuristisch zu lösen. Dabei erfolgt die Ausgestaltung der Optimierungsaufgabe innerhalb der Makroprogrammierumgebung in INTEGRAL. Das Optimierungsframework richtet sich an erfahrene INTEGRAL-Anwender, die mit den Grundzügen des INTEGRAL-Datenmodells sowie der Makroprogrammierumgebung vertraut sind. Eine Optimierungsaufgabe verfügt grundsätzlich über folgende Komponenten:
Das Optimierungsframework basiert auf der Partikel-Schwarm-Optimierung. Diese zählt zur Gruppe der sogenannten Metaheuristiken und kann prinzipiell nahezu beliebige Problemstellungen näherungsweise optimal lösen. Für die Anwendung des Optimierungsframework ist es sinnvoll, die Vorgehensweise dieser Optimierungsstrategie zu verstehen. Ein Überblick über die Vorgehensweise der in INTEGRAL implementierten Partikelschwarm-Optimierung gibt Kapitel 16.28.1.8.
Bei der Definition der Optimierungsaufgabe über die Makroprogrammierumgebung kann auf das DESIRE3-Datenmodell und somit auf Netz- und Ergebnisvariablen zugegriffen werden. Nachfolgend wird der Aufbau des Optimierungsskripts und somit der Weg zur Abbildung einer eigenen Optimierungsaufgabe im Verfahren beschrieben. 16.28.1.2 Anforderungen an den DatensatzDas Optimierungsframework bietet die Option, Ergebnisdaten in Netznutzungsfälle abzulegen. Die Verwendung dieser Ergebnisdarstellung setzt voraus, dass das zu optimierende Netz aus der Datenbank geladen wurde. Bei Verwendung einer lokalen XML- oder IND-Datei muss die entsprechende Option deaktiviert werden (vgl. Kapitel 16.28.1.7.5). Das Optimierungsframework bezieht die aktuelle Topologie aus den Netzdaten. Soll ein bestimmter Netznutzungsfall berechnet werden, muss dieser zunächst in den Basisfall übernommen werden. Das ist bei aktiviertem Netznutzungsfall möglich über Extras→Netznutzungsfälle→Netznutzungsfalldaten in Netzdaten übernehmen. Vor Start des Optimierungsframeworks ist sicherzustellen, dass aktuell kein Netznutzungsfall aktiviert ist. Ist dennoch ein Netznutzungsfall aktiviert, wird dieser vom Verfahren automatisch deaktiviert und der Basisfall betrachtet. Eine automatisierte Optimierung von Zeitreihen, die über verschiedene Netznutzungsfälle modelliert sind, ist nicht möglich. 16.28.1.3 Aufbau des OptimierungsskriptsDas Optimierungsframework wird von einer Skriptfunktion aus angesteuert, die zum Start des Verfahrens in der Makroprogrammierumgebung ausgeführt werden muss. Der Name dieser Funktion kann frei gewählt werden. Neben der Definition von Objektmengen und der Konfiguration des Verfahrens erfolgt hier die Anweisung das Optimierungsframework auszuführen. Folgende Konvention muss bei der Erstellung eingehalten werden:
Neben der hier beschriebenen auszuführenden Hauptfunktion müssen die Zielfunktion (vgl. Kapitel 16.28.1.5) und optional lösungsraumbeschränkende Nebenbedingungen (vgl. Kapitel 16.28.1.6) ausformuliert werden. 16.28.1.4 Objektmengen16.28.1.4.1 Stellgrößen und ZielgrößenBei der Optimierung kann zwischen Stellgrößen und Zielgrößen unterschieden werden. Während Stellgrößen vom Optimierungsverfahren variiert werden können und somit die Freiheitsgrade der Optimierungsaufgabe beschreiben, werden Zielgrößen nur ausgelesen. Typischerweise sind Zielgrößen Ergebnisvariablen, die nach durchgeführter Netzberechnung auszulesen sind. Ein Beispiel einer Zielgröße ist der Kurzschlussstrom ik'' (vgl. Kapitel 16.28.1.4.7). 16.28.1.4.2 Konzept der ObjektmengenEine Objektmenge enthält eine Menge von Netzobjekten (z.B. Betriebsmittel) mit zugehörigen Stellgrößen und Zielgrößen. Dabei gruppiert eine Objektmenge Netzobjekte anhand gemeinsamer Eigenschaften (z.B. Typ, Nennspannung, etc.), um die Ausformulierung der Optimierungsaufgabe zu vereinfachen. Über die Angabe dieser gemeinsamen Eigenschaften können mehrere Netzobjekte aus der Grundgesamtheit ausgefiltert und in einer Objektmenge abgespeichert werden.
16.28.1.4.3 Definition im SkriptObjektmengen werden über den folgenden Befehl angelegt: varObjMenge = new Objektmenge("Bezeichner");Dabei ist varObjMenge der Name der Variable, in die die Objektmenge abgelegt wird. Um optional die Eigenschaft der Objektmenge auslesen zu können, wird zusätzlich ein Bezeichner hinterlegt. Dieser ist, wie der Name der Variable, frei zu wählen. 16.28.1.4.4 Ergänzung von NetzobjektenMit dem folgenden Befehl können der Objektmenge Betriebsmittel zugeordnet werden: varObjMenge.ergaenze_objekte("Objektklasse", "Attributname", "Attribut");Die Objektklasse ist dabei der Typ der Netzobjekte in INTEGRAL-Namenskonvention. Diese sind der INTEGRAL-Hilfe zu finden. Der Attributname bezeichnet die gemeinsame Eigenschaft, über die Betriebsmittel gruppiert werden können und das Attribut den zugehörigen Wert. Wenn alle Netzobjekte einer Objektlasse in eine Objektmenge aufgenommen werden sollen, können beide Attributfelder mit einem "*" ausgefüllt werden. 16.28.1.4.5 Ergänzung von StellgrößenStellgrößen lassen sich über den folgenden Befehl in die Objektmenge aufnehmen: varObjMenge.ergaenze_stellgroesse("Bezeichner Variable", Untergrenze , Obergrenze, Abstand); Die Eingabe "Bezeichner Variable" muss dem Tabellen- oder Datenbanknamen der Variablen entsprechen. Die Bezeichner der Variablen können der INTEGRAL-Hilfe für die gewählte Objektklasse entnommen werden. Über die Eingabe der Obergrenze, der Untergrenze und des Abstands lässt sich der Definitionsbereich der Variable festlegen. Sollen nur ganzzahlige Belegungen der Variable zulässig sein, muss ein Abstand von 1 angegeben werden. Für kontinuierliche Variablen ist ein Abstand von 0 anzugeben. Binäre Variablen sind über die Belegung ("Bezeichner Variable", 0, 1, 1) zu definieren. Der hier festzulegende Definitionsbereich kann dem Definitionsbereich der adressierten Variable des zugehörigen Netzobjekts / der zugehörigen Netzobjekte entsprechen oder diesen beschränken. Eine Vergrößerung des Definitionsbereichs ist hingegen nicht zulässig. Nicht zulässig ist z. B. beim Stufensteller eines Transformators einen Abstand von 0.5 anzugeben. Ergänzte Stellgrößen werden der Optimierung als Freiheitsgrade übermittelt. Es sind dazu neben der hier vorgestellten Ergänzung keine weiteren Schritte durchzuführen. 16.28.1.4.6 Ergänzung von ZielgrößenAnalog können Zielgrößen der Objektmenge über den folgenden Befehl hinzugefügt werden: varObjMenge.ergaenze_zielgroesse("Bezeichner Variable");Da Zielgrößen nur ausgelesen werden, muss hierbei kein Definitionsbereich angegeben werden. Bei Ergänzung von Stell- und Zielgrößen wird für alle Netzobjekte der Objektmenge überprüft, ob die angegebene Variable vorhanden ist. Daher ist es sinnvoll zuerst die Netzobjekte und anschließend die Variablen zu ergänzen. 16.28.1.4.7 BeispielskriptDie Optimierung soll eine bestimmte Gruppe von Ersatzquerzweigen zu- oder abschalten. Ersatzquerzweige können beispielsweise Querkompensationen oder Sternpunkte repräsentieren. Im Datensatz wurde für alle Sternpunkte, die als Freiheitsgrade in Frage kommen der Kurzname "Ersatz" hinterlegt. Um den Zustand der Ersatzquerzweige als Freiheitsgrade in die Optimierung aufzunehmen ist folgende Definition möglich: ErsatzQZ = new Objektmenge("ErsatzQZ");ErsatzQZ.ergaenze_objekte("CErsatzquerzweig", "Kurzname", "Ersatz"); Ausgewertet werden sollen dabei auftretende Kurzschlussströme im 110-kV-Netz. Dazu werden zunächst alle Flussinformationen an Abgängen mit einer Nennspannung von 110 kV in einer Objektmenge abgelegt und anschließend die Zielgröße ik'' ergänzt: Ergebniszweige = new Objektmenge("Ergebniszweige"); 16.28.1.5 Zielfunktion16.28.1.5.1 KonzeptDer vom Optimierungsframework eingesetzte Optimierungsalgorithmus minimiert stets den Wert der Zielfunktion (ZF). Dazu wird für eine jede Lösung der Zielfunktionswert berechnet und mit bisher errechneten Lösungen verglichen. Soll eine Optimierungsaufgabe mit Maximierungsproblem gelöst werden, kann diese durch Multiplikation mit dem Vorfaktor -1 in eine Minimierungsaufgabe umgewandelt werden. 16.28.1.5.2 Definition im SkriptDie Zielfunktion wird unter Zuhilfenahme der Objektmengen als eigene Funktion definiert. Da diese Funktion von der Optimierung zur Zustandsbewertung aufgerufen wird, muss die Funktion zielfunktion heißen. Die Zielfunktion kann die Zielgrößen der zuvor definierten Objektmengen auslesen. Der Zugriff erfolgt dabei über nachfolgenden Befehl: varObjMenge.v("Bezeichner Variable")Dabei ist zu beachten, dass ein Array zurückgegeben wird, also ein Container-Objekt, welches den Wert der Variable für sämtliche Netzobjekte der Objektmenge enthält. Zur Auswertung der einzelnen Beiträge muss deshalb eine Schleife eingesetzt werden: var variablen = varObjMenge.v("Bezeichner Variable");Typischerweise erfolgt vor Bestimmung des Zielfunktionswerts eine Netzbewertung, deren Bewertungsmethodik über die Konfiguration des Optimierungsframeworks festgelegt wird (vgl. Kapitel 16.28.1.7). 16.28.1.5.3 BeispielskriptAuftretende Kurzschlussströme im 110-kV-Netz sollen 10 kA nicht überschreiten. Darum wird für alle größeren Kurzschlussströme ein Zielfunktionsbeitrag hinzuaddiert. Dieser soll sich aus einem pauschalen Wert von 1 sowie der Differenz zwischen errechnetem Kurzschlussstrom und 10 kA zusammensetzen. function zielfunktion () { 16.28.1.6 Nebenbedingungen16.28.1.6.1 KonzeptDer vom Optimierungsframework eingesetzte Optimierungsalgorithmus (Partikelschwarm-Optimierung) untersucht den Lösungsraum durch Variation der Stellgrößen und bewertet erst im Anschluss die Lösung. Eine lösungsraumeinschränkende Betrachtung von Nebenbedingungen (NB) vor der Wahl neuer Lösungen ist dabei konzeptionell nicht umsetzbar (vgl. auch Kapitel 16.28.1.8). Nebenbedingungen werden stattdessen, analog zur Zielfunktion, nach Festlegung der aktuell zu bewertenden Lösung errechnet und als Vergleichsgrundlage mit anderen Lösungen genutzt. Deshalb sind sie als Funktion mit Rückgabewert zu definieren. Sinnvoll ist, etwa bei der Verletzung einer Bedingung, einen Strafbeitrag zurückzugeben – z. B. einen Wert von 1 anstelle von 0 bei Erfüllung der Nebenbedingung. Es gilt zu beachten, dass Nebenbedingungen gegenüber der Zielfunktion höher priorisiert werden. Werden zwei Lösungen miteinander verglichen, wird erst bei Gleichheit sämtlicher errechneter Werte der Nebenbedingungen ein Vergleich der Zielfunktionswerte durchgeführt. Verletzungen der Nebenbedingungen führen deshalb nicht zum Ausschluss von Lösungen – derartige Lösungen werden stattdessen gegenüber sämtlichen Lösungen, die die Nebenbedingungen erfüllen, benachteiligt. Das veranschaulicht das nachfolgende Beispiel. Hier wird bei Verletzung einer Nebenbedingung ein Wert von 1 zurückgegeben. Die Optimierung berechnet folgende drei Lösungen:
Tabelle 1: Beispielhafte Lösungen Die Optimierung bewertet Lösung 1 als optimale Lösung, Lösung 2 als zweitbeste Lösung und Lösung 3 als schlechteste Lösung. Der Zielfunktionswert der dritten Lösung ist zwar am geringsten, aufgrund des höheren Wertes der Nebenbedingung wird dieser aber gar nicht betrachtet und die Lösung wird hinter den Lösungen 1 und 2 einsortiert. 16.28.1.6.2 Hinweise und Empfehlungen zum Design von NebenbedingungenAufgrund der Unterteilung in mehrere Lösungsgruppen, abhängig vom Wert der Nebenbedingung, ist es empfehlenswert die nachfolgenden Punkte zu berücksichtigen:
16.28.1.6.3 Definition im SkriptNebenbedingungen werden im Skript als Funktions-Array angegeben. Dadurch kann eine beliebige Anzahl von Nebenbedingungen hinterlegt werden. Da diese Funktion von der Optimierung zur Zustandsbewertung aufgerufen wird, muss das Funktionsarray nebenbedingung heißen. var nebenbedingungen = [Analog zur Zielfunktion (vgl. Kapitel 16.28.1.5) können auch bei der Definition der Nebenbedingungen Objektmengen verwendet werden. 16.28.1.6.4 BeispielskriptAufgrund einer technischen Restriktion darf von mehreren Ersatzquerzweigen nur einer in Betrieb sein. Den Ersatzquerzweigen, welche auch in der Menge ErsatzQZ enthalten sind, wurde der Langname "ErsatzBeschraenkt" zugewiesen. Die Objektmenge ist dann wie folgt zu definieren: ErsatzQZ_Beschraenkt = new Objektmenge("ErsatzQZ_Beschraenkt"); Und die Definition der zugehörigen Nebenbedingung kann so erfolgen: var nebenbedingungen = [ 16.28.1.7 Konfiguration16.28.1.7.1 Konfiguration des OptimierungsframeworksDas Optimierungsframework wird, im Gegensatz zu den meisten anderen Verfahren, nicht über die Steuerdaten sondern über Variablendefinitionen im Skript konfiguriert. Diese Definition muss vor dem Befehl erstelle_optimierungsframework() erfolgen, da bei der Erstellung bereits auf die Konfigurationsvariablen zugegriffen werden muss. Alle Konfigurations-Variablen sind in der Variable of abgelegt. 16.28.1.7.2 Wahl der OptimierungsstrategieAktuell steht einzig die Partikelschwarm-Optimierung als Optimierungsalgorithmus zur Verfügung. Die Partikelschwarm-Optimierung wird folgendermaßen angewählt: of = { 16.28.1.7.3 NetzberechnungZur Bestimmung der Werte der Zielfunktion und Nebenbedingungen erfolgt eine Netzbewertung, die wiederum auf eine oder mehrere Netzberechnungen zurückgreift. Momentan stehen Lastfluss- und Kurzschlussberechnungen als mögliche Netzberechnungsverfahren zur Verfügung. Dazu wird unter der Variable heuristik die Variable netzberechnung ergänzt: netzberechnung : {Für Lastflussberechnungen kann der Typ lastfluss (Leistungsflussberechnung) oder wirkfluss (Wirklastflussberechnung) angegeben werden. Soll eine Kurzschlussstromberechnung erfolgen kann zwischen ks-standard, ks-takahashi und ks-unifeh gewählt werden. Dies entspricht den gleichnamigen Netzberechnungsverfahren von INTEGRAL. Nähere Informationen können der INTEGRAL-Hilfe der zugehörigen Verfahren entnommen werden. Soll eine Kurzschlussstromberechnung erfolgen, muss zusätzlich der Fehlertyp angegeben werden: netzberechnung : {Als mögliche Fehlertypen für eine Kurzschlusstromberechnung können k1, k2, k2e, k3, k3e.gewählt werden. 16.28.1.7.4 Berücksichtigung von Ausfällen (N-1-Betrachtung)Die Netzbewertung kann neben der einfachen Anwendung des Netzberechnungsverfahrens auch Ausfälle berücksichtigen. Auszufallende Objekte sind in einer gesonderten Objektmenge zu hinterlegen. Diese trägt den Namen Ausfallbetrachtung. Ausfallbetrachtung = new Objektmenge("Ausfallbetrachtung");Anschließend sind Netzobjekte und Stellgrößen zu ergänzen. Der Ausfall wird simuliert, indem der Wert der Stellgröße auf sein Minimum gesetzt wird. Typischerweise ist hierfür die Stellgröße Betrieb zu verwenden. Ausfallbetrachtung.ergaenze_stellgroesse("Betrieb", 0, 1, 1);Werte der Zielfunktion und Nebenbedingungen definieren sich nun als Durchschnittswert sämtlicher dieser Ausfallsituationen. Das vorgestellte Ausfallmodell kann nur eine Objektmenge berücksichtigen. 16.28.1.7.5 Konfiguration der ErgebnisausgabeDie Ergebnisausgabe wird als Eigenschaft ausgabe unter dem Hauptobjekt of ergänzt. Dort kann gewählt werden ob eine Analysedatei geschrieben werden soll (analysedatei : true), ob sämtliche Ergebnisse, die in Netznutzungsfällen abgelegt werden, zusätzlich in eine csv-Datei geschrieben werden sollen (csv_ergebnis : true). Mit nnf_ergebnis : true wird festgelegt, dass die Konfiguration der Stellgrößen der besten Ergebnisse in Netznutzungsfälle gespeichert werden. Die Angabe der Anzahl an besten Ergebnissen, die nach Beendigung der Optimierung gespeichert werden sollen, legt die Angabe anzahl_ergebnisse: x fest. 16.28.1.7.6 Konfigurationsbeispiel
of = { 16.28.1.8 Partikelschwarm-Optimierung16.28.1.8.1 FunktionsweiseDie Partikelschwarm-Optimierung ist eine schwarmintelligente Metaheuristik, deren Suchstrategie dem Verhalten sozial organisierter Kolonien nachempfunden ist. Einzelne Positionen im Lösungsraum werden dabei von Partikeln untersucht, die einen Schwarm bilden. Jeder Partikel besetzt in jeder Iteration eine Position im Lösungsraum. Jede Position ist eine Lösung des Optimierungsproblems. Um eine möglichst optimale Lösung zu finden, werden in jeder Iteration die Positionen sämtlicher Partikel angepasst. Zur Bewertung der aktuellen Position werden dabei Werte der Zielfunktion und Nebenbedingungen berechnet. Pro Iteration werden so sämtliche Positionen bewertet und die Geschwindigkeit der Partikel aktualisiert. Die Geschwindigkeit ist dabei als Vektor im n-dimensionalen Lösungsraum zu betrachten, wobei n die Anzahl zu variierender Stellgrößen der Optimierungsaufgabe entspricht. Zur Bestimmung der aktualisierten Geschwindigkeit eines jeden Partikels werden dabei folgende Aspekte berücksichtigt:
Eine Übersicht über die erwähnten Elemente der Partikelschwarm-Optimierung zeigt die nachfolgende Grafik.
16.28.1.8.2 Konfiguration des AbbruchkriteriumsDie Partikelschwarm-Optimierung wird momentan als exklusive Lösungsstrategie des Optimierungsframeworks eingesetzt. Diese ist aber kein Bestandteil des Optimierungsframeworks, sondern wird von diesem aus angesteuert. Die Konfiguration der Partikelschwarm-Optimierung erfolgt deshalb nicht in der Makroumgebung, sondern über Steuerdaten. Eine vollständige Liste sämtlicher Steuerparameter kann über die Funktion Auswahl Steuerdatenprofil→Export→Alle Steuerdaten erfolgen. Als wichtigster Konfigurationsparameter soll hier nur die Festlegung der Abbruchbedingung erläutert werden. Die Steuervariable Abbruchbedingung = xxsetzt die Abbruchbedingung fest. Dabei stehen zur Auswahl Abbruchbedingung = 1 : Abbruch über die angegebene maximale IterationszahlDen genannten Abbruchbedingungen können über folgende Steuerdaten Werte hinterlegt werden: MaxEvaluationen = xx |
|||||||||||||||||||
© 2025 FGH GmbH Mannheim. Alle Rechte vorbehalten. |