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

Dynamic Pricing Problem

 

Käthe Mittmann
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 06.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.01.2018, 17:39     Titel: Dynamic Pricing Problem
  Antworten mit Zitat      
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
     if length(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
 
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

eine Möglichkeit: am Anfang
Code:
Total = []

und dann in der Schleife die neuen Daten unten anhängen:
Code:
Total = [Total; neueDaten]


Code:
merken(p(k),:) = V

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 06.01.2018, 20:19     Titel:
  Antworten mit Zitat      
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 = [1 2 3];    % 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
           
            if length(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
Private Nachricht senden Benutzer-Profile anzeigen
 
Käthe Mittmann
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 06.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.01.2018, 21:35     Titel:
  Antworten mit Zitat      
Hallo Friidayy,

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
     if size(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
Private Nachricht senden Benutzer-Profile anzeigen
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 07.01.2018, 01:22     Titel:
  Antworten mit Zitat      
hast du noch eine quelle für mich, wie man für deinen fall auf die bellman gleichung kommt? finde dazu nichts passendes bei google.
Private Nachricht senden Benutzer-Profile anzeigen
 
Käthe Mittmann
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 06.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2018, 14:26     Titel:
  Antworten mit Zitat      
Hallo Friidayy,

anbei findest eine Erklärung aus dem Buch Revenue Management. Ich hoffe diese hilft dir weiter.

Grüße
Käthe

Bellman'sche_2.jpg
 Beschreibung:

Download
 Dateiname:  Bellman'sche_2.jpg
 Dateigröße:  307.63 KB
 Heruntergeladen:  335 mal
Bellman'sche.jpg
 Beschreibung:

Download
 Dateiname:  Bellman'sche.jpg
 Dateigröße:  213.33 KB
 Heruntergeladen:  394 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

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)

die Fehlermeldung
Zitat:
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
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 - 2025 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.