WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

variabler Strafterm in Nebenbedingung

 

Peters

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.01.2017, 12:11     Titel: variabler Strafterm in Nebenbedingung
  Antworten mit Zitat      
Hallo Zusammen,

es geht um ein quadratisches Optimierungsproblem (mit genetischem Algorithmus zu lösen), das insgesamt die Kosten minimieren soll. Hier existiert folgendes Problem bei dieser Nebenbedingung:

\sum_{w=1}^{K}\sum_{m=1}^{M} t_{m} y_{wkm} \leq tc_{k} + atc_{k} 
<br />

<br />
 \forall~ k \in K

Die Durchführungszeit (t) von m, wenn Standort existent (y = 1) muss kleiner gleich die Zeitkapazität (tc) + zusätzliche Zeitkapazität (atc) an k ein.

t und tc sind gegeben.

Der Code in MATLAB sieht zurzeit so aus:

Code:
%(3) Termintreue

ineq_3 = zeros(1, K);
for kk = 1:K
    sum_3 = 0;
    for mm = 1:M
        for ww = 1:W  
            sum_3 = sum_3 + t(mm) * y(mm,kk,ww);
        end
    end
    ineq_3(kk) = sum_3 - tc(kk) - atc(kk);  %<----um den Wert gehts!
end


Die zusätzliche Zeitkapazität atc wurde hinzugefügt, um diese daraufhin zu bestrafen (man kann sich quasi mehr Zeit kaufen). Dies impliziert, dass die Zeitkapazität am Standort k überschritten werden kann, allerdings wird der Betrag der Überschreitung atc mit einem Kostensatz bestraft:

MATLAB:
Code:
% Zeitstrafkosten
XZ= zeros(M,K);
for kk = k
    for mm = M
    XZ(mm,kk) = Kostensatz(mm,kk) .* atc(kk); %<----um den Wert gehts!
    end
end
[...hier wird das Ergebnis in Excel ausgegeben...]
;
 


XZ wird dann in Zielfunktion integriert und soll natürlich minimiert werden.

atc sollte sich dabei an die zusätzlich benötigte Zeit am jeweiligen Standort anpassen (eine variable sein). Dies funktioniert leider nicht. Der Fehler in MATLAB lautet, dass die Variable atc nicht definiert ist. atc sollte aber nicht definiert werden, da die variable sich je nach Nachfrage anpassen soll (atc = Zwischenergebnis, um Zeitstrafkosten zu berechnen).

Hat jemand eine Idee, wie man das Problem lösen könnte?

Das wurde jetzt doch etwas lang, aber ich hoffe, dass das Problem dadurch verständlich ist. Da ich mich erst seit kurzem mit MATLAB beschäftige, weiß ich nicht genau einzuschätzen, ob euch die Infos ausreichen. Ansonsten gerne nachhaken.

Beste Grüße und vielen Dank


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.01.2017, 14:32     Titel:
  Antworten mit Zitat      
Hallo,

die Fehlermeldung besagt ja, wo das Problem liegt: act muss zuerst definiert werden.

Nun ist mir die Problemstellung nicht 100%ig klar, aber ich würde sagen:
Code:
atc(kk) = max(sum_3 - tc(kk), 0);

Das ist also die Abweichung, die aber nicht negativ werden kann / soll.

Diese Berechnung muss mitsamt der vorherigen Zeilen da ausgeführt werden, wo der Kostensatz berechnet werden soll.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Themenersteller

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.01.2017, 23:58     Titel:
  Antworten mit Zitat      
Hallo,

vielen Dank für deine schnelle Antwort. Leider habe ich die beiden zitierten Codestellen in zwei unterschiedlichen MATLAB Dateien (einmal als function, einmal als script). Es fehlt somit, wie Du schon geschrieben hattest, entweder an der Definition von atc oder eben sum_3, wenn ich deinen Code einfüge.

Wie kann ich die Variable für beide nutzen?

Code:
function [XZ, XY, sum_3] = Nebenbedingungen(,...., atc)


Kann ich dort sum_3 als Output angeben, obwohl sum_3 nicht in (,...., atc) integriert ist? Wenn ja, wie könnte ich den Output dann im anderen script abrufen?
Ist das zum Bsp. mit einer Rückgabevariable möglich?

Wenn ich die Variable sum_3 als global deklariere, stimmen darüber hinaus die Dimensionen von sum_3 und atc nicht überein.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.01.2017, 00:14     Titel:
  Antworten mit Zitat      
Hallo,

bitte poste doch mal die gesamte Code-Struktur.
Skripte und Funktionen zu mischen ist höchstens sinnvoll, wenn ein Hauptskript mehrere Funktionen aufruft.

Zitat:
Kann ich dort sum_3 als Output angeben, obwohl sum_3 nicht in (,...., atc) integriert ist?

Ja, die Variable muss lediglich in der Funktion belegt werden.

Zitat:
Wenn ja, wie könnte ich den Output dann im anderen script abrufen?

Genauso wie sie deklariert wurde, also mit 3 Rückgabeargumenten.

Zitat:
Wenn ich die Variable sum_3 als global deklariere, stimmen darüber hinaus die Dimensionen von sum_3 und atc nicht überein.

Es ist in den wenigsten Fällen nötig, mit globalen Variablen zu arbeiten.
Die nicht übereinstimmenden Dimensionen haben allerdings nichts mit der globalen Variablen zu tun.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Themenersteller

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.01.2017, 00:45     Titel:
  Antworten mit Zitat      
Hallo,

den gesamten Code kann ich hier leider nicht posten.

Fitness und Nebenbedingung sind dann jeweils eine function in einer Datei.
Das Hauptskript ruft aber die anderen Skripte und Funktionen auf mit folgendem Code:

Code:
Skript1;   % liest Daten aus der Excel Datei ein
Skript2;         % ertstellt ...
Skript3;       % erstellt ...


%%
%---Fitness und Nebenbedingungen einlesen---

ObjFcn =...
ConsFcn = ...

%%
%---Genetischen Algorithmus ausführen---
usw..


Ich habe jetzt in Skript1 folgenden Code hinzugefügt:

Code:
%Definition atc
for kk = k
atc(kk) = max(sum_3 - tc(kk), 0);
end


sum_3 wird aber nur in der function Nebenbedingung verwendet. Ich müsste folglich zwischen der function und dem skript1 eine Verbindung herstellen, um die Variable auch in skript 1 zu nutzen. Dies wollte ich über den Output erreichen. Allerdings benötige ich ja nur ein statt 3 Rückgabeargumente.

Code:
[XZ, YZ, sum_3] = Nebenbedingung(XXX)


Was muss ich für XXX einsetzen? Wenn ich dort die ursprünglichen Variablen stehen lasse, werden diese wieder als nicht definiert angesehen.

Ich hoffe, dass dir die Erläuterungen ausreichen. Gruß und besten Dank.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.01.2017, 10:56     Titel:
  Antworten mit Zitat      
Hallo,

mit den gegebenen Informationen ist es leider nicht möglich, dir effizient zu helfen.

Zitat:
Ich habe jetzt in Skript1 folgenden Code hinzugefügt:

Da ist der Code fehl am Platz, weil das ja für jede Kombination neu berechnet werden muss. Das muss also in die Nebenbedingungs- oder Zielfunktion (ich vermute letzteres).

Zitat:
Was muss ich für XXX einsetzen? Wenn ich dort die ursprünglichen Variablen stehen lasse, werden diese wieder als nicht definiert angesehen.

Mit den spärlichen Informationen, die du zur Verfügung stellst, kann ich dir nur sagen, dass du sie dann eben vorab definieren musst, oder (vermutlich sinnvoller) die Funktion an anderer Stelle aufrufen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Themenersteller

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.01.2017, 20:54     Titel:
  Antworten mit Zitat      
Hallo,

vielen Dank für deine Mühen. Du hattest natürlich vollkommen recht. atc musste mit dem entsprechenden Kostensatz in die Zielfunktion.
Die Lösung gestaltet sich schwieriger als gedacht. Leider besteht die Problematik weiterhin, da die variable atc erst in der Nebenbedingung berechnet wird. Die Nebenbedingung aber erst nach der Zielfunktion im Hauptskript eingelesen wird. Wir bewegen uns quasi immer im Kreis, weil irgendeine Funktion nichts mit der Variable anfangen kann. Trotzdem vielen Dank für deinen Input - habe schon mal viel gelernt!
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.01.2017, 22:17     Titel:
  Antworten mit Zitat      
Hallo,

im Zweifelsfall würde ich zunächst die Berechnungen in Nebenbedingungs- und Zielfunktion doppelt durchführen. Außer im Aufruf des genetischen Algorithmus sehe ich keinen Sinn darin, diese beiden Funktionen aufzurufen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Themenersteller

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2017, 12:15     Titel:
  Antworten mit Zitat      
Der genetische Algorithmus sucht zuerst eine mögliche Lösung innerhalb der funktion der Nebenbedingungen. Nach der gefundenen Lösung wird er abwechselnd die Nebenbedingungs- und Zielfunktion abwechselnd abrufen, um die Lösung zu optimieren.
Das Problem ist somit nicht einfach über die doppelte Durchführung der Funktionen gelöst.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.01.2017, 19:03     Titel:
  Antworten mit Zitat      
Hallo,

ich habe ga mit diesem Vorschlag schon verwendet. Falls du also das oder eine Funktion mit ähnlichem Interface verwendest, sollte der Vorschlag funktionieren.
Da die Ziel- und Nebenbedingungsfunktion ja jeweils die momentanen Kandidaten übergeben bekommen, sollte es kein Problem sein, in beiden Funktionen das selbe doppelt zu machen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.