G
GioJay
Gast
Hallo, kann mir einer von euch helfen, und mir die Methode umschreiben, nicht das ganze Programm. Ob dies funktoniert, kann ich dann selber prüfen. Einfach nur die Befehle umtauschen oder so. Habe leider nicht soviel Ahnung von Java, kann zwar alles nachvollziehen aber komme selbst nicht drauf wieso man so was macht. Den Quellcode stelle ich hier rein. Es muss nur der Teil umgeleitet werden ab der @sheduledMethod bis Ende Alternative 2.
Danke:
Danke:
Java:
package scm;
import java.util.HashMap;
import repast.simphony.engine.schedule.ScheduledMethod;
import repast.simphony.essentials.RepastEssentials;
import repast.simphony.parameter.Parameter;
public class Actor {
int eigenerCounter = 0;
private int lagerbestand;
private HashMap<Double, Integer> kundenbestellungen = new HashMap<Double, Integer>();
private int meineBestellung = 0;
private int lieferzeit;
private String name;
private int offeneBestellungen = 0;
private int restBestellung = 0;
private Actor meinLieferant;
private Actor meinKunde;
/**
* Erzeugt einen Akteur im System
*
* @param meinLieferant
* der Zulieferer dieses Akteurs
*/
public Actor(String name, Actor meinLieferant, int lieferzeit,
int lagerbestand) {
this.meinLieferant = meinLieferant;
this.name = name;
this.lieferzeit = lieferzeit;
this.lagerbestand = lagerbestand;
// um das System von Anfang an in einem Gleichgewichtszustand zu starten
this.offeneBestellungen = 80;
this.kundenbestellungen.put(1d, 20);
this.kundenbestellungen.put(2d, 20);
this.kundenbestellungen.put(3d, 20);
this.kundenbestellungen.put(4d, 20);
this.kundenbestellungen.put(5d, 20);
}
/**
* Diese Methode wird in jedem Simulationsschritt bei jedem Agenten
* aufgerufen. Sie muss ueberpruefen, ob in diesem Schritt an den Kunden
* geliefert werden muss oder nicht. Falls ja, wird die Bestellung (wenn
* moeglich) ausgefuehrt. Zusaetzlich muss noch ueberprueft werden, ob
* selbst wieder beim Lieferanten nachbestellt werden muss.
*
* Diese Methode muss fertig implementiert werden!
*/
@ScheduledMethod(start = 1, interval = 1, shuffle = false)
public void step() {
// Bestellungen
if (this.meinKunde != null) { // Agent ist kein Endkunde --> Endkunde muss nichts Liefern
if(this.meinLieferant == null) this.lagerbestand = Integer.MAX_VALUE; // Lagerbestand des Produzenten ist immer der höchstmögliche Wert, damit er immer ALLES liefern kann.
// Ausliefern
int auszulieferndes = this.kundenbestellungen.get(RepastEssentials.GetTickCount()+1); // Immer das von einem Tick später ausliefern, da jeder Agent die neue Bestellung erst einen Tick später registrieren kann --> "Verkürzung der Lieferzeit"
if(auszulieferndes > 0){
this.meinKunde.fuelleLager(this.kundenbestellungen.get(RepastEssentials.GetTickCount()+1));
}
// Losschicken
int gesamtBestellungKunde = this.meinKunde.meineBestellung + this.meinKunde.restBestellung;
if(gesamtBestellungKunde <= this.lagerbestand){ // Falls alles geliefert werden kann...
this.neueBestellung(gesamtBestellungKunde);
this.meinKunde.offeneBestellungen += (gesamtBestellungKunde);
if(this.meinLieferant != null) this.lagerbestand -= gesamtBestellungKunde; // Lagerbestand nur verändern wenn es kein Produzent ist
this.meinKunde.restBestellung = 0;
} else { // Falls nicht...
this.neueBestellung(this.lagerbestand);
this.meinKunde.offeneBestellungen += this.lagerbestand;
this.meinKunde.restBestellung = gesamtBestellungKunde - this.lagerbestand;
if(this.meinLieferant != null) this.lagerbestand = 0; // Lagerbestand nur null setzen wenn es kein Produzent ist
}
// Errechnen der Prognose für die Nachbestellung
int differenz = 5*this.meinKunde.getMeineBestellung() - this.offeneBestellungen - this.lagerbestand;
if(differenz > 0) {
// Nachbestellen --> Produzent bestellt nie nach
if(this.meinLieferant != null) this.meineBestellung = differenz;
}
this.meinKunde.meineBestellung = 0; // Bestellung erfüllt --> Alles was übrig ist, steht jetzt in der restBestellung beim Kunden
} else {
// ----------- BASIS ---------------------------//
// Konstante Bestellung von 20
// this.meineBestellung = 20;
// ----------- BASIS END -----------------------//
// ----------- ALTERNATIVE 1 -------------------//
// Alle 100 Ticks eine Bestellung von 40 ansonsten immer 20
// %99, weil die Bestellung schon einen Tick vorher erhöht werden muss, damit sie
// rechtzeitig registriert wird.
if(((RepastEssentials.GetTickCount()) % 100) == 99) this.meineBestellung = 40;
else this.meineBestellung = 20;
// ----------- ALTERNATIVE 1 END----------------//
// ----------- ALTERNATIVE 2 -------------------//
// Nachfrage zwischen 15 und 25 gleichverteilt
// this.meineBestellung = (int) ((Math.random() * 10) + 15);
// ----------- ALTERNATIVE 2 END----------------//
}
}
/**
* Mit dieser Methode wird der Lagerbestand erhöht, z.B. durch eine Lieferung.
*
* @param menge
* die zu liefernde Menge
*/
public void fuelleLager(int menge) {
if (this.meinKunde != null) {
// beim Endkunden kein Lagerbestand
this.lagerbestand += menge;
this.offeneBestellungen -= menge;
}
}
/**
* Nimmt eine Bestellung des Kunden entgegen. Diese Bestellung wird um die
* Bestellverzoegerung verspaetet an den Kunden wieder ausgeliefert.
*
* @param menge
* die zu bestellende Menge
*/
public void neueBestellung(int menge) {
Double currentTime = RepastEssentials.GetTickCount();
this.kundenbestellungen.put(currentTime + (this.lieferzeit),
menge);
}
// ab hier nur getter und setter Methoden
@Parameter(displayName = "name", usageName = "name")
public String toString() {
return this.name;
}
public void setMeinKunde(Actor meinKunde) {
this.meinKunde = meinKunde;
}
@Parameter(displayName = "Lagerbestand", usageName = "lagerbestand")
public double getLagerbestand() {
if (this.meinLieferant != null) {
return this.lagerbestand;
} else {
return 100;
}
}
public void setLagerbestand(int lagerbestand) {
this.lagerbestand = lagerbestand;
}
@Parameter(displayName = "meine Bestellungen", usageName = "bestellungen")
public int getMeineBestellung() {
return meineBestellung;
}
public void setMeineBestellung(int meineBestellung) {
this.meineBestellung = meineBestellung;
}
}
Zuletzt bearbeitet von einem Moderator: