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

warehouse location problem

 

boka
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 11.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.12.2008, 11:19     Titel: warehouse location problem
  Antworten mit Zitat      
Hallo zusammen,

sitze gerade an einem kniffligen Problem und beiss mir die Zähne aus. Vielleicht kann mir jemand von euch helfen!?

Das Problem:
Ich habe 600 Filialen, die mit Material versorgt werden müssen und habe alle Entfernungen zwischen den Filialen. (Filialen=z.B. alle Obi's die mit Spanplatten versorgt werden müssen)

Nun möchte ich 20 Filialen durch ein Lager erweitern.

Wie programmiere ich das, damit mein Programm mir sagt, welche der 600 möglichen Standort gewählt werden sollen. Zur Vereinfachung habe ich angenommen, dass jede Filiale einzeln vom Lager versorgt wird (also kein LKW der mit einer Fahrt vom Lager z.B. 2 Filialen versorgt).

Das ganze soll nun so gemacht werden, dass die Fahrtstrecken minimal sind.

Gut wäre noch, wenn man berücksichtgen könnte, dass die Filialen unterschiedlich oft angefahren werden müssen.
____________________

Ich weiss das ist nicht ganz einfach, aber bin mittlerweile einfach total ratlos und würde mich über jede Anregung freuen.

Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen


derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 04.12.2008, 11:56     Titel:
  Antworten mit Zitat      
Ok ich bin nicht der Optimierungsexperte aber ich würde das erstmal in Matlab Form bringen. Ich schätze mal die Abstände sind in einer 600 mal 600 Matrix. Dann würde ich noch eine 2 mal 600 Matrix erstellen. Die erste Zeile für das Lager (1 oder 0) und die Zweite für die Besuche im Lager. Tja und dann brauchst du nen Optimierungsalgorithmus. Mir fällt da spontan nur hill climbing alg. oder A Stern ein. Aber Matlab hat ja auch optimierungsfunktionen. Da müsste nochmal jemand anderes was dazu schreiben.

Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 04.12.2008, 12:11     Titel:
  Antworten mit Zitat      
Hallo boka, das hört sich nach einer Anfrage aus der Hochschulasubildung an. Für solche Probleme eignen sich genetische Algorithmen - ein faszinierendes Thema. Das Rechenzentrum der Uni hat auch bestimmt eine Lizenz für die "Genetic Algorithm and Direct Search Toolbox":

http://www.mathworks.com/products/gads/

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 04.12.2008, 16:57     Titel:
  Antworten mit Zitat      
Hallo boka,

meiner Meinung nach ist das erstmal gar kein Matlab-Problem, sondern ein Modellierungs- und dann ein Optimierungsproblem. Für die Modellierung gibt es immer mehrere Möglichkeiten. Vielleicht kann man dies sogar linear modellieren, aber ich schaffe es (erstmal) als quadratisches Problem (quadratische Zielfunktion und quadratische und lineare Nebenbedingungen).

Ich würde binäre Entscheidungsvariable nehmen, also solche, die nur 0 oder 1 annehmen können.

Variable:
x_i = 1, wenn Filiale i zum Lager ausgebaut wird, sonst = 0
y_ij = 1, wenn Lager-Filiale i die Filiale j beliefert, sonst = 0

Konstanten: Entfernungen c_ij zwischen Filiale i und Filiale j

Zielfunktion: minimiere sum (x_i * sum (c_ij * y_ij) )
wobei die erste Summe über i geht und die zweite über j

Nebenbedingungen:
sum x_i = 20
sum x_i * y_ij = 1 für alle j (Summe über i)
x_i^2-x_i = 0 für alle i
y_ij^2-y_ij = 0 für alle i, für alle j

Damit hat man genau 20 Lager, jede Filiale wird genau einmal bedient und die Variablen sind entweder 1 oder 0 (Nachrechnen!).

Falls jedes Lager genau 30 Filialen bedienen soll, braucht man noch:
sum y_ij <= 30 für alle i (Summe über j)

Das wär's. Quadratische Probleme löst man im allgemeinen nicht mit genetischen Algorithmen. Letztere sind für schwierige Funktionen mit vielen lokalen Minima geeignet, die hier aber nicht vorliegen. Ich würde stattdessen fmincon aus der Optimization Toolbox verwenden.

Brauchst Du Hilfe bei der Implementierung? Einfach fragen.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
boka
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 11.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.12.2008, 20:12     Titel:
  Antworten mit Zitat      
Hallo zusammen,

ist ja super, vielen Dank für eure schnellen und ausführlichen Antworten!

Für die Implementierung der Idee von Bijick fällt mir spontan eine while Schleife ein. Minimiere die Zielfunktion solange die Randbedingungen gelten... ist das so von dir gedacht?

viele Grüße,
Boris
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 06.12.2008, 21:31     Titel:
  Antworten mit Zitat      
Hallo Boris,

nein, ich dachte mir, dass Matlab die Optimierung übernimmt. Steht Dir denn die Optimization Toolbox zur Verfügung? Dann können wir fmincon nehmen und ist alles ganz leicht. Wenn nicht, müssen wir mit fminsearch tricksen, das geht auch.

Bei neuen Matlab-Versionen kann man (falls die Optimization Toolbox vorliegt) auch mit dem Optimization Tool arbeiten. Das ist eine grafische Oberfläche, bei der man sich dann alles zusammenklickern kann, ohne selbst programmieren zu müssen (außer die Zielfunktion und die Nebenbedingungen).

Sag doch mal, welche Version und welche Toolboxen Du hast.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
boka
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 11.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2008, 10:25     Titel: Verwendete MatLAB Version
  Antworten mit Zitat      
Hallo Bijick,

ich verwende die aktuelle Version von 2008 und habe zugang zu allen Toolboxen. Da ich mich nicht als versierten Programmierer bezeichnen würde finde ich deinen Vorschlag mit der graphischen Oberfläche ganz besonders interessant. Wie würde das denn dann aussehen?

Vielen Dank schonmal vorab!!!

Viele Grüsse,

Boris
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 09.12.2008, 12:03     Titel:
  Antworten mit Zitat      
Hallo Boris,

ich hab das gerade mal für eine Testinstanz mit 6 Filialen und zwei Lagern ausprobiert und musste leider feststellen, dass es nicht so einfach ist. Der Optimierer hat Schwierigkeiten damit, die Ganzzahligkeit einzuhalten und findet daher nix Gescheites. Ich versuche nochmal, das ganze linear zu modellieren, denn mit bintprog ist die Ganzzahligkeit wieder kein Problem mehr. Schau Dir doch in der Zwischenzeit schon mal die Hilfe zum Optimierungstool (optimtool) an. Dann fällt es Dir später leichter, damit umzugehen.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
boka
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 11.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2008, 14:52     Titel:
  Antworten mit Zitat      
Hallo Bijick,

vielen Dank für deine Hilfe. Ich bin sozusagen ein MatLAB Neuling und bin fast schon verzweifelt! Hoffentlich liefert dein lineares Modell ein Ergebnis! Falls ja kannst du mir das Modell dann per eMail schicken damit ich einen Anhaltspunkt habe wie das ganze aussehen könnte?

Herzliche Grüße, Boris
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 09.12.2008, 15:29     Titel:
  Antworten mit Zitat      
Hallo Boris,

ein bisschen googlen hat geholfen. Neue Problemformulierung lautet:

min sum(sum(C_ij*Y_ij))

s.t. sum(x_i) = 20
sum(Y_ij) = 1 für alle j
sum(Y_ij) - 600*x_i <= 0 für alle i

(modifiziert von hier)

Für die liniearen Nebenbedingungen gib im Command Window ein:

Code:
n = 600;
A = [-n*eye(n) repmat(eye(n),[1,n])];
Aeq = [ones(1,n) zeros(1,n*n)
       zeros(n) reshape(shiftdim(repmat(eye(n),[1,1,n]),1),n,n^2)];
b = zeros(n,1);
beq = [20;ones(n,1)];

C = ...   % Deine 600x600-Kostenmatrix
f = [zeros(1,n) C(:)'];


Dann starte die GUI:

Code:


und wähle als "Solver" die Funktion bintprog aus. Dann schreibe in die Felder f, A, Aeq, b, beq genau diese Variablen hinein, also zum Beispiel in das Feld "f" schreibe f. Jetzt "Start" klicken und abwarten.

Im guten Fall erscheint die Meldung
Zitat:
Optimization running.
Optimization terminated.
Objective function value: xxx
Optimization terminated.


natürlich mit richtigem Optimalwert. Jetzt müssen wir nur noch aus der Tabelle "Final point" die Standorte der Lager ermitteln. Das geht so: Tabelle markieren, Strg + C drücken, im Workspace Strg +V drücken. Dann öffnet sich ein Fenster, "Next" und "Finish" klicken. Jetzt müssen wir aus A_pastespecial unseren Vektor x und unsere Matrix Y klauben:

Code:
z = A_pastespecial(:,2);
x = z(1:n);
Y = zeros(n);
Y(:) = z(n+1:end);
[ind1,ind2] = find(Y);
Lager = [ind1,ind2]


Lager ist jetzt eine Tabelle, in der vorne die Filialnummer des Lagers steht und hinten die von dem Lager versorgte Filiale.

Gib Bescheid, falls noch Probleme auftauchen.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
boka
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 11.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2008, 16:17     Titel: DANKE!!!!!!!!!!!
  Antworten mit Zitat      
DAS ist ja SUPER! Vielen Dank Bijik. Ich war die letzten Tage krank aber ich werde es gleich morgen mal ausprobieren und melde mich dann nochmal hier im Forum und berichte.
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.