Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Offtopic > Plauderecke > Suche Hilfe: Angebot und Nachfrage berechnen
Antwort
 
Themen-Optionen
Alt 16.12.2006, 18:26   Nach oben    #1
ljungi
Blubb... öfz
 
Benutzerbild von ljungi
 
Registriert seit: 16.03.2006
Ort: Berlin
Beiträge: 419
Standard Suche Hilfe: Angebot und Nachfrage berechnen

Ich wusste nicht, in welches Forum ich das schreiben sollte, darum habe ich einfach mal das globalste genommen.

Für mein Browsergame möchte ich gerne Angebot und Nachfrage berechnen.

Ich habe mich mit einem Freund bereits auseinandergesetzt, bin aber noch nicht zufrieden.

Drei Daten stehen mir zur Verfügung:

- Gesamte Anzahl an Tonnen der Waren, die im Umlauf sind
- Gekaufte Waren an einem Tag (in Tonnen) - lässt sich auch auf längere Sicht speichern
- Anzahl der Tonnen im Markt / Handel / Langer

Nun sind wir bisher auf folgendes Konzept gekommen, das ich am besten anhand eines Beispiels erläutere:

Gegeben sei ein Richtwert von 7

Es gibt im Handel 100 Tonnen Holz.
An einem Tag wurden 10 Tonnen gekauft.

100 / 10 = 10

Der Quotient für einen Tag wäre also 10.
Dieser wird nun eine Woche lang aufgenommen, dann der Mittelwert berechnet.
Gehen wir mal davon aus, dass dann 7 Tage lang 10 Tonnen pro Tag gekauft werden und der Warenbestand im Lager konstant 100 bleibt, also haben wir einen Durchschnitt von 10.

Der Preis pro Tonne liegt am Anfang der Woche bei 9 €

10 > 7, Angebot größer als Nachfrage: Preis sinkt


Der Richtwert wird wohl einmal pro Woche oder alle 14 Tage bestimmt.

Das heißt, dass diese Woche der Richtwert steigen würde.

10 - 7 / 2 = 1,5

R = 8,5

Und dann gehts weiter...


Hoffe die Rechnung wurde verstanden und ist logisch.

Nun mal meine Frage...

Ich habe ja wie oben geschrieben 3 Werte zur Verfügung. Bislang ist aber die Nachfrage "künstlich" erstellt worden.
Wie kann ich die sich aktuell im Umlauf befindenden Waren mit in die Rechnung mit aufnehmen, sodass dort auch nochmals eine Abhängigkeit entsteht?

Ebenfalls ist noch die Frage, wie weit der Preisverfall ist, bzw wie man den am logischsten ausrechnet.
__________________
Vive la France! Welcome to Sarkoworld...

Geändert von ljungi (16.12.2006 um 18:31 Uhr).
ljungi ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.12.2006, 02:18   Nach oben    #2
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.800
Standard

Hi, denke mal, dass das eher in das Forum "Plauderecke" passt. Ist halt irgendwie offtopic, wenn man sich die anderen Foren anschaut .. hmmm .. hätte auch nicht gewusst, wo ich das reinschreiben soll.

Ich verschieb es mal.

Werde eventuell morgen oder übermorgen nochmals schauen, ob ich da 'ne Antwort finde (bin gerade .. alkoholisiert *g*).
Grüße, Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.12.2006, 13:14   Nach oben    #3
WarrenFaith
Mensch
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.793
Standard

Es ist doch total einfach

Du hast ein Anfangswert von 100t Holz. Der Anfangsbedarf liebt bei 10t am Tag. Die Anfangsproduktion liegt auch bei 10t am Tag. Fazit: Preis bleibt stabil.
Wenn nun der Bedarf auf 20t steigt. Hast du nach einem Tag nur noch 90t, am nächsten nur noch 80t, dann 70t etc. Die Ressourcen sinken, da Nachfrage höher. Fazit: Preis steigt.

Du solltest also nur "Produktion pro Tag" / "Verbrauch pro Tag" = "Index" rechnen. Ist der Index > 1, sinkt der Preis, da mehr produziert als verbraucht wird. Ist der Index < 1, steigt der Preis, da mehr verbraucht als produziert wird.
Je nachdem wie weit der Index von der 1 weg ist, desto größer ist der Preisanstieg / die Preissenkung.

Sonderfall: 20t auf Lager, Produktion 10t, Verbrauch 50t. Es fehlen also locker 20t für den Tag. Im Normalfall würde der Preis nun explodieren. Demzufolge kannst du rechnen: "Lager + Produktion" / "Verbrauch" = "Index" dann ist 1 / "Index" deine Preisteigerung. Mit den Daten oben, kannst du den Preis dann auf das 1,66 fache steigern, also um 66% nach oben schrauben.

Noch Fragen ?
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.12.2006, 13:49   Nach oben    #4
ljungi
Blubb... öfz
 
Benutzerbild von ljungi
 
Registriert seit: 16.03.2006
Ort: Berlin
Beiträge: 419
Standard

Oh ja.. ^^

Ich verstehe wie du das meinst. Klar, kein Ding

Nur scheitere ich schon bei der Umsetzung meines eigenen Systems !

Ich poste am Ende des Beitrags mal meinen aktuellen Quelltext, dokumentiert und hoffentlich verständlich - sage im vorneherein aber schon, dass so gut wie alle meine Tests fehlgeschlagen sind und ich nun auf ein Banaleres System umgestiegen bin (menge im Lager - menge im Lager von vor einer Woche; wenn Ergebnis negativ, Preis steigt, wenn positiv, Preis sinkt, funktioniert auch, allerdings sind die Schwankungen dann teils enorm).

Hier also nun der Quelltext.
Ich habe mir einige Beispiele auf dem Papier ausgerechnet, da hat es immer geklappt.



PHP-Code:
//gekaufte ress holen
$ressArray = array("Holz""Eisen""Stahl""Beton""Wasser""Sand""Titan""Glas""Oel""Nahrung");
$gekaufteRessRow $db->query("SELECT Holz, Eisen, Stahl, Wasser, Beton, Sand, Glas, Titan, Oel, Nahrung FROM game_markt_gekauft")or die(mysql_error());

$gekaufteRessArray = array("Holz" => 0"Eisen" => 0"Stahl" => 0"Beton" => 0"Wasser" => 0"Sand" => 0"Titan" => 0"Glas" => 0"Oel" => 0"Nahrung" => 0);

while(
$gekaufteRess $db->fetchArray($gekaufteRessRow)) {
    foreach(
$ressArray AS $ress) {
        
$gekaufteRessArray[$ress] += $gekaufteRess[$ress];
    }
}


//marktstand DIESER und LETZTER woche holen

$marktStandAktuell $db->fullResult("SELECT id, Holz, Eisen, Stahl, Wasser, Beton, Sand, Glas, Titan, Oel, Nahrung FROM game_markt ORDER BY id DESC LIMIT 0,1")or die(mysql_error());
$marktStandLetzteWoche $db->fullResult("SELECT Holz, Eisen, Stahl, Wasser, Beton, Sand, Glas, Titan, Oel, Nahrung FROM game_markt WHERE id = ".($marktStandAktuell['id']-1))or die(mysql_error());

// Vergleich der beiden Arrays
$marktStandAktualisiert = array();

foreach(
$ressArray AS $ress) {
    if(
$marktStandAktuell[$ress] != $marktStandLetzteWoche[$ress]) {
        
$marktStandAktualisiert[$ress] = true;
    }else {
        
$marktStandAktualisiert[$ress] = false;
    }
}


//alten Quotienten aus der DB holen

$alterQuotient $db->fullResult("SELECT Holz, Eisen, Stahl, Wasser, Beton, Sand, Glas, Titan, Oel, Nahrung FROM game_markt_quotas ORDER BY id DESC LIMIT 0,1")or die(mysql_error());

// nun, falls noetig, durchschnitt ausrechnen
$aktuellerQuotient = array();
$diff = array();

foreach(
$ressArray AS $ress) {
    
// wenn was gekauft wurde UND der marktstand sich veraendert hat
    
if($gekaufteRessArray[$ress] != && $marktStandAktualisiert[$ress] == true) {
        
// neuen Quotienten bilden
        
$aktuellerQuotient[$ress] = $marktStandAktuell[$ress]/$gekaufteRessArray[$ress];
    
    
// wenn nichts gekauft wurde, ABER der marktstand sich veraendert hat
    
}elseif($gekaufteRessArray[$ress] == && $marktStandAktualisiert[$ress] == true) {
        
        
// Versuch die Hohe differenz etwas auszugleichen, um Quotienten um die 100 zu erreichen: GESCHEITERT!
        
$diff[$ress] = $marktStandAktuell[$ress] - $marktStandLetzteWoche[$ress];
        if(
$diff[$ress] >= 1000) {
            
$aktuellerQuotient[$ress] = $diff[$ress] / 71.3;
        }elseif(
$diff[$ress] >= 100) {
            
$aktuellerQuotient[$ress] = $diff[$ress] / 7.13;
        }else {
            
$aktuellerQuotient[$ress] = $diff[$ress];
        }

    
// es wurde gekauft, ABER der marktstand hat sich NICHT veraendert
    
}elseif($gekaufteRessArray[$ress] != && $marktStandAktualisiert[$ress] == false) {
        
$aktuellerQuotient[$ress] = $marktStandAktuell[$ress]/$gekaufteRessArray[$ress];
    }else {
        
        
//nix passiert, alter quotient = neuer quotient
        
$aktuellerQuotient[$ress] = $alterQuotient[$ress];
    }
}

$alterRichtwert $db->fullResult("SELECT Holz, Eisen, Stahl, Wasser, Beton, Sand, Glas, Titan, Oel, Nahrung FROM game_markt_richtwert ORDER BY id DESC LIMIT 0,1")or die(mysql_error());

// alten Richtwert von neuen Quotienten subtrahieren
$neuerQuotient = array();

foreach(
$ressArray AS $ress) {
    if(
$aktuellerQuotient[$ress] == $alterQuotient[$ress]) {
        
$neuerQuotient[$ress] = $alterQuotient[$ress];
    }else{
        
$neuerQuotient[$ress] = $aktuellerQuotient[$ress] - $alterRichtwert[$ress];
    }
}

// neuen Richtwert bestimmen
$neuerRichtwert = array();

foreach(
$ressArray AS $ress) {
    if(
$aktuellerQuotient[$ress] == $alterQuotient[$ress]) {
        
$neuerRichtwert[$ress] = $alterRichtwert[$ress];
    }else {
        
$neuerRichtwert[$ress] = $neuerQuotient[$ress] / $alterRichtwert[$ress];
    }
}

// neuen Preis ausrechnen

$alterPreis $db->fullResult("SELECT Holz, Eisen, Stahl, Wasser, Beton, Sand, Glas, Titan, Oel, Nahrung FROM game_markt_preise ORDER BY id DESC LIMIT 0,1")or die(mysql_error());
$neuerPreis = array();

foreach(
$ressArray AS $ress) {
    if(
$aktuellerQuotient[$ress] == $alterQuotient[$ress]) {
        
$neuerPreis[$ress] = $alterPreis[$ress];
    }else {
        if(
$neuerQuotient[$ress] < $alterRichtwert[$ress]) {
            
//Preis steigt
            
$neuerPreis[$ress] = ($alterRichtwert[$ress] * $alterPreis[$ress]  / 1000) + $alterPreis[$ress];
        }else {
            
//Preis faellt
            
$neuerPreis[$ress] = $alterPreis[$ress] - ($neuerRichtwert[$ress] * $alterPreis[$ress]) / 1000;
        }
    }

Hier mal die Debugausgabe

Code:
Alter Richtwert

Array
(
    [0] => 70
    [Holz] => 70
    [1] => 70
    [Eisen] => 70
    [2] => 70
    [Stahl] => 70
    [3] => 70
    [Wasser] => 70
    [4] => 70
    [Beton] => 70
    [5] => 70
    [Sand] => 70
    [6] => 70
    [Glas] => 70
    [7] => 70
    [Titan] => 70
    [8] => 70
    [Oel] => 70
    [9] => 70
    [Nahrung] => 70
)

	Neuer Richtwert

Array
(
    [Holz] => -2465
    [Eisen] => 105.12622720898
    [Stahl] => 70
    [Beton] => 315.5049088359
    [Wasser] => 70
    [Sand] => 70
    [Titan] => 70
    [Glas] => 70
    [Oel] => 70
    [Nahrung] => 70
)

Marktstand aktuell

Array
(
    [0] => 3
    [id] => 3
    [1] => 25000
    [Holz] => 25000
    [2] => 30000
    [Eisen] => 30000
    [3] => 20000
    [Stahl] => 20000
    [4] => 20000
    [Wasser] => 20000
    [5] => 60000
    [Beton] => 60000
    [6] => 20000
    [Sand] => 20000
    [7] => 20000
    [Glas] => 20000
    [8] => 20000
    [Titan] => 20000
    [9] => 20000
    [Oel] => 20000
    [10] => 20000
    [Nahrung] => 20000
)

	Marktstand letzte Woche

Array
(
    [0] => 30000
    [Holz] => 30000
    [1] => 20000
    [Eisen] => 20000
    [2] => 20000
    [Stahl] => 20000
    [3] => 20000
    [Wasser] => 20000
    [4] => 20000
    [Beton] => 20000
    [5] => 20000
    [Sand] => 20000
    [6] => 20000
    [Glas] => 20000
    [7] => 20000
    [Titan] => 20000
    [8] => 20000
    [Oel] => 20000
    [9] => 20000
    [Nahrung] => 20000
)

Alter Quotient

Array
(
    [0] => 100
    [Holz] => 100
    [1] => 100
    [Eisen] => 100
    [2] => 100
    [Stahl] => 100
    [3] => 100
    [Wasser] => 100
    [4] => 100
    [Beton] => 100
    [5] => 100
    [Sand] => 100
    [6] => 100
    [Glas] => 100
    [7] => 100
    [Titan] => 100
    [8] => 100
    [Oel] => 100
    [9] => 100
    [Nahrung] => 100
)

	Neuer Quotient

Array
(
    [Holz] => -5070
    [Eisen] => 70.252454417952
    [Stahl] => 100
    [Beton] => 491.00981767181
    [Wasser] => 100
    [Sand] => 100
    [Titan] => 100
    [Glas] => 100
    [Oel] => 100
    [Nahrung] => 100
)

Alter Preis

Array
(
    [0] => 10
    [Holz] => 10
    [1] => 10
    [Eisen] => 10
    [2] => 10
    [Stahl] => 10
    [3] => 10
    [Wasser] => 10
    [4] => 10
    [Beton] => 10
    [5] => 10
    [Sand] => 10
    [6] => 10
    [Glas] => 10
    [7] => 10
    [Titan] => 10
    [8] => 10
    [Oel] => 10
    [9] => 10
    [Nahrung] => 10
)

	Neuer Preis

Array
(
    [Holz] => 10.7
    [Eisen] => 8.9487377279102
    [Stahl] => 10
    [Beton] => 6.844950911641
    [Wasser] => 10
    [Sand] => 10
    [Titan] => 10
    [Glas] => 10
    [Oel] => 10
    [Nahrung] => 10
)

Man sieht ganz klar - das System funktioniert recht gut. Der Preis sinkt und steigt.

In diesem Beispiel habe ich allerdings nichts gekauft, der Lagerstand ist lediglich verändert worden.

Kaufe ich nun 2000 Tonnen Holz, dann kommt folgendes raus

Code:
DEBUG-Ausgabe:
Alter Richtwert

Array
(
    [0] => 70
    [Holz] => 70
    [1] => 70
    [Eisen] => 70
    [2] => 70
    [Stahl] => 70
    [3] => 70
    [Wasser] => 70
    [4] => 70
    [Beton] => 70
    [5] => 70
    [Sand] => 70
    [6] => 70
    [Glas] => 70
    [7] => 70
    [Titan] => 70
    [8] => 70
    [Oel] => 70
    [9] => 70
    [Nahrung] => 70
)

	Neuer Richtwert

Array
(
    [Holz] => 41.25
    [Eisen] => 105.12622720898
    [Stahl] => 70
    [Beton] => 315.5049088359
    [Wasser] => 70
    [Sand] => 70
    [Titan] => 70
    [Glas] => 70
    [Oel] => 70
    [Nahrung] => 70
)

Marktstand aktuell

Array
(
    [0] => 3
    [id] => 3
    [1] => 25000
    [Holz] => 25000
    [2] => 30000
    [Eisen] => 30000
    [3] => 20000
    [Stahl] => 20000
    [4] => 20000
    [Wasser] => 20000
    [5] => 60000
    [Beton] => 60000
    [6] => 20000
    [Sand] => 20000
    [7] => 20000
    [Glas] => 20000
    [8] => 20000
    [Titan] => 20000
    [9] => 20000
    [Oel] => 20000
    [10] => 20000
    [Nahrung] => 20000
)

	Marktstand letzte Woche

Array
(
    [0] => 30000
    [Holz] => 30000
    [1] => 20000
    [Eisen] => 20000
    [2] => 20000
    [Stahl] => 20000
    [3] => 20000
    [Wasser] => 20000
    [4] => 20000
    [Beton] => 20000
    [5] => 20000
    [Sand] => 20000
    [6] => 20000
    [Glas] => 20000
    [7] => 20000
    [Titan] => 20000
    [8] => 20000
    [Oel] => 20000
    [9] => 20000
    [Nahrung] => 20000
)

Alter Quotient

Array
(
    [0] => 100
    [Holz] => 100
    [1] => 100
    [Eisen] => 100
    [2] => 100
    [Stahl] => 100
    [3] => 100
    [Wasser] => 100
    [4] => 100
    [Beton] => 100
    [5] => 100
    [Sand] => 100
    [6] => 100
    [Glas] => 100
    [7] => 100
    [Titan] => 100
    [8] => 100
    [Oel] => 100
    [9] => 100
    [Nahrung] => 100
)

	Neuer Quotient

Array
(
    [Holz] => -57.5
    [Eisen] => 70.252454417952
    [Stahl] => 100
    [Beton] => 491.00981767181
    [Wasser] => 100
    [Sand] => 100
    [Titan] => 100
    [Glas] => 100
    [Oel] => 100
    [Nahrung] => 100
)

Alter Preis

Array
(
    [0] => 10
    [Holz] => 10
    [1] => 10
    [Eisen] => 10
    [2] => 10
    [Stahl] => 10
    [3] => 10
    [Wasser] => 10
    [4] => 10
    [Beton] => 10
    [5] => 10
    [Sand] => 10
    [6] => 10
    [Glas] => 10
    [7] => 10
    [Titan] => 10
    [8] => 10
    [Oel] => 10
    [9] => 10
    [Nahrung] => 10
)

	Neuer Preis

Array
(
    [Holz] => 10.7
    [Eisen] => 8.9487377279102
    [Stahl] => 10
    [Beton] => 6.844950911641
    [Wasser] => 10
    [Sand] => 10
    [Titan] => 10
    [Glas] => 10
    [Oel] => 10
    [Nahrung] => 10
)
Wer damit ein wenig spielen will kann gerne nen SQL Dump bekommen.
__________________
Vive la France! Welcome to Sarkoworld...

Geändert von ljungi (17.12.2006 um 14:39 Uhr).
ljungi ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.12.2006, 14:58   Nach oben    #5
WarrenFaith
Mensch
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.793
Standard

schau ich mir heute abend an. ich muss jetzt erstmal kaffee trinken und abendbrot essen bei verwandten da nehm ich wieder 3 kilo zu ey
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.12.2006, 15:01   Nach oben    #6
ljungi
Blubb... öfz
 
Benutzerbild von ljungi
 
Registriert seit: 16.03.2006
Ort: Berlin
Beiträge: 419
Standard

Danke.

Dann noch folgendes Phänomen, dem ich gerade auf der Spur bin...

Kaufe ich 2000 Tonnen ein, so wird der Preis mäßig geändert.
Kaufe ich nur 10 Tonnen ein, dann bricht der Preis drastisch ein - geht ins Negative.


Und.. Mahlzeit - iss gleich für die ganze Woche, das spart Zeit und Geld
__________________
Vive la France! Welcome to Sarkoworld...
ljungi ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.12.2006, 22:10   Nach oben    #7
WarrenFaith
Mensch
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.793
Standard

Ich find das mit deinem Richtwert und Quotienten echt wirre. Schreib mal dein Skript um so dass es ohne deine klassen funktioniert und schick mir nen dump (mailaddy haste per PN), ansonsten würde ich dir empfehlen, alles rauszunehmen und eine schleife nach der anderen einzeln zu begutachten ob sie das liefert was du verlangst.

ich denke aber mit der von mir oben genannten methode gehts um einiges leichter
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Suche Hilfe für eine Portalseite bl-25 PHP-Programmierung 36 29.05.2007 15:57


Alle Zeitangaben in WEZ +2. Es ist jetzt 08:33 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.7.2, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.0.0) und vBSEO.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44