# Umformulierung der Befehle.



## GioJay (13. Jan 2011)

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:


```
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;
	}

}
```


----------



## Andi_CH (13. Jan 2011)

Bitte setzte 
	
	
	
	





```
Tags ein!
```


----------



## maki (13. Jan 2011)

.. und wähle das richtige Unterforum.

*verschoben*


----------



## GioJay (13. Jan 2011)

Andi_CH hat gesagt.:


> Bitte setzte
> 
> 
> 
> ...


----------



## SlaterB (13. Jan 2011)

[ JAVA ], steht auch bei Eingaben in roter Schrift drüber 
das richtigere Forum ist dann wohl das wo das Theme jetzt ist

------

'Code umleiten' gibts nicht wirklich, was ist deine Frage? was soll passieren?

----

edit: 
bitte keine Doppelpostings wie um 14:51 nochmal im Codeschnipsel-Bereich


----------



## GioJay (13. Jan 2011)

Na man kann bestimmt die Methode anders beschreiben, sprich umschreiben oder anders definieren. Inhaltlich soll sie dann aber das gleiche ausgeben, wie im oberen beispiel. Ich muss diese Methode zwei mal abgeben für zwei unterschiedliche Gruppen, damit diese bearbeiten können. Die erste habe ich fertig, welche oben steht. Die andere muss ich in 5 Stunden abgeben, keine Ahnung ob ich das schaffen werde. Diese dort oben hat mich schon viel Zeit und Hilfe gekostet.

Würde mich freuen, wenn ihr mir weiterhelfen könntet.

LG Gio


----------



## SlaterB (13. Jan 2011)

ehrlich, aber auch wenig aussichtsreich,
weiterverschoben nach Hausaufgaben


----------



## Andi_CH (13. Jan 2011)

und warum soll die "umgeleitet" - äh - umgeschrieben werden?


----------



## SlaterB (13. Jan 2011)

Posting von 15:15 gelesen?


----------



## Andi_CH (13. Jan 2011)

Ja, aber nicht bis zum Schluss - Mea culpa


----------

