Maturaarbeit Vorgelegt durch: Samuel P. Plachel Vorgelegt bei: R. Zellweger / H.R. Schneider Datum: 14. Februar 2003 Informatik Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel Inhaltsverzeichnis 1. Vorwort [3] 1.1 Einleitung 3 1.2 Schlüsselfragen 3 2. Zielsetzung [4] 2.1 Allgemeine Beschreibung 4 2.2 Simulationen 4 2.3 Modelle [4] 2.3.1 Umweltsphären 4 2.3.2 Nachfrage und Angebot 5 3. Programmierung 7 3.1 Klassenmodell 7 3.1.1 Die Klasse OekoSim 8 3.1.2 Die Klasse CManagement 10 3.1.3 Die Klasse CProdukte 12 3.1.4 Die Klasse CSimulation 13 3.1.5 Die Klasse CKonjunktur 15 3.1.6 Die Klasse COberflaeche 17 3.1.7 Die Klasse CFaktor 20 3.1.8 Die Klasse CFSimulation 21 4. Anleitung zum Applet 23 4.1 Mitarbeiter 24 4.2 Produkte 25 4.3 Lieferanten 26 4.4 Marketing 26 4.5 Wirtschaft 26 4.6 Soziales 26 4.7 Kapitalgeber 27 4.8 Finanzen 27 4.9 Allgemeine Hinweise 28 5. Schluss 29 Seite 2 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet 1. Vorwort 1.1 Einleitung „Täglich treffen wir alle viele Entscheidungen, welche wirtschaftliche Belange betreffen. Hinter jedem hergestellten Gut steht eine Vielzahl ökonomischer Überlegungen und auch der Kauf eines Gutes ist das Endresultat einer Kette mehrerer Entscheidungen. Da die Wirtschaftswissenschaften nicht in der Lage sind, die Art und Weise der Entscheidungen, die Präferenzen (Vorlieben) und Gewohnheiten der Individuen, Produktionsverfahren und –kosten jedes einzelnen Unternehmens zu erfahren, versuchen sie, Gesetzmässigkeiten wirtschaftlicher Entscheidungen herauszufinden. Schliesslich wäre es unmöglich, Millionen von Konsumentinnen und Konsumenten zu befragen und Tausende von Unternehmen zu untersuchen. (...) In der Mikroökonomie steht jeweils ein einzelnes Individuum oder eine einzelne Unternehmung im Zentrum der Analyse. Damit wird folgender Zweck verfolgt: Hat man genaue Vorstellungen über die Prinzipien der Kaufentscheidungen oder der Preisbildung gewonnen, können Rückschlüsse gemacht werden, welche die Untersuchung ganzer Märkte oder gar gesamtwirtschaftlicher Prozesse ermöglicht.“ 1 Dieser Ausschnitt aus dem Lehrbuch „Wirtschaft und Recht“ erläutert den Begriff der sogenannten „Mikroökonomie“ – die Studie von wirtschaftlichen Vorgängen, die in einer einzelnen Unternehmung ablaufen. 1.2 Schlüsselfragen Diese Definition lässt einen klaren Schluss zu: Die Wirtschaftswissenschaft – und somit jegliche Software, die diese simulieren soll – ist auf Modellen aufgebaut und als solche immer nur eine Vereinfachung der Wirklichkeit, niemals die Wirklichkeit selber. Denn die Realität ist zu komplex, als dass sie von einem Programm, dass auf mathematischen Gesetzen beruht – deren Richtigkeit sich darüber hinaus nicht beweisen lässt – genau abgebildet werden kann. Welche Modelle sollen also verwendet werden, um die Wirklichkeit möglichst gut – wenn auch niemals perfekt – abbilden zu können? Wie können diese im Allgemeinen in JAVA umgesetzt werden? Und wie sind im speziellen die Klassendefinitionen in JAVA zu wählen, um dies zu erreichen? Welche Algorithmen sind nötig, um mathematische Gesetze für das Wirken ökonomischer Vorgänge in einer Unternehmung entwickeln zu können? Welche Einflüsse aus Umwelt und Gesellschaft wirken auf eine Unternehmung? Und wie soll zum Schluss eine übersichtliche Darstellung all dieser Vorgänge erreicht werden? Seite 3 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel 2. Zielsetzungen 2.1 Allgemeine Beschreibung Erklärtes Ziel der vorliegenden Software ist es, die Vorgänge, die innerhalb einer Unternehmung ablaufen, zu simulieren. Wie teuer muss ein Produkt verkauft werden, damit der Preis einerseits genügend hoch ist, um die Kosten zu decken und einen angemessenen Gewinn zu ermöglichen und andererseits so tief ist, dass sich genügend Käufer für das Gut finden? Welche Höhe müssen die Löhne haben, um die Kosten tief zu halten und gleichzeitig den Bedürfnissen der Mitarbeiter entgegenzukommen? Welche Investitionen sind zu tätigen um Produkte zu verbessern und neue zu entwickeln? Welche Folgen hat die welt- oder landesweite Wirtschaftsentwicklung für eine Unternehmung? Wie wirkt sich die Beschaffung von Fremdkapital auf die Unternehmung aus? Diese und viele weitere Fragen soll eine mikroökonomische Simulation beantworten. Der Benutzer soll die Möglichkeit erhalten, mit den verschiedenen Faktoren wie Löhne oder hergestellte Menge von Gütern zu experimentieren um das Zusammenspiel derselben beobachten zu können. 2.2 Simulationen Wie schon einleitend unter 1.2 erwähnt, liefert eine Simulation lediglich eine annähernde Beschreibung der Wirklichkeit. Eine Software zeichnet sich dadurch aus, wie nahe sie an die Realität herankommt. Um eine Simulation zu entwickeln, die ein brauchbares Abbild von wirtschaftlichen Vorgängen liefert, gilt es, nach geeigneten Modellen zu suchen. Da ich mich ausser Stand sehe, solche eigens zu entwerfen, werde ich mich im Folgenden auf die Modelle der Schulmeinung (ich beziehe mich hierbei auf die Ausführungen in „Wirtschaft und Recht Grundlagen“ 2) stützen. 2.3 Modelle 2.3.1 Umweltsphären In früheren Zeiten war die Gewinnmaximierung und die dauernde Erhaltung der Unternehmung meist das oberste Ziel der unternehmerischen Tätigkeit. Andere Aspekte, wie z.B. die Bedürfnisse der Mitarbeiterinnen und Mitarbeiter, wurden nur soweit berücksichtigt als es für die Gewinnsteigerung von Nutzen war. Kaum jemand sprach damals von Umweltproblemen und der Vernetzung der Unternehmung mit ihrem Umfeld. Im Laufe der Zeit haben aber die sogenannten Anspruchsgruppen der Unternehmungen mehr Einfluss gewonnen. Somit muss eine moderne Unternehmung um hohe Löhne für die Mitarbeiter bemüht sein, Lieferanten pünktlich zahlen, Eigenkapitalgebern eine Wertsteigerung Seite 4 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel der Anteile garantieren können und Fremdkapitalgebern hohe Zinsen zahlen. Der Staat verlangt von ihr zukunftsorientierte Arbeitsplätze, die Konkurrenz einen fairen Wettbewerb und nicht zuletzt wollen die Kunden innovative Produkte von hoher Qualität zu günstigen Preisen. Nur so kann das Überleben einer Unternehmung über längere Zeit hinweg gesichert werden. Dieser Aspekt ist für eine Simulation einer modernen Unternehmung sehr wichtig – denn mit reiner Gewinnmaximierung kommt man heute nicht mehr weit – und das soll auch in der Simulation so sein. Abbildung 2.1 – Umweltsphären Ökonomische Umweltsphäre Technologische Umweltsphäre Unternehmung Ökologische Umweltsphäre Soziale Umweltsphäre Rechtliche Umweltsphäre 2.3.2 Nachfrage und Angebot Jeder Mensch strebt nach der Erfüllung seiner individuellen Bedürfnisse und Ziele wie materielle Grundbedürfnisse, aber auch die persönliche Entfaltung. Die Befriedigung von solchen Zielen nennt man in der Ökonomie Nutzen. Man geht des Weiteren davon aus, dass ein Individuum danach strebt, möglichst viele Bedürfnisse möglichst gut zu befriedigen. Der deutsche Ökonom Gossen formulierte hierzu zwei Gesetze. Das erste besagt, dass „mit zunehmendem Konsum eines Gutes der zusätzliche Nutzen immer geringer wird“. Das bedeute also: Wenn eine Person ein Auto (= Gut) kauft, hat dieses Fahrzeug einen sehr grossen Nutzen für die Person. Kauft sie noch ein zweites Auto, so hat dieses mit grösster Wahrscheinlichkeit einen weniger grossen zusätzlichen Nutzen als das erste. Ein drittes würde der Person noch weniger zusätzlichen Nutzen stiften als das zweite etc. Das zweite Gossen’sche Gesetz besagt, dass „ein Individuum im Optimum von jedem Gut so viel konsumiert, dass die jeweils zuletzt konsumierten Einheiten der verschiedenen Güter alle den gleichen Grenznutzen haben“. Etwas weniger ökonomisch ausgedrückt heisst das – um auf das Beispiel mit dem Fahrzeugkauf zurückzukommen: Wenn eine Person bereits ein Auto Seite 5 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel besitzt, hat beispielsweise ein Computer einen grösseren Nutzen für sie als ein zweites Auto. Denn der Computer befriedigt Bedürfnisse – zum Beispiel E-Mails versenden – die ein Auto nicht befriedigen kann. Überträgt man diese Theorien auf die Preispolitik einer Unternehmung, so erhält man die wohlbekannte Regel: Je billiger man ein Produkt anbietet, desto mehr davon wird gekauft. Denn da der zusätzliche Nutzen immer kleiner wird, ist ein Kunde auch immer weniger bereit, Geld dafür auszugeben. Mit dem „letzten“ Franken kauft er sich lieber ein anderes Gut, das ihm einen höheren Nutzen stiftet. Genau umgekehrt verhält es sich mit den Interessen der Unternehmung, also des Anbieters: Während der Käufer bei hohen Preisen nicht bereit ist, eine grosse Menge eines Gutes zu erstehen, sondern tiefe Preise ihn zum Kauf motivieren, möchte der Anbieter gerne grosse Mengen zu hohen Preisen verkaufen. Bei tiefen Preisen ist er nicht bereit, viel zu produzieren. Stellt man Angebot und Nachfrage graphisch dar (Abbildung 2.2), so erhält man einen Punkt, in dem sich Angebots- und Nachfragekurve schneiden. Diese Stelle wird als „Gleichgewichtspreis“ bezeichnet. Wie der Name schon sagt, halten sich an dieser Stelle Angebot und Nachfrage die Waage. Dies bedeutet also, dass bei genau diesem Preis alle hergestellten Güter verkauft werden können. Oder anders gesagt: In diesem Schnittpunkt der Angebots- und Nachfragekurve befindet sich die „gewinnmaximierende Menge“. Also genau die Menge, bei der der Gewinn maximal sein wird – denn es werden alle Güter zu einem „Gleichgewichtspreis“ verkauft. So einleuchtend das klingt, so schwierig ist die Frage, welche Massnahmen man als Manager der Unternehmung – also als Benutzer der Software – ergreifen kann oder darf, um den Preis, bei dem alle Güter verkauft werden, zu finden. Denn wenn der Preis zu tief ist, herrscht ein sogenannter Nachfrageüberschuss, es wird also mehr nachgefragt, als effektiv vorhanden ist. Ist der Preis dagegen zu hoch, ist ein Angebotsüberschuss vorhanden, also können nicht alle hergestellten Güter an die Konsumenten verkauft werden. Und natürlich ist nicht der Preis allein massgebend, sondern ebenso die Menge – denn ein Produkt kann beliebig billig sein, wenn zu viel davon vorhanden ist, wird nicht die ganze hergestellte Menge verkauft. Ausserdem ist, wie schon unter 2.3.1 erwähnt, darauf zu achten, dass der tiefe Preis nicht etwa auf Kosten der Mitarbeiter geht – selbst wenn man ein Produkt sehr billig immer noch gewinnbringend verkaufen könnte – denn reine Gewinnmaximierung soll sich nicht auszahlen. Seite 6 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel Abbildung 2.2 – Angebot und Nachfrage Preis Gleichgewichtspreis Gleich Angebot Nachfrage Menge 3. Programmierung Nach den einführenden Erläuterungen über ökonomische Modelle und die Ziele dieser Simulation möchte ich nun daran gehen, deren konkrete Umsetzung in ein JAVA-Applet zu beschreiben. Um es gleich vorweg zu nehmen: Der Weg vom Modell zur Simulation lässt sich von der Seite der Programmierung her nur schwer beschreiben. Daher beschränkt sich dieses Kapital auf das rein Technische, um die Ausführungen nicht unnötig zu komplizieren. Wirtschaftliche Theorien u.ä. werden hier nur insofern behandelt, als dass sie die Programmierung unmittelbar betreffen. Auskunft über die Umsetzung der wirtschaftlichen Modelle und Theorien in ein JAVA-Applet findet sich im Kapital „4. Anleitung zum Applet“. 3.1 Klassenmodell JAVA verlangt als objektorientierte Sprache vom Programmierer ein gut durchdachtes Klassenmodell und je geschickter dieses aufgebaut ist, desto mehr gibt JAVA dem Autor zurück. Dies in Form von – gegenüber nicht objektorientierten Programmiersprachen - ganz neuen Möglichkeiten, die sich durch OOP („Objektorientierte Programmierung“) ergeben. Die Aufgabe dieses Kapitels ist es, den Aufbau dieses Klassenmodells zu erläutern und auf die einzelnen Klassen einzugehen. Zunächst verlangt eine gute Planung des Klassenmodells insbesondere nach der Überlegung, welche Austauschmöglichkeiten – in Form von Variabeln, auf die mehrere Klassen zugreifen können - zwischen den einzelnen Klassen nötig sind. Da es in JAVA sowohl Klassenvariabeln als auch lokale Variabeln gibt, ist es hier jeweils wichtig, sich darüber Gedanken zu machen, Seite 7 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel auf welche Variabeln andere Klassen zugreifen können müssen und auf welche nicht. Denn während die eine Klasse Zugriff auf Klassenvariabeln einer anderen Klasse hat, verschwinden z.B. lokale Variabeln, die innerhalb einer Methode erzeugt werden, nach dem Ablaufen derselben einfach wieder. Ebenfalls wichtig ist natürlich, in welcher Klasse bzw. Instanz derselben eine oder mehrere Instanz(en) einer anderen Klasse erzeugt werden soll(en). So ergibt sich ein Modell von Abhängigkeiten, das schliesslich den Programmfluss bestimmt. Genau diese Überlegungen werden in den folgenden Kapiteln erläutert. Ausserdem wurde zu jeder Klasse ein besonders wichtiger Codeausschnitte ausgewählt und erläutert. Abbildung 3.1 „Klassenmodell“ OekoSim CManagement CManagement CProdukte CSimulation CFSimulation CKonjunktur CObefläche CF… extends frame WindowListener CFaktor MouseListener ButtonListener 3.1.1 Die Klasse OekoSim Wie der Name schon erraten lässt, ist diese Klasse das „Herz“ des Applets und als solches direkt von der JAVA-Klasse „Applet“ abgeleitet. OekoSim instanziiert die Klassen CManagement, CSimulation, COberflaeche und CKonjunktur je einmal. Ausserdem werden mehrere Instanzen der Klasse CFaktor angelegt. Von ihr erzeugt werden ausserdem die sechs wichtigsten Variablen zur Steuerung des Programmflusses: die Integers Runde, Quartal und Jahr; die Booleans neuZeichnen, simStart und simGraph. Erstere sind blosse Zählvariablen, die allerdings in Routinen anderer Klassen wichtige Aufgaben übernehmen. neuZeichnen erhält als Wert entweder true oder false und gibt so über repaint() den Befehl, neu zu zeichnen. simStart (ebenfalls true oder false) ist dafür verantwortlich, die eigentliche Simulation in Gang zu setzen. Der Boolean simGraph startet eine graphische Darstellung des Simulationsablaufs, falls er den Wert true hat. Seite 8 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel Nebst diesen Steuerelementen besitzt OekoSim in ihrer Methode paint() Routinen zum Zeichnen der Oberfläche, die sich vorderhand aus dem Anzeigen einer Hintergrundgraphik und der Darstellung der wichtigsten Daten zusammensetzen. Ausserdem besitzt paint() einen Algorithmus für die Simulation des Zusammenwirkens der einzelnen Faktoren. Allerdings setzt sich dieser hauptsächlich aus Methoden der Klasse CSimulation zusammen, die unter 3.1.4 noch erläutert werden. Codeauszug 3.1: Steuerung des Simulationsablaufes if(simStart == true) { int i = 1; Unternehmung.entwicklungsKosten = 0; while(i <= 3) { Simulation.mitarbeiter(g); Simulation.investitionen(g); Simulation.forschung(g); Simulation.lieferanten(g); Simulation.produkte(g); Unternehmung.entwicklungsKosten += Simulation.kostenProdukte; i++; } Simulation.verkauf(g); Simulation.kredit(g); Simulation.quartalabschluss(); Simulation.kredit2(g); Simulation.steuern(g); Simulation.soziales(g); Unternehmung.entwicklungsKosten /= 3; if(simGraph == true) { CFSimulation fenster = new CFSimulation(); fenster.pack(); fenster.setSize(700,410); fenster.setResizable(false); fenster.show(); } if(simGraph == false) { anzMA.simInitProdVerk(); anzMA.simInitEmulieren(); anzMA.simReset(); } } Abhängig davon, ob der Boolean simStart den Wert true hat, wird der Simulationsablauf gestartet. simStart erhält seinen Wert in der Unterklasse CFinanzen der Klasse COberflaeche zugewiesen. Nacheinander werden in einer dreifachen while-Schleife Methoden der Klasse CSimulation abgearbeitet. Diese berechnen die neuen Werte in den Bereichen „Lieferanten“, „Mitarbeiter“, „Produktion“, „Marketing“ und „Investitionen“ (siehe auch Abbildung 3.1 unten). Da diese Werte pro Monat berechnet werden, die Simulation sich jedoch immer auf ein Seite 9 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel Quartal bezieht (= 3 Monate), wird dazu eine dreifache while-Schleife benutzt. Ausserdem wird die Variabel entwicklungsKosten der Klasse CManagement vor dieser Schleife auf 0 gesetzt, in der Schleife dreimal aktualisiert und nach der Schleife durch 3 geteilt um wieder einen ProMonat-Wert zu erhalten. Diese Variabel spielt jedoch für die eigentliche Simulation keine Rolle, sie dient später der graphischen Darstellung derselben. Nach der dreifachen Schleife werden noch mehrere Routinen der Klasse CSimulation abgearbeitet, welche neue Werte für „Wirtschaft“, „Soziales“ und „Kapitalgeber“ berechnen und den Quartalsabschluss vornehmen, also neue Werte für „Finanzen“ errechnen. Diese werden also nur einmal pro Quartal ausgeführt. Falls dem Boolean simGraph der Wert true übergeben wurde, wird die Klasse CFSimulation instanziiert und somit die graphische Darstellung des Simulationsablaufes gestartet. Falls simGraph false ist, wird keine Instanz von CFSimulation gebildet. Stattdessen werden Methoden der Klasse CFaktor abgearbeitet, welche die Werte der Instanzen von CFaktor so aktualisieren, dass eine korrekte graphische Darstellung der Simulation in der nächsten Runde gegebenenfalls möglich sein wird. Abbildung 3.1 „Oberfläche“ 3.1.2 Die Klasse CManagement Hinter diesem etwas abstrakten Namen verbirgt sich eine ebenfalls recht abstrakte Klasse: CManagement stellt nämlich die zu führende Unternehmung als Ganzes dar. Daher wird sie nur Seite 10 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel einmal instanziiert (in OekoSim) und ihre wichtigste Aufgabe ist die Verwaltung bzw. Erzeugung von Variabeln. Kurz gesagt enthält ihre Instanz sämtliche Variabeln, auf die der Benutzer Einfluss nehmen kann, also etwa die Anzahl Mitarbeiter, die Höhe der (Neu)investitionen, bestellte Waren und deren Preis oder davon abhängig Werte wie etwa Umsatz und Gewinn/Verlust. Des Weiteren enthält sie Methoden zur Ausgabe dieser Daten. Diese Methoden werden in OekoSim aufgerufen und stellen wie gesagt einen Teil der Oberfläche dar. Nebst diesen besitzt sie Methoden, die die wichtigsten Operationen an den genannten Daten vornehmen – also etwa Mitarbeiter einstellen oder Fremdkapital aufnehmen – welche in der Klasse COberfläche aufgerufen werden. Im Konstruktor von CManagement wird nebst dem Zuweisen von Startwerten an die oben genannten Variablen das Anlegen eines Instanzen-Arrays der Klasse CProdukte mit vier Elementen erledigt. Codeauszug 3.2: Daten-Ausgabe für die Produkte void produkteDatenAusgeben(Graphics g) { int i = 1; while(i <= Unternehmung.anzahlProdukte) { if(produkte[i].p_entwickelt == 1) g.drawString(„Produkt“ + i + „: “ + produkte[i].p_produziert + „ à “ + produkte[i].p_preis,540,234+(i-1)*15); if(produkte[i].p_entwickelt == 0) g.drawString(„Produkt “ + i + „: “ + produkte[i].p_entwicklungsFortschritt + „/“ + produkte[i].p_entwicklungsDauer + „ à “ + produkte[i].p_entwicklungsKosten,540,234+(i-1)*15); i++; } } Die Methode produkteDatenAusgeben(Graphics g) wird in der paint()-Methode der Klasse OekoSim aufgerufen und dient dazu, wichtige Kennzahlen der Produktion in das Panel „Produktion“ zu zeichnen (siehe Abbildung 3.1). Sie arbeitet mit einer Schleife, die sich so oft wiederholt, wie es verschiedene Produkte gibt. Der Integer i übernimmt dabei einerseits die Funktion, bis anzahlProdukte zu zählen und andererseits aktiviert er das jeweilige Element des Arrays produkte[]. So werden nacheinander Werte des Arrays produkte[], welches mehrere Seite 11 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel Instanzen der Klasse CProdukte enthält, über die Methode g.drawString(String, int, int) des AWT ausgegeben. Es gibt dabei zwei Möglichkeiten: produkte[i].p_entwickelt hat den Wert 1, d.h. das Produkt produkte[i].p ist entwickelt. In diesem Falle werden die Produktionszahlen ausgegeben: produzierte Anzahl und der Preis pro Stück. produkte[i].p_entwickelt hat den Wert 0. Dies bedeutet, dass das Produkt produkte[i] nicht entwickelt ist. In diesem Falle werden der Entwicklungsfortschritt und die mit der Entwicklung anfallenden Kosten ausgegeben. 3.1.3 Die Klasse CProdukte Wie der Name schon sagt, stellt jede Instanz – oder besser gesagt jedes Element eines Instanzen-Arrays – ein eigenes Produkt dar. Im Gegensatz etwa zu den Mitarbeitern, die aus lediglich zwei Zählvariabeln definiert werden, gestaltet sich die Handhabung von Produkten etwas schwieriger: Jedes Produkte benötigt Variabeln, die über Preis, Produktion, Verkauf und Entwicklung Angaben enthalten. So hat dann der Benutzer die Möglichkeit, zunächst ein Produkt zu entwickeln. Je nach Wunsch wird ein teures Produkt mit hohem Entwicklungsaufwand oder ein billiges, das auch billiger entwickelt werden kann, erzeugt. Nach Abschluss der Entwicklung beginnen dann die Produktion und der Verkauf. All diese Angaben werden in Variabeln des Datentyps CProdukte gespeichert und verwaltet. Codeauszug 3.3: Konstruktor Produkt CProdukte( int preis, int innovation ) { p_preis = preis; p_aktiv = 1; p_entwickelt = 0; p_produziert = 0; p_verkauft = 0; p_innovation = innovation; p_entwicklungsDauer = p_innovation+4; p_entwicklungsKosten = p_innovation*10000; p_entwicklungsFortschritt = 0; p_potential = 0; p_vorrat = 0; } Seite 12 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel Der Konstruktor von CProdukte hat zwei Parameter: preis und innovation. Anhand von diesen beiden übergebenen Werten werden allen Variabeln von CProdukte berechnete Werte übergeben. So erhält das Produkt einen Startpreis, den Entwicklungs- und Produktionsstatus 0, seine aus p_innovation resultierende(n) Entwicklungsdauer und –kosten usw. So entsteht eine Instanz der Klasse CProdukt, die sämtliche Angaben über ein bestimmtes Produkt enthält. CProdukte wird, wie schon erwähnt, von OekoSim instanziiert und zwar in Form eines Arrays. So entsteht für andere Klassen die Möglichkeit, sehr leicht auf jede Variabel von jedem der verschiedenen Produkte zugreifen zu können und diese Werte weiterzuverarbeiten. 3.1.4 Die Klasse CSimulation Die Klasse CSimulation ist eine Klasse, die nur zur Steuerung konzipiert wurde. Sie besitzt als solche lediglich einen Standardkonstruktor und wird nur einmal – von OekoSim – instanziiert. Ihre Integer-Variablen konjProzent, konjProzentNull und konjProzentVorquartal erhalten Werte übergeben, die Konjunkturwerte in Prozent der Klasse CKonjunktur darstellen. konjProzent gibt an, auf wie viel Prozent die landesweite Wirtschaftsentwicklung aktuell steht. konjProzentNull hat den Wert konjProzent minus 100, was der Abweichung von 100% entspricht. konjProzentVorjahr schliesslich enthält den Prozentwert der Konjunktur im vergangenen Quartal. Die Routinen von CSimulation stellen Algorithmen zum Simulieren der Wechselwirkungen von einzelnen Faktoren dar und werden in OekoSim (in Abhängigkeit von deren Variable simStart) aufgerufen. Im Folgenden möchte ich ihre Funktionalität kurz erläutern: void simInitStart() bereitet die Simulation vor void konjUpdate() aktualisiert die Konjunkturwerte void quartalabschluss() schliesst das Quartal ab void steuern() errechnet – abhängig von der Konjunktur – einen Steuersatz und die resultierenden Steuerausgaben void kredit1() und kredit2() berechnen, wie viel Fremdkapital angeboten wird – abhängig vom Eigenkapital - und wie viel Zinsen auf den Krediten erhoben werden void sozales() ermittelt die Motivation der Mitarbeiter void mitarbeiter() berechnet die Personalkosten void investitionen() ermittelt die Gesamthöhe der Investitionen void forschung() berechnet Werbe- und Marktforschungsaufwand void lieferanten() berechnet Ausgaben für Warenbestellungen Seite 13 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel void produkte() ermittelt das Produktionspotential und die effektiv hergestellte Menge – im Zusammenhang mit dem Vorrat an eingekauften Waren, der Anzahl Mitarbeiter/Manager und den Investitionen. void verkauf() berechnet die verkaufte Menge. Der Algorithmus stützt sich auf Werte aus der Weltwirtschaft (Nachfrage: CKonjunktur), Art/Preis des jeweiligen Produkts, Werbung und Marktforschung. Des Weiteren wird der Warenbestand (Vorrat) verwaltet. Dazu ist noch zu sagen, dass konjUpdate(), verkauf(), quartalabschluss(), steuern() und kredit2() einmal pro Quartal ausgeführt werden, die anderen Algorithmen jedoch „monatlich“ (= 3x pro Quartal). Erstere stützen sich auf die resultierenden Werte und werden daher nur einmal pro Quartal ausgeführt. simInitStart() wird ebenfalls nur einmal pro Quartal ausgeführt. Im Gegensatz zu allen anderen Routinen wird sie jedoch nicht von der Paint()-Methode der Klasse OekoSim aufgerufen, sondern in der Unterklasse CFFinanzen der Klasse COberflaeche. Codeauszug 3.4: Algorithmus für Verkauf/Nachfrage void verkauf(Graphics g) { int i = 1; int nachfrage = (int)(100-(Konjunktur.konjunktur [OekoSim.runde*12]100)/10)*Unternehmung.produkte[i].p_innovation*10/(Unternehmu ng.produkte[i].p_preis/50)+((Unternehmung.forschung+Unternehm ung.werbung)/10); while(i <= Unternehmung.anzahlProdukte) { if(Unternehmung.produkte[i].p_entwickelt == 1) { if(nachfrage <= Unternehmung.produkte[i].p_produziert) Unternehmung.produkte[i].p_verkauft += nachfrage; if(nachfrage > Unternehmung.produkte[i].p_produziert) { if(Unternehmung.produkte[i].p_vorrat <= nachfrage Unternehmung.produkte[i].p_produziert) Unternehmung.produkte[i].p_verkauft += Unternehmung.produkte[i].p_produziert + Unternehmung.produkte[i].p_vorrat; if(Unternehmung.produkte[i].p_vorrat > nachfrage Unternehmung.produkte[i].p_produziert) Unternehmung.produkte[i].p_verkauft += nachfrage; } Unternehmung.f_umsatz += Unternehmung.produkte[i].p_verkauft*Unternehmung.pr odukte[i].p_preis; Unternehmung.produkte[i].p_vorrat += (Unternehmung.produkte[i].p_produziert Unternehmung.produkte[i].p_verkauft); } i++; Seite 14 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel } } In der Routine verkauf(Graphics g) wird die Nachfrage berechnet. Hierzu ist zu sagen, dass die Werte in diesem Algorithmus teilweise - anhand von Testreihen - relativ willkürlich gewählt werden mussten. Die Nachfrage nach einem bestimmten Produkt ist zunächst von der Konjunktur abhängig. Je besser die allgemeine Wirtschaftslage, desto mehr wird konsumiert. Da die Konjunktur für jede einzelne Woche simuliert wird, die Nachfrage aber nur einmal pro Quartal, wird das Element OekoSim.runde*12 aus dem Array Konjunktur.konjunktur[] ausgewählt. Nachdem dieser Wert um 100 verkleinert und durch 10 dividiert wurde, wird er von 100 abgezogen. Dies scheint kompliziert, dient aber lediglich dazu, einen Prozentwert zu errechnen, mit dem man einfacher weiterrechnen kann. Mehr über die Errechnung der Konjunkturwerte ist im nächsten Kapital 3.1.5 zu lesen. Dieser Konjunktur-Prozentwert wird nun mit dem Zehnfachen der Innovation des Produktes multipliziert. Die 10 ist willkürlich gewählt und soll den grossen Einfluss der Qualität eines Produktes auf dessen Nachfrage zum Ausdruck bringen. Das Zwischenresultat wird nun durch den fünfzigsten Teil des Preises des Produktes dividiert. Die 50 ist wiederum willkürlich gewählt und soll aufzeigen, wie stark sich Preissenkungen positiv auf die Nachfrage auswirken können. Zum Schluss wird noch ein Zehntel der Summe von den Investitionen in Marktforschung und Werbung zum entstehenden Wert addiert. Auch hier ist die 10 willkürlich gewählt, jedoch lediglich zur Abschwächung der Auswirkungen von diesen Investitionen. Somit entsteht ein Wert, d.h. die Nachfrage, der genau der Anzahl Produkte entspricht, die maximal verkauft werden kann. Die folgenden if-Schleifen werten aus, ob ein Produkt bereits entwickelt ist und berechnen, falls dies der Fall ist, eine Anzahl verkaufter Stück und den daraus resultierenden Vorrat sowie den erzielten Umsatz von jedem Produkt. 3.1.5 Die Klasse CKonjunktur Die Instanz dieser Klasse enthält ein Array, dessen Elemente Werte der Konjunktur zu bestimmten Zeiten darstellen. CKonjunktur enthält einen Algorithmus zur Simulation der Weltwirtschaft. Dieser folgt dem Prinzip „auf einen Abschwung folgt immer ein Aufschwung“ und umgekehrt. Somit wird – vereinfacht gesagt - durch einen „kontrollierten Zufall“ eine ganze Konjunkturkurve berechnet. Die berechneten Werte werden im Array konjunktur[] gespeichert, welches 5000 Elemente enthält, und können so über die Methode konjunkturZeichnen(Graphics g) als Kurve graphisch dargestellt werden. Darüber hinaus wird Seite 15 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel aus dem aktuellen Wert für jedes Quartal eine Angabe in Prozent errechnet, die so in die Errechnung einer Nachfrage (CSimulation) einfliessen kann. Codeauszug 3.5: Konjunktur zeichnen void konjunkturZeichnen(Graphics g) { g.drawString(„Konjunktur:“,10,50); g.drawString(„1. Quartal 2003 bis “ + OekoSim.quartal + „. Quartal “ + OekoSim.jahr,10,65); int i = 1; if(konjunktur[runde*12] > 100) g.setColor(Color.red); while(i <= runde*12) { g.fillOval(10+i,100+konjunktur[i],2,2); i++; } g.setColor(Color.black); g.drawLine(10,300,700,300); g.drawLine(10+i,290,10+i,310); g.drawString(OekoSim.quartal + “. “ + OekoSim.jahr,10+i20,320); g.drawString(„4. 2002“,10,290); } Die Routine konjunkturZeichnen(Graphics g) übernimmt die Aufgabe, die Werte, die vom Konstruktor der Klasse CKonjunktur errechnet wurden, graphisch darzustellen. Zunächst wird links oben eine Information ausgegeben, bis zu welchem Quartal die Konjunkturkurve gezeichnet wurde. Daraufhin wird von einer if-Anweisung überprüft, ob sich der letzte Wert der zu zeichnenden Kurve unter- oder oberhalb der 100%-Grenze befindet. Ist Ersteres der Fall, wird die Zeichenfarbe auf rot gesetzt, andernfalls bleibt sie automatisch auf schwarz. Danach wird eine while-Schleife gestartet, die genau wie ein Funktionsplotter arbeitet: In jedem Durchlauf wird ein Punkt gezeichnet, während jedes Mal der x-Wert um 1 erhöht wird und der y-Wert aus dem Array konjunktur[] ausgelesen wird - wobei der aktuelle x-Wert jeweils das zu wählende Element des Arrays ist. Die Schleife wird so lange ausgeführt, bis für jede bereits vergangene Woche ein Punkt bzw. Wert gezeichnet wurde (runde*12). Seite 16 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel Zu beachten ist noch, dass die y-Werte jeweils vom Konstruktor „umgedreht“ wurden, sodass sie leichter gezeichnet werden können. Dies zieht jedoch mit sich, dass im Algorithmus für die Nachfrage die Werte wiederum korrigiert werden müssen (siehe Kapitel 3.1.4). Abbildung 3.2 „Konjunktur“ 3.1.6 Die Klasse COberflaeche Ebenfalls nicht als eigentlicher Datentyp erkennbar ist die Klasse COberflaeche. Sie besteht zunächst einmal aus verschiedenen Unterklassen, welche von der AWT-Klasse Frame abgeleitet sind. Jede dieser Unterklassen erzeugt ein PopUp-Fenster, welches das Bearbeiten oder Betrachten von Informationen eines bestimmten Faktors ermöglicht. Die Frame-Klassen sind sowohl mit einem WindowListener, der das Schliessen des Fensters ermöglicht, als auch mit verschiedenen ButtonListenern versehen. Diese stellen ein „Event-Handling“ für die im Fenster enthaltenen AWT-Buttons dar und führen Befehle aus, die der Benutzer per Maus-Klick geben kann. Somit kann der Benutzer über Maus-Klicks auf die Oberfläche (siehe Abbildung 3.1) PopUpFenster öffnen und durch deren Buttons Preise von Produkten ändern, die Werbung intensivieren oder einen unfähigen Manager entlassen, um seine Unternehmung zum Erfolg zu führen. Nebst den PopUp-Fenstern, die dazu dienen, Einstellungen an der Unternehmung vorzunehmen, besteht die Möglichkeit, auf das gelbe Hilfesymbol eines Panels (siehe Abbildung 3.1) zu klicken und so ein PopUp-Fenster mit einer kurzen Anleitung zum jeweiligen Thema zu öffnen. Diese Fenster sind alle Instanzen der Klasse CFHilfe. Diese besitzt einen Konstruktor, der als Parameter einen String verlangt, aufgrund dessen bestimmt werden kann, zu welchem Thema Seite 17 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel Hilfe angefordert wurde. Die paint()-Methode von CFHilfe gibt dann anhand des Parameters den Inhalt zum entsprechenden Thema in das Fenster aus. Was natürlich ebenfalls zur Aufgabe von COberfläche gehört, ist die Kontrolle der Koordinaten bei Mausklicks, um zu ermitteln, auf welches Panel der Benutzer geklickt hat, damit das entsprechende Fenster gestartet wird. Ausserdem übernimmt der WindowListener der FrameKlassen noch die Funktion, die gesamte Anzeige neu zu zeichnen, damit die Oberfläche stets auf dem neuesten Stand ist. Codeauszug 3.6: Fensterklasse FFinanzen class CFFinanzen extends Frame { Button Start,Start2; CFFinanzen() { super("Hauptmenü - Finanzen"); setLayout(new FlowLayout()); Button Start = new Button("Quartal mit Visualisierung simulieren (" + OekoSim.runde + " - " + OekoSim.quartal + "/" + OekoSim.jahr + ")"); Button Start2 = new Button("Quartal ohne Visualisierung simulieren (" + OekoSim.runde + " - " + OekoSim.quartal + "/" + OekoSim.jahr + ")"); add(Start); add(Start2); addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent event) { setVisible(false); dispose(); OekoSim.neuZeichnen = true; } } ); class CBLStart implements ActionListener { public void actionPerformed(ActionEvent e) { OekoSim.simStart = true; OekoSim.simGraph = true; Simulation.simInitStart(); setVisible(false); dispose(); OekoSim.neuZeichnen = true; } } class CBLStart2 implements ActionListener { public void actionPerformed(ActionEvent e) { Seite 18 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel OekoSim.simStart = true; OekoSim.simGraph = false; Simulation.simInitStart(); setVisible(false); dispose(); OekoSim.neuZeichnen = true; } } Start.addActionListener(new CBLStart()); Start2.addActionListener(new CBLStart2()); } } CFFinanzen ist eine der Unterklassen von COberflaeche. Sie wird von Frame des AWT abgeleitet. Somit stellt jede Instanz dieser Klasse ein PopUp-Fenster dar. Nachdem zwei Instanzen von Button gebildet wurden und durch die Methode super (String) ein Titel für das PopUp gesetzt wurde (siehe auch Abbildung 3.3), wird ein Layout für die Buttons festgelegt. Der Konstruktor von Button wird für beide Buttons aufgerufen. Dieser benötigt als Parameter lediglich einen String, der auf dem Knopf ausgegeben wird. Danach werden dem Layout die beiden Buttons hinzugefügt. Für jeden der Buttons wird nun eine Hilfsklasse gebildet, die ActionListener implementiert. Diese beiden Klassen sorgen dafür, dass simStart und simGraph ein Wert zugewiesen wird – woraufhin die Simulation in der Paint()-Methode von OekoSim gestartet wird. Ausserdem wird die Methode Simulation. simInit() aufgerufen und das Fenster zum Schluss automatisch durch setVisibleFalse() und dispose() geschlossen und gelöscht. Zuletzt werden die beiden Buttons bei den ActionListenern registriert. Ausserdem erhält CFFinanzen einen WindowListener, der dafür sorgt, dass das Fenster durch einen Klick auf das Schliess-Symbol (etwa das X unter Windows) geschlossen werden kann. Abbildung 3.3 „Oberfläche - Produktion“ Seite 19 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel 3.1.7 Die Klasse CFaktor Die Instanzen der Klasse CFaktor stellen Balkendiagramme dar, welche zur Visualisierung des Simulationsvorganges dienen. Die Instanzen von CFaktor werden in OekoSim angelegt, wobei jede Instanz ein Diagramm für einen Simulations-Faktor darstellt. Die fünf Klassenvariabeln bezeichnung, startWert, endWert, balkenFarbe und ueberhoehungsFaktor werden vom Konstruktor jeder Instanz zugewiesen. Zu den Instanzen dieser Klasse – also den Diagrammen - ist allgemein zu sagen, dass jedes Diagramm bzw. jeder Faktor in jeder Runde bzw. jedem Quartal einen Start- und einen Endwert hat. Der Startwert entspricht dem Wert, den der Faktor im vergangenen Quartal hatte, der Endwert dem des aktuellen Quartals. So lässt sich die Veränderung gegenüber dem Vorquartal graphisch darstellen. Da CFaktor recht viele Methoden enthält, seien diese im Folgenden ganz kurz erklärt: faktorZeichnen(Graphics,int,int,int) zeichnet ein Balkendiagramm. Zuerst wird ein gelber Balken gezeichnet, der den Startwert, also den Wert des Vorquartals, darstellt. Danach wird die Veränderung in einer anderen Farbe dargestellt. Diese Farbe entspricht der Färbung des entsprechenden Panels auf der Oberfläche (siehe Abbildung 3.1). simInit() und simInitProdVerk() aktualisieren Werte um die Visualisierung vorzubereiten. simReset() wird nach der Visualisierung aufgerufen und bewirkt, dass die Endwerte des abgeschlossenen Quartals zu den Startwerten des neuen Quartals werden. verzoegerung() sorgt in faktorZeichnen(Graphics,int,int,int) für kleine Verzögerungen, damit die Visualisierung in einem angemessenen Tempo ablaufen kann. Sie bedient sich der Methode sleep(int) von Thread. simInitEmulieren() und faktorZeichnenEmulieren() gaukeln dem Programm vor, dass die Methoden simInit() und faktorZeichnen(Graphics,int,int,int) ablaufen. Dies ist nötig, weil in letzteren die Start- und Endwerte u.ä. aktualisiert werden. Wenn sich der Benutzer jedoch für die Simulation ohne Visualisierung entscheidet, werden diese Schritte nicht ausgeführt. Dies hat zur Folge, dass die Faktoren nicht korrekt angezeigt werden, wenn die Visualisierung nachträglich, d.h. erst während der Simulation, aktiviert wird Codeauszug 3.7: Diagramm zeichnen if (endWert == startWert) { if(startWert >= 0) { while (i <= (int)startWert*ueberhoehungsFaktor) { g.setColor(Color.yellow); g.drawLine(x,y,x,y+25); x += 1; i += 1; verzoegerung(50); } } Seite 20 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel if(startWert < 0) { while (i <= (int)-startWert*ueberhoehungsFaktor) { g.setColor(Color.yellow); g.drawLine(x,y,x,y+25); x -= 1; i += 1; verzoegerung(50); } } } Obenstehender Quellcode ist ein Ausschnitt aus der Methode faktorZeichnen(Graphics, int, int, int). Er stellt die einfachste Variante eines Balkendiagrammes dar: Start- und Endwert sind gleich, es muss also keine Veränderung visualisiert werden. Dabei wird eine while-Schleife benutzt, in der so oft eine senkrechte gelbe Linie gezeichnet wird und der x-Wert erhöht wird, bis ein gelber Balken mit der korrekten Länge entstanden ist. Falls der Endwert negativ ist, wird - statt wie gerade beschrieben nach rechts - nach links gezeichnet, die x-Werte also in jedem Durchlauf der Schleife um 1 gesenkt. Zu beachten ist hier auch die Variabel ueberhoehungsFaktor. Da die Grössenordnung der Werte sehr unterschiedlich ist, ist es bei manchen Faktoren z.B. nötig, die Werte durch 1000 zu teilen oder mit 10 zu multiplizieren. Ausserdem wird ueberhoehungsFaktor automatisch halbiert, sobald die Werte so gross würden, dass sie nicht mehr im Visualisierungs-Fenster dargestellt werden könnten (in Codeauszug 3.7 nicht sichtbar). 3.1.8 Die Klasse CFSimulation CFSimulation wird von Frame des AWT abgeleitet. Die Instanz von CFSimulation stellt ein PopUp-Fenster dar, in deren paint()-Methode die Balkendiagramme zur Visualisierung des Simulationsvorganges gezeichnet werden, also die Methode faktorZeichnen(Graphics, int, int, int) der Instanzen von CFaktor aufgerufen werden. Somit läuft in diesem Fenster die eigentliche Visualisierung ab. Codeauszug 3.8: Visualisierung der Simulation if(i == 3) { g.setColor(Color.white); g.fillRect(0,0,700,400); mengeProd.faktorZeichnen(g,50,50,mengeProd.endWert); mengeVerk.faktorZeichnen(g,50,100,mengeVerk.endWert); g.setColor(Color.black); g.drawLine(50,150,650,150); fUmsatz.faktorZeichnen(g,50,200,Unternehmung.f_umsatz); Seite 21 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel g.setColor(Color.black); g.drawString("Bitte warten...",600,350); verzoegerung(20000); i++; } Dieser Ausschnitt stellt den dritten Bildschirm (i = 3) der Visualisierung dar. Gezeigt werden die Diagramme für Produktionsmenge und Verkauf. Darunter wird eine schwarze Linie zur optischen Abgrenzung gezeichnet, worauf das Diagramm für den Umsatz gezeichnet wird. So lässt sich für den Benutzer beobachten, wie sich Produktion und Verkauf entwickelt haben und welcher Umsatz sich daraus ergibt. Ausserdem wird ganz zu Anfang des Ausschnittes ein weisses ausgefülltes Viereck gezeichnet, das dem Löschen der vorhergehenden Visualisierung dient. Zum Schluss wird die Meldung „Bitte warten…“ ausgegeben und eine Verzögerung eingeschaltet, damit der Benutzer genügend Zeit hat, sich die Graphik anzusehen. Ganz zuletzt wird i um 1 erhöht, womit die nächste if-Abfrage wahr wird und daraufhin die folgende Visualisierung startet. Hierzu ist noch zu sagen, dass dank der CFaktor-Klasse, die eigentlich die ganze Arbeit für die graphische Darstellung des Simulationsvorganges bereits erledigt hat, die Routine für die eigentliche Visualisierung sehr simpel geworden ist – und auch das Hinzufügen weiterer Darstellungen relativ schnell zu erledigen ist. Abbildung 3.4 „Visualisierung des Simulationsvorganges“ Seite 22 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel 4. Anleitung zum Applet Die Aufgabe dieses Kapitels ist es, die Bedienung des Programms zu beschreiben und einen Einblick in die wichtigsten Zusammenhänge der einzelnen Faktoren zu geben. Darüber hinaus soll die Anleitung auch die Ideen hinter der Umsetzung – vom Modell zur Simulation in JAVA – vermitteln. Wie sich auf Abbildung 4.1 (unten) erkennen lässt, ist die Oberfläche der Simulation dem „Umweltenmodell“ (Kapital 2.3.1) nachempfunden. Die verschiedenen Gruppen werden durch die Farben rot, blau und grün gekennzeichnet. Ausserdem wird ein Einfluss, der von einer bestimmten Gruppe auf eine andere einwirkt, durch einen Pfeil in der entsprechenden Farbe dargestellt: BLAUE Felder kennzeichnen diejenigen Faktoren, die der Benutzer direkt beeinflussen kann. Dazu gehören „Lieferanten“, „Mitarbeiter“, „Produktion“, „Marketing“ und „Investitionen“. Die fünf blauen Pfeile stellen Einflüsse dar, die von diesen Faktoren ausgehen. ROTE Felder kennzeichnen Faktoren, die der Benutzer nur indirekt oder gar nicht beeinflussen kann, die aber auf die Unternehmung einwirken. Diese sind „Soziales“, „Wirtschaft“ und „Kapitalgeber“. Die drei roten Pfeile stellen Einflüsse dar, die von diesen Faktoren ausgehen Das GRÜNE Feld „Finanzen“ stellt die wichtigsten Kennzahlen der Unternehmung dar. Die drei grünen Pfeile stellen Geldströme dar, die in direkt beeinflussbare Faktoren fliessen. Durch einen Mausklick auf eines der blauen Felder oder „Panels“ wird ein PopUp-Fenster geöffnet, über welches der Benutzer auf den jeweiligen Faktor Einfluss nehmen kann. Die genauen Möglichkeiten werden in den folgenden Kapiteln erläutert. Unten findet sich eine Legende zur Abbildung 4.1, die kurz die Auswirkungen der einzelnen Faktoren untereinander zusammenfasst. Hinweis: Im Anhang „Screenshots“ sind Abbildungen der einzelnen PopUp-Fenster, die oben erwähnt wurden und in den folgenden Kapiteln beschrieben werden, vorhanden. Seite 23 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel Abbildung 4.1 „Zusammenspiel der Faktoren“ Legende zu Abbildung 3.1 1 Motivation der Arbeiter beeinflusst die Produktion 2 Rechnungen für bestellte Waren werden bezahlt 3 Löhne für Mitarbeiter und Manager werden bezahlt 4 Bestellte Waren werden für die Produktion benötigt 5 Mitarbeiter stellen Produkte her 6 Konjunktur nimmt Einfluss auf die Unternehmung (Nachfrage) 7 Produkte können verkauft werden 8 Kredite können aufgenommen werden 9 Ausgaben für Netto- und Ersatzinvestitionen 10 Markforschung und Werbung verursachen Kosten 11 Ersatzinvestitionen für vorhandene Produktionsanlagen Nettoinvestitionen für neue Produktionsanlagen 12 Marktforschung und Werbung erhöhen den Absatz der Produkte 4.1 Mitarbeiter Im blauen Panel oben rechts (siehe Abbildung 3.1) finden sich die wichtigsten Angaben zum Personalwesen: Anzahl und Lohn der Mitarbeiter / Manager sowie die jeweiligen sich daraus ergebenden Kosten. Durch Klicken auf das Panel wird ein PopUp-Fenster gestartet. Dies bietet Seite 24 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel die Möglichkeit, über Mausklicks auf die Buttons neue Mitarbeiter einzustellen oder zu entlassen sowie ihren Lohn zu erhöhen oder zu senken. Analog verhält es sich mit den Einstellungen für die Manager. Die Anzahl Mitarbeiter / Manager wirkt sich in erster Linie auf das Produktionspotential aus – je mehr Mitarbeiter, desto mehr kann produziert werden. 4.2 Produkte Das blaue Panel Mitte rechts dient der Anzeige der wichtigsten Daten zu der Produktion: Auflistung der Produkte mit Entwicklungs- bzw. Produktionsstand und Preis. Durch einen Mausklick wird ein Fenster geöffnet, über das der Benutzer Einstellungen vornehmen kann und ein zweites, das Verkaufszahlen ausgibt. Im ersteren gibt es drei verschiedene Abteilungen: Durch die oberen Buttons lassen sich Einstellungen für ein Produkt vornehmen, das neu entwickelt werden soll. Hierzu gehört das sogenannte „Innovationsniveau“, welches die Qualität des Produktes bestimmt. Davon abhängig ist einerseits, wie kostenintensiv die Entwicklung ist und andererseits wie viel die Kunden später bereit sind, für ein Produkt zu bezahlen. Ausserdem kann der Benutzer einen Startpreis festlegen. Durch einen Klick auf den Button „Produkt entwickeln“ wird der Bau einer Maschine für ein neues Produkt gestartet. Maximal können vier Maschinen für vier verschiedene Produkte gebaut werden. Im mittleren Abteil lassen sich bestehende Produkte ändern. Nach dem Festlegen einer Nummer (entspricht der Reihenfolge auf dem Panel) kann der Benutzer den Verkaufspreis sowie die herzustellende Menge ändern. Diese Anzeige besteht aus „Produktionsmenge / Maximale Produktionsmenge“ also z.B. „1000 / 1200“. Das unterste Abteil dient dazu, die Produktion eines Produktes, das beispielsweise zu wenig rentabel ist, einzustellen. Nach dem „Aussortieren“ eines Produktes ist die Herstellung nicht mehr möglich. Die Reaktivierung eines ‚aussortierten’ Produkts ist somit nur durch den Bau einer neuen Maschine möglich. Die Entfernung einer Maschine bringt keine direkten finanziellen Vorteile, jedoch kann danach eine zusätzliche Maschine gebaut werden. Die Nachfrage nach einem bestimmten Produkt ist etwa von Faktoren wie Qualität und Preis abhängig. Aber auch die Konjunktur, Werbung und Marktforschung haben einen Einfluss auf die verkaufte Menge. Durch Nettoinvestitionen kann das Produktionspotential erhöht werden. Dies ist zwar kurzfristig gesehen sehr kapitalintensiv, gibt dafür aber dem Benutzer die Möglichkeit, Fixkosten in Form von Gehältern – sprich durch Stellenabbau – zu reduzieren. Seite 25 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel 4.3 Lieferanten Oben links findet sich das Panel „Lieferanten“. Dargestellt sind die bestellte Menge sowie der Stückpreis und der derzeitige Vorrat. Im Fenster, das sich durch einen Klick auf das Panel öffnen lässt, kann der Benutzer eine bestimmte Menge bestellen. Zu beachten ist, dass auf grosse Mengen Rabatte gewährt werden. Die Produktion ist abhängig von der verfügbaren Menge an eingekauften Waren: Jedes hergestellte Produkt – unabhängig von der Qualität - benötigt ein geliefertes Gut. Eine häufige Ursache für einen Produktionsstillstand bzw. eine plötzliche Produktionsabnahme ist eine zu kleine bestellte Menge an Waren. 4.4 Marketing Das Panel „Marketing“ (unten Mitte) stellt die Investitionen für Werbung und Marktforschung dar. Im PopUp-Fenster dieses Panels lassen sich Ausgaben für die zwei genannten Faktoren festlegen. Wie bereits unter 4.2 erwähnt haben Marktforschung und Werbung einen wesentlichen Einfluss auf den Verkauf der Produkte – je mehr investiert wird, desto höher wird die Nachfrage. 4.5 Wirtschaft Durch Klicken auf das Panel „Wirtschaft“ wird eine graphische Darstellung der Weltwirtschaftsentwicklung seit Spielbeginn (1. Quartal 2003) in einem PopUp-Fenster geöffnet. Anhand der Konjunkur-Kurve kann der Benutzer versuchen, die unmittelbare zukünftige Entwicklung abzuschätzen und seine Entscheide danach auszurichten. Ist die Kurve rot, liegt eine Abnahme des BIPs seit Spielbeginn vor, ist sie schwarz, eine Zunahme. Dies lässt sich ausserdem der Prozentangabe auf dem Panel entnehmen. Die Konjunktur fliesst wie etwa der Preis eines Produktes in die Nachfrage ein – je besser die gesamtwirtschaftliche Entwicklung, desto kauffreudiger die Kunden. Ausserdem wird auf dem Panel „Wirtschaft“ angegeben, auf wie viel Prozent sich die Steuern auf dem erwirtschafteten Gewinn belaufen. Die Höhe der Steuern ist indirekt proportional zum Konjunkturverlauf. 4.6 Soziales Im Panel „Soziales“ wird die Motivation der Arbeiter dargestellt. Die Prozentzahl wird anhand der getätigten Entlassungen/Einstellungen und Lohnerhöhungen/-senkungen errechnet. Seite 26 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel Ausserdem ist das Verhältnis zwischen erwirtschaftetem Gewinn und Mitarbeiteranzahl /-lohn wesentlich – wenn der Benutzer seine Unternehmung erfolgreich führt und viel Gewinn macht, möchten natürlich die Arbeiter auch einen Teil davon für ihre gute Leistung erhalten. Unterhalb der Prozentangabe findet sich eine kurze Beschreibung der Motivation: „Mitarbeiter motiviert!“: Bei 75% und mehr arbeiten die Angestellten motiviert und erhöhen somit das Produktionspotential – proportional zu ihrer Motivation. „Mitarbeiter zufrieden.“: Von 50% bis 74% sind die Angestellten durchschnittlich motiviert. Das Produktionspotential wird nicht beeinflusst. „Mitarbeiter unzufrieden“: Von 25% bis 49% sind die Angestellten nicht motiviert. Dies kann sich – je nach Grad der Demotivierung – sehr negativ auf das Produktionspotential auswirken. „Mitarbeiter streiken!“: Unter 25% Motivation gehen die Angestellten in den (Dauer)Streik. Die Produktion wird solange angehalten, bis der Benutzer den Mitarbeitern mehr Lohn zahlt bzw. mehr Leute einstellt. Wichtig ist es vor allem darauf zu achten, dass Gewinn und Anzahl / Lohn der Mitarbeiter in einem angemessenen Verhältnis steht. Falls sich der Benutzer einen hohen Gewinn nur durch Investitionen zu erarbeiten versucht, fangen die Mitarbeiter an, weniger zu arbeiten, was je nach Demotivierungs-Grad zu sehr erheblichen Umsatz-Einbussen führen kann. 4.7 Kapitalgeber Im Panel „Kapitalgeber“ werden folgende Kennzahlen ausgegeben: Derzeitige Kredite, angebotene Kredite und der jährliche Zinssatz auf Kredite. Durch einen Klick auf dieses Panel kann der Benutzer Kredite aufnehmen. Der Benutzer kann durch aufgenommenes Fremdkapital seine Liquidität erhöhen. Allerdings ist zu beachten, dass zu Zeiten eines starken Wirtschaftswachstums die Zinsen wesentlich höher sein können als während eines Abschwungs. Somit ist es oft empfehlenswert, das Fremdkapital abzubauen, sobald genügend hohe Gewinne erwirtschaftet werden. Die Höhe der angebotenen Kredite hängt vom Eigenkapital der Unternehmung ab – welches nicht mit dem Kapital gleichzusetzen ist. Das Eigenkapital ist das Kapital minus das aufgenommene Fremdkapital. 4.8 Finanzen Im Panel „Finanzen“ werden die wichtigsten Kennzahlen der Unternehmung ausgegeben: Kapital, Umsatz (letztes Quartal), Ausgaben (letztes Quartal), Gewinn bzw. Verlust (letztes Quartal). Seite 27 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel Nachdem alle Einstellungen für das aktuelle Quartal vorgenommen worden sind, kann der Benutzer durch Klicken auf dieses Panel das Quartals-Abschluss-Menü öffnen. Es stehen zwei Möglichkeiten zur Verfügung, das Quartal abzuschliessen: „Quartal mit Visualisierung simulieren“: Durch Klicken auf diesen Button startet die Simulation des aktuellen Quartals mit Visualisierung. D.h. der Benutzer kann in einem Fenster verfolgen, welche Auswirkungen seine Entscheidungen haben. Jeder Faktor – etwa Anzahl Mitarbeiter, Produktion oder Verlauf der Konjunktur – wird graphisch als Balken-Diagramm dargestellt, aus welchem sich ersehen lässt, wie sich der Faktor verändert hat und auf welche anderen Faktoren er sich ausgewirkt hat bzw. von welchen anderen Faktoren er beeinflusst worden ist. Es folgen nacheinander: Darstellung der Produktion, des Verkaufs, Umsatzes, der Ausgaben, des Fremdkapitals und des Quartalsabschlusses mit Gewinn und neuem Kapital. Das aktuelle Quartal wird abgeschlossen, das nächste beginnt. „Quartal ohne Visualisierung simulieren“: Durch Klicken auf diesen Button startet die Simulation des aktuellen Quartals ohne Visualisierung. Die graphische Darstellung der Auswirkungen von getroffenen Entscheidungen fällt weg, die neuen Zahlen werden direkt berechnet, das neue Quartal beginnt. Nach dem beschriebenen Abschluss eines Quartals können die Entscheidungen für das nächste Quartal getroffen werden – die neue Runde beginnt, das „Spiel geht von vorne los“. 4.9 Allgemeine Hinweise und Zusammenfassung Zu jedem Faktor ist ein Panel vorhanden, in dem die wichtigsten Daten angezeigt werden. Durch Klicken auf ein Panel wird der jeweilige „Bearbeiten“-Dialog aufgerufen. Das Vornehmen von Einstellungen erfolgt durch weitere Klicks auf die entsprechenden Buttons. Durch das Klicken auf das Panel „Finanzen“ und das Wählen zwischen „Simulation mit Visualisierung“ und „Simulation ohne Visualisierung“ wird das aktuelle Quartal simuliert und abgeschlossen, das nächste Quartal beginnt. In jedem Panel befindet sich in der rechten oberen Ecke ein gelbes Hilfe-Symbol „?“. Durch einen Mausklick auf dieses wird ein PopUp mit einem kurzen Hilfetext zum entsprechenden Panel geöffnet. Achtung: Alle Mengen- und Betragsangaben (z.B. Löhne Mitarbeiter, bestellte Menge, Nettoinvestitionen usw.) beziehen sich auf einen Monat. Eine Runde im Spiel entspricht jedoch einem Quartal. Somit werden mit einer Runde (= 1 Quartal) jeweils 3 einzelne Monate simuliert und die Ausgaben / Produktionszahlen / Bestellungen etc. belaufen sich jeweils auf den dreifachen angezeigten Wert. Seite 28 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Samuel P. Plachel 5. Schluss Das beiliegende JAVA – Applet ‚OekoSim’ ist eine Umsetzung von mikroökonomischen Modellen durch objektorientierte Programmierung. ‚OekoSim’ basiert v.a. auf der Theorie der „Umweltsphären“ (siehe Kapital 2.3.1), womit eine Computer-Anwendung entstanden ist, deren Oberfläche diesem Modell nachgebildet ist (siehe Abbildung 3.1). Dieses Applet gibt die Möglichkeit, die Einflüsse, die von den „Umwelten“ auf die Unternehmung wirken, zu simulieren und die Auswirkungen von Entscheidungen, die vom Management getroffen werden, im Zusammenhang mit den Umwelten darzustellen. Jede Entscheidung ruft bestimmte Reaktionen oder sogar Kettenreaktionen hervor, welche durch eine Balken-Diagramm-Darstellung visualisiert werden können. Ein besonderer Schwerpunkt wurde in dieser mikroökonomischen Simulation auf soziale Aspekte gelegt: nicht die Gewinnmaximierung führt zum Ziel, sondern ein Mittelweg zwischen dem Streben nach einem Gewinn – welcher schliesslich das Überleben einer Unternehmung sichert - und dem Berücksichtigen sozialer Belange. Somit ergibt sich eine UnternehmungsSimulation, die leicht idealistisch angehaucht ist; ich bin aber der Meinung, dass etwas Idealismus einer Simulation keinen Abbruch tut. Eine Simulation kann beliebig komplex sein, sie wird trotzdem nicht in der Lage sein, die Realität wirklich exakt abzubilden. Vielmehr ist es das Ziel jeder Simulation, einen Idealfall der Realität abzubilden – und genau dies wurde mit ‚OekoSim’ erreicht. Literaturverzeichnis Primärliteratur: „Wirtschaft und Recht Grundlagen“ / Jan Atteslander et al. – Aarau: Bildung Sauerländer. 1 3. erg. Aufl. 2000 Sekundärliteratur: „Jetzt lerne ich Java“ / Louis, Dirk und Peter Müller – München: Markt und Technik Verlag. 1. Aufl. 2002 „Wirtschaft und Recht Grundlagen“ / Jan Atteslander et al. – Aarau: Bildung Sauerländer. 3. erg. Aufl. 2000 Konzept des beiliegenden JAVA – Applets in Anlehnung an das Brettspiel „Ökolopoly. Ein kybernetisches Umweltspiel von Frederic Vester“ / Frederic Vester – Ravensburg: Otto Maier Verlag. 1984 Verwendete Software: Seite 29 Die Umsetzung einer mikroökonomischen Simulation in ein JAVA - Applet Metrowerks CodeWarrior IDE Version 4.1 Microsoft Windows XP Microsoft Office XP Samuel P. Plachel Anlagen: JAVA-Applet: Ordner ‘Java Sources’ mit sämtlichen Klassendateien Quellcode: MCP-File ‘OekoSim.mcp’ inkl. ‘OekoSim.java’, ’OekoSim.html’, ‘Debug.html’ Anlage “Screenshots” Bestätigung der Eigentätigkeit Ich bestätige mit Unterschrift, dass die Arbeit selbständig verfasst und in schriftliche Form gebracht worden ist, dass sich die Mitwirkung anderer Personen auf Beratung und Korrekturlesen beschränkt hat und dass alle verwendeten Unterlagen und Gewährspersonen aufgeführt sind. Samuel P. Plachel Seite 30