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

Bintprog RECHENZEIT

 

Kudzu
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 13.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.05.2009, 10:45     Titel: Bintprog RECHENZEIT
  Antworten mit Zitat      
Hallo zusammen,

ich habe ein Skript mit einem Fahrplan geschrieben. Meine Fahrzeuge fahren immer zum Zeitpunkt 0, 20, 40, 60, 80 usw. los. Jede Lieferung hat ein Zeitfenster von 30 Minuten und muss zwischen den Zeitpunkten START und ENDE durchgeführt werden. Es sollen möglichst viele Lieferungen durchgeführt werden, eine Lieferung soll aber nicht mehrfach erfolgen. Jedes Fahrzeug darf pro Tour maximal 3 Lieferungen machen. Ermittelt wird das durch eine Matrix von 24 * 24 Feldern für die 24 Lieferungen und 24 Touren, die gefahren werden. Eine 1 bedeutet, dass die Lieferung auf der Tour erledigt wird, eine 0 bedeutet, dass diese ausgelassen wird. Es gibt 4 Nebenbedingungen, die ich abbilde:

Frühester Zeitpunkt zur Anlieferung mal 1/0 (ausgeführ oder nicht) <= Startzeit + Wegzeit
Startzeit plus Wegzeut * 1/0 <= spätester Anlieferzeitpunkt
Spaltensumme der Matrix <= 1
Zeilensumme der Matrix <= 3

Mein Skript dafür ist:

Code:

disp('Berechnung läuft. Bitte warten...')

% Start der Zeiterfassung
tic

% Zielfunktion f = (- 1,- 1, - 1, - 1, - 1...)
f = - ones(1, 576);

% Aufnahme der Begrenzungen:
tpluss = zeros(576);
% 1. Früheste Lieferzeit
start = [1   41   54   105   120   165   180   180   195   206   207   240   285   285   315   352   381   390   390   405   405   435   435   450];
% 2. Zeitfenster für die Lieferung = 30 Minuten
ende = start + 30;
% 3. Die Dauer des Fahrtweges wird berücksichtigt
s = [9   9   9   11   6   12   11   5   11   9   9   5   11   5   11   9   9   6   9   11   8   5   5   11];
% 4. Dauer des Fahrtweges plus Anfahrt (t_i = 0, 20, 40...) entspricht
% Ankunftszeit in [min]
for i = 1 : 24
    for j = 1 : 24
    tpluss((i - 1) * 24 + j) = 20 * (j-1) + s(i);
    end
end

% Koeffizienten für Nebenbedingungen (A)
A = zeros(1200, 576);
for i = 1 : 24
    for j = 1 : 24
        % Nebenbedingung 1: A_j * a <= t + s
        A((i-1) * 24 + j, (i-1) * 24 + j) = start(i);
        % Nebenbedingung 2: (t + s)* a <= Z_j
        A((i-1) * 24 + j + 576, (i-1) * 24 + j) = tpluss(i);
        % Nebenbedingung 3: Spaltensumme <= 1
        A((i-1) + 1153, (i - 1) * 24 + 1 : i * 24) = 1;
        % Nebenbedingung 4: Zeilensumme <= 3
        A((i-1) + 1177, (j-1)*24 + i) = 1;
    end
end

% Rechte Seite der Nebenbedingungen (b)
for i = 1:576
    % Nebenbedingung 1: A_j * a <= t + s
    b(i) = tpluss(i);
end
for i = 1:24
    % Nebenbedingung 2: (t + s)* a <= Z_j
    b((i - 1) * 24 + 577 : i * 24 + 577) = ende(i);
end
for i = 1:24
    % Nebenbedingung 3 + 4: Spaltensumme <= 1, Zeilensumme <= 3
    b(i + 1152) = 1;
    b(i + 1176) = 3;
end

% Berechnung und Ausgabe
erg = bintprog(f, A, b);
for i = 1:24
    ausg(1:24, i) = erg((i-1)*24+1:(i-1)*24+24);
end
ausg

% Zeiterfassung Ausgabe
toc


Jetzt hat er heute Nacht zwei Stunden daran gerechnet, dann behauptet, die options.MaxTime oder so sei erreicht und abgebrochen. Als Ergebnis hat er mir eine Matrix mit 24 * 24 Nullen ausgespuckt, die mir nicht wirklich weitergeholfen hat. Ich hatte vorher in der START-Variable versehentlich zu niedrige Werte (alle zweistellig), damals hat die Berechnung unter 100 Sekunden gedauert. Natürlich sehe ich ein, dass es jetzt etwas anspruchsvoller ist, aber das ist wirklich zu viel Rechenzeit.

Ein Mensch kann das Problem innerhalb von 5 Minuten lösen (natürlich nicht mit linearer Optimierung, sondern mit gesundem Menschenverstand) und einfaches "Durchprobieren" aller 2^576 Kombinationen, bis eine gültige mit f = 24 (erwiesenermaßen der Maximalwert) gefunden ist, ist vermutlich auch noch flotter! Es geht mir aber darum, dass das Skript da oben funktionieren soll und nicht, dass die Lösung gefunden wird! Könnt Ihr mir in irgendeiner Weise helfen? Wie kann ich die Rechenzeit senken? Habe ich einen Fehler gemacht? Im schlimmsten Fall: Wie erhöhe ich dieses options.Maxtime?

Kudzu
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.