Verfasst am: 06.01.2018, 17:39
Titel: Dynamic Pricing Problem
Hallo zusammen,
Ich bearbeite zur Zeit mit meiner Projektpartnerin ein dynamic pricing Projekt für die Uni.
Wie ihr an dem unten stehenden Code erkennen könnt, haben wir uns ein kleines Beispiel überlegt, das wie folgt lautet:
Wir betrachten einen Buchungsablauf über T = 5 Perioden und haben eine Kapazität (bspw. Sitzplätze im Flugzeug) von C = 4. Beim Dynamic Pricing kann in jeder Periode (je nach Restkapazität) ein individueller Preis festgelegt werden, der den Erlös der Periode maximiert.
Wir haben die Preise 1,2 und 3 zuvor festgelegt.
Der Kunde kauft ein Ticket, sobald seine Zahlungsbereitschaft den aktuellen Preis der Periode übersteigt. Die Zahlungsbereitschaft ist gleichverteilt und liegt im Intervall [a=0,b=4].
Unser Ergebnis soll eine Matrix(Total) sein, in der für jede Periode und jede mögliche Restkapazität der optimale Erlös mit dazugehörigem Preis ausgegeben werden soll.
Hier liegt unser Problem: Wir haben zunächst drei Schleifen gebaut, wobei die äußere Schleife die Perioden, die zweite die verschiedenen Kapazitäten und die innerste die verschiedenen Preise durchgeht.
Wir schaffen es, die Ergebnisse der inneren Schleife in einer Matrix zu speichern, schaffen es aber nicht, eine Matrix mit allen Perioden, Kapazitäten, Preisen und Erlösen zu erstellen.
Folgend findet ihr den Code.
Ihr würdet uns wirklich helfen, wenn ihr euch den Code einmal ansehen könntet und evtl. einen Tipp hättet, wie wir diesen optimieren können.
Vielen Dank im Voraus!!!!
Code:
p = [1,2,3];
C = 4;
T = 5;
a = 0;
b = 4;
r = numel(p);
merken = zeros(1,2);
Total = zeros(1,3);
Preisvektor = zeros(1,1);
Erloesvektor = zeros(1,1);
Kapazitaetenvektor = zeros(1,1);
for t = T+1:-1:1 for c = 0:C
for k = 1:r
if t == T+1
V = 0 elseif c == 0
V = 0 else V = (1-1/b*p(k))*(p(k)+V(c-1,t+1))+(1/b*p(k))*V(c,t+1) end iflength(merken) < k
merken(p(k),:) = V
end end
Emax = max(merken);
pmax = Emax(1,1);
Vmax = Emax(1,2);
Preisvektor(c+1)= [pmax];
Erloesvektor(c+1) = [Vmax];
PV = transpose(Preisvektor);
EV = transpose(Erloesvektor);
Kapazitaetenvektor(c+1) = [c];
CV = transpose(Kapazitaetenvektor);
Total = [CV,PV,EV] end
VGes = sum(Total,3)
ZB = a+(b-a).*rand(1,1) if ZB>pmax
c = c-1 else c = c
end end
ist problematisch, wenn p mal nicht nur ganzzahlige Werte enthält.
Ein Kritikpunkt wäre die Variablennamen. Die Bedeutung von C, T, a, b ist auf den ersten Blick nicht klar. Etwas wie Erloesvektor ist viel besser, auch wenn ich keinen Bedarf für das "vektor" sehe und eher zu englischsprachigen Namen neige.
ihr solltet euren code kommentieren, hab kaum eine vorstellung davon, was da genau passiert. wäre gut, wenn ich die ersten iterationen hier mal durchspielen könntet, am besten mit kommentaren.
Code:
p = [123]; % mögliche preise
C = 4; % kapazität
T = 5; % anzahl von perioden
a = 0; % minimale zahlungsbereitschaft ?
b = 4; % maximale zahlungsbereitschaft ?
r = numel(p); % anzahl preise
merken = zeros(1,2); % bedeutung ?
Total = zeros(1,3);
Preisvektor = zeros(1,1);
Erloesvektor = zeros(1,1);
Kapazitaetenvektor = zeros(1,1);
for t = T+1:-1:1% loop über perioden, vom ende zum start for c = 0:C % loop über verschiedene kapazitäten for k = 1:r % loop über mögliche preise ? if t == T+1
V = 0% was bedeutet V ? Value ? elseif c == 0
V = 0 else
V = (1-1/b*p(k))*(p(k)+V(c-1,t+1))+(1/b*p(k))*V(c,t+1)% woher kommt diese formel ? end
iflength(merken) < k
merken(p(k),:) = V
end end
Emax = max(merken);
pmax = Emax(1,1);
Vmax = Emax(1,2);
Preisvektor(c+1)= pmax;
Erloesvektor(c+1) = Vmax;
Kapazitaetenvektor(c+1) = c;
Total = [Kapazitaetenvektor' Preisvektor' Erloesvektor'] end
VGes = sum(Total,3)
ZB = a+(b-a).*rand(1,1)% gleichverteilte zufallsvariable if ZB>pmax
c = c-1 end end
danke, dass du uns helfen willst! Unten findest du unseren Code mit Kommentaren. Ich hoffe, diese sind hilfreich. Falls noch etwas unklar sein sollte, frag gerne.
Grüße
Käthe
Code:
p = [1,2,3]; % zuvor festgelegte Preise
C = 4; % Kapazität
T = 5; % Perioden
a = 0; % Lower Bound Zahlungsbereitschaftsintervall
b = 4; % Upper Bound Zahlungsbereitschaftsintervall
r = numel(p); % Anzahl der Elemente des Preisvektors
merken = zeros(1,2); % Vordefinition merken Matrix, die Zwischenergebnisse der einzelnen Iterationen speichert
Total = zeros(1,3); % Vordefinition der Ergebnismatrix, die optimale Erlöse/Preise über Verfahren hinaus speichert
Preisvektor = zeros(1,1); % Vordefinition Preisvektor
Erloesvektor = zeros(1,1); % Vordefinition Erlösvektor
Kapazitaetenvektor = zeros(1,1); % Vordefinition Kapazitaetenvektor for t = T+1:-1:1% for-Schleife über alle Perioden (Rückwärtsrekursion) for c = 0:C % For-Schleife über alle Kapazitäten for k = 1:r % for-Schleife über alle möglichen Preise if t == T+1% wenn die Vorperiode, welche zur Berechnung der Gleichung unten erreicht ist,
V = 0% gibt es keinen Erlös(wird nur zur Berechnung benötigt) elseif c == 0% wenn Kapazität aufgebraucht, gibt es keinen Erlös
V = 0 else V = (1-1/b*p(k))*(p(k)+V(c-1,t+1))+(1/b*p(k))*V(c,t+1)% Bellman'sche Funktionalgleichung zur Berechnung des Erlöses(auf jede Kapa und jeden Preis bezogen, rekursiv) end% Berücksichtung der Wskt. des Kaufes und des Nicht-Kaufes eines Kunden ifsize(merken,1) < k % speichert nächsten Preis mit zugehörigem Erlös
merken(p(k),:) = V
end end
Emax = max(merken); % rausziehen des max. Erlöses plus Preis aus merken
pmax = Emax(1,1); % speichert den max Preis
Vmax = Emax(1,2); % speichert max. Erlös
Preisvektor(c+1)= [pmax]; % speichern aller Preise, die die jeweiligen Erlöse max.
Erloesvektor(c+1) = [Vmax]; % speichern aller max. Erlöse
PV = transpose(Preisvektor); % Vektor transponieren
EV = transpose(Erloesvektor); % Vektor transponieren
Kapazitaetenvektor(c+1) = [c]; % speichern aller Kapa-möglichkeiten
CV = transpose(Kapazitaetenvektor); % Vektor transponieren
Total = [CV,PV,EV]% Matrix mit Endergebnis
%(diese ist bei diesem Code aber noch nicht vollständig, in der ersten
%Spalte sollen ebenfalls die Perioden hinzugefügt werden, die aber für
%mehrere Kapazitäten gleich sein können) end
VGes = sum(Total,3)% Summe aller Erlöse
ZB = a+(b-a).*rand(1,1)% Zahlungsbereitschaft berechnen if ZB>pmax % wenn ZB größer Preis, kauft Kunde
c = c-1% dann wird Kapa minimiert else c = c % wenn nicht, dann nicht end end
wenn ich euren Code laufen lasse, bekomme ich in der Zeile
Code:
else V = (1-1/b*p(k))*(p(k)+V(c-1,t+1))+(1/b*p(k))*V(c,t+1)% Bellman'sche Funktionalgleichung zur Berechnung des Erlöses(auf jede Kapa und jeden Preis bezogen, rekursiv)
Subscript indices must either be real positive integers or logicals.
Grund ist, dass in dem Moment c=1 und somit c-1 =0 ist.
Grüße,
Harald
Einstellungen und Berechtigungen
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
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.