74
Discrete Event Simulation CS1316: Representing Structure and Behavior

Discrete Event Simulation CS1316: Representing Structure and Behavior

Embed Size (px)

Citation preview

Page 1: Discrete Event Simulation CS1316: Representing Structure and Behavior

Discrete Event Simulation

CS1316: Representing Structure and Behavior

Page 2: Discrete Event Simulation CS1316: Representing Structure and Behavior

Story Discrete event simulation

• Simulation time != real time Key ideas:

• A Queue• A Queue is a queue, no matter how implemented.

• Different kinds of random• Straightening time

• Inserting it into the right place• Sorting it afterwards

Building a discrete event simulation• Graphics as the representation, not the real thing: The

Model and the View

Page 3: Discrete Event Simulation CS1316: Representing Structure and Behavior

Imagine the simulation… There are three Trucks that bring product from the

Factory.• On average, they take 3 days to arrive.• Each truck brings somewhere between 10 and 20 products

—all equally likely. We’ve got five Distributors who pick up product from the

Factory with orders.• Usually they want from 5 to 25 products, all equally likely.

It takes the Distributors an average of 2 days to get back to the market, and an average of 5 days to deliver the products.

Question we might wonder: How much product gets sold like this?

Page 4: Discrete Event Simulation CS1316: Representing Structure and Behavior

Don’t use a Continuous Simulation We don’t want to wait that number of days in real time. We don’t even care about every day.

• There will certainly be timesteps (days) when nothing happens of interest.

We’re dealing with different probability distributions.• Some uniform, some normally distributed.

Things can get out of synch• A Truck may go back to the factory and get more product

before a Distributor gets back.

• A Distributor may have to wait for multiple trucks to fulfill orders (and other Distributors might end up waiting in line)

Page 5: Discrete Event Simulation CS1316: Representing Structure and Behavior

We use a Discrete Event Simulation

We don’t simulate every moment continuously.

We simulate discrete events.

Page 6: Discrete Event Simulation CS1316: Representing Structure and Behavior

What’s the difference?No time loop

In a discrete event simulation: There is no time loop.• There are events that are scheduled.

• At each run step, the next scheduled event with the lowest time gets processed.• The current time is then that time, the time that that

event is supposed to occur.

Key: We have to keep the list of scheduled events sorted (in order)

Page 7: Discrete Event Simulation CS1316: Representing Structure and Behavior

What’s the difference?Agents don’t act()

In a discrete event simulations, agents don’t act().• Instead, they wait for events to occur.

• They schedule new events to correspond to the next thing that they’re going to do.

Key: Events get scheduled according to different probabilities.

Page 8: Discrete Event Simulation CS1316: Representing Structure and Behavior

What’s the difference?Agents get blocked Agents can’t do everything that they want to do. If they want product (for example) and there isn’t any,

they get blocked.• They can’t schedule any new events until they get

unblocked. Many agents may get blocked awaiting the same

resource.• More than one Distributor may be awaiting arrival of Trucks

Key: We have to keep track of the Distributors waiting in line (in the queue)

Page 9: Discrete Event Simulation CS1316: Representing Structure and Behavior

Key Ideas

A Queue• A Queue is a queue, no matter how implemented.

Different kinds of random Straightening time

• Inserting it into the right place

• Sorting it afterwards

Page 10: Discrete Event Simulation CS1316: Representing Structure and Behavior

Key idea #1: Introducing a Queue

First-In-First-Out List• First person in line is first person served

I got here first!

I got here second!

I got here third!

This is the front or head of the queue

This is the tail of the queue

Page 11: Discrete Event Simulation CS1316: Representing Structure and Behavior

First-in-First-out

New items only get added to the tail.• Never in the middle

Items only get removed from the head.

I got here first!

I got here second!

I got here third!

This is the front or head of the queue

This is the tail of the queue

Page 12: Discrete Event Simulation CS1316: Representing Structure and Behavior

As items leave, the head shifts

I got here first! AND NOW I’M UP!

I got here second!

I got here third!

Now, this is the front or head of the queue

This is the tail of the queue

Served!

Page 13: Discrete Event Simulation CS1316: Representing Structure and Behavior

As new items come in, the tail shifts

I got here second!

I got here third!

Now, this is the front or head of the queue

Now, this is the tail of the queue

I got here fourth!

Page 14: Discrete Event Simulation CS1316: Representing Structure and Behavior

What can we do with queues?

push(anObject): Tack a new object onto the tail of the queue

pop(): Pull the end (head) object off the queue.

peek(): Get the head of the queue, but don’t remove it from the queue.

size(): Return the size of the queue

Page 15: Discrete Event Simulation CS1316: Representing Structure and Behavior

Building a Queue

> Queue line = new Queue();

> line.push("Fred");

> line.push("Mary");

> line.push("Jose");

> line.size()

3

Page 16: Discrete Event Simulation CS1316: Representing Structure and Behavior

Accessing a Queue> line.peek()"Fred"> line.pop()"Fred"> line.peek()"Mary"> line.pop()"Mary"> line.peek()"Jose"> line.pop()"Jose"> line.pop()java.util.NoSuchElementException:

We don’t really want to peek() or pop() an empty queue, so we should probably check its size first.

Page 17: Discrete Event Simulation CS1316: Representing Structure and Behavior

Building aQueueimport java.util.*; // LinkedList representation

/** * Implements a simple queue **/public class Queue { /** Where we'll store our elements */ public LinkedList elements; /// Constructor public Queue(){ elements = new LinkedList(); }

Page 18: Discrete Event Simulation CS1316: Representing Structure and Behavior

Queue methods /// Methods /** Push an object onto the Queue */ public void push(Object element){ elements.addFirst(element); } /** Peek at, but don't remove, top of queue */ public Object peek(){ return elements.getLast();} /** Pop an object from the Queue */ public Object pop(){ Object toReturn = this.peek(); elements.removeLast(); return toReturn; } /** Return the size of a queue */ public int size() { return elements.size();}

We’re using a linked list to implement the Queue.

The front of the LinkedList is the tail.

The last of the LinkedList is the head.

Page 19: Discrete Event Simulation CS1316: Representing Structure and Behavior

A queue is a queue, no matter what lies beneath. Our description of the queue minus the

implementation is an example of an abstract data type (ADT).• An abstract type is a description of the methods that a

data structure knows and what the methods do. We can actually write programs that use the

abstract data type without specifying the implementation. • There are actually many implementations that will

work for the given ADT.• Some are better than others.

Page 20: Discrete Event Simulation CS1316: Representing Structure and Behavior

Array-oriented Queue/** * Implements a simple queue **/public class Queue2 { private static int ARRAYSIZE = 20; /** Where we'll store our elements */ private Object[] elements; /** The indices of the head and tail */ private int head; private int tail;

Page 21: Discrete Event Simulation CS1316: Representing Structure and Behavior

Queue = array + head index + tail index

/// Constructor

public Queue2(){

elements = new Object[ARRAYSIZE];

head = 0;

tail = 0;

}

Page 22: Discrete Event Simulation CS1316: Representing Structure and Behavior

Queue2methods

/** Push an object onto the Queue */ public void push(Object element){ if ((tail + 1) >= ARRAYSIZE) { System.out.println("Queue underlying implementation

failed"); } else { // Store at the tail, // then increment to a new open position elements[tail] = element; tail++; } } /** Peek at, but don't remove, top of queue */ public Object peek(){ return elements[head];} /** Pop an object from the Queue */ public Object pop(){ Object toReturn = this.peek(); if (((head + 1) >= ARRAYSIZE) || (head > tail)) { System.out.println("Queue underlying implementation

failed."); return toReturn; } else { // Increment the head forward, too. head++; return toReturn;}} /** Return the size of a queue */ public int size() { return tail-head;}

As the queue gets pushed and popped, it moves down the array.

Page 23: Discrete Event Simulation CS1316: Representing Structure and Behavior

Same methods, same behavior

Welcome to DrJava.> Queue2 line = new Queue2();> line.push("Mary")> line.push("Kim")> line.push("Ron")> line.peek()"Mary"> line.pop()"Mary"> line.peek()"Kim"> line.size()2> line.pop()"Kim"> line.pop()"Ron"

But can only handle up to 20 elements in the queue! Less if pushing and popping. Could shift elements to always allow 20.

Not as good an implementation as the linked list implementation. (But uses less memory.)

Page 24: Discrete Event Simulation CS1316: Representing Structure and Behavior

Key idea #2: Different kinds of random

We’ve been dealing with uniform random distributions up until now, but those are the least likely random distribution in real life.

How can we generate some other distributions, including some that are more realistic?

Page 25: Discrete Event Simulation CS1316: Representing Structure and Behavior

Visualizing a uniformdistribution

import java.util.*; // Need this for Randomimport java.io.*; // For BufferedWriter

public class GenerateUniform { public static void main(String[] args) { Random rng = new Random(); // Random Number Generator BufferedWriter output=null; // file for writing // Try to open the file try { // create a writer output = new BufferedWriter(new FileWriter("D:/cs1316/uniform.txt")); } catch (Exception ex) { System.out.println("Trouble opening the file."); } // Fill it with 500 numbers between 0.0 and 1.0, uniformly

distributed for (int i=0; i < 500; i++){ try{ output.write("\t"+rng.nextFloat()); output.newLine(); } catch (Exception ex) { System.out.println("Couldn't write the data!"); System.out.println(ex.getMessage()); } } // Close the file try{ output.close();} catch (Exception ex) {System.out.println("Something went wrong closing the file");}}}

By writing out a tab and the integer, we don’t have to do the string conversion.

Page 26: Discrete Event Simulation CS1316: Representing Structure and Behavior

How do we view a distribution?A Histogram

Page 27: Discrete Event Simulation CS1316: Representing Structure and Behavior

Then graph the result

Page 28: Discrete Event Simulation CS1316: Representing Structure and Behavior

A Uniform Distribution

Frequency

0

10

20

30

40

50

60

70

00.

20.

40.

60.

8 1

Frequency

Page 29: Discrete Event Simulation CS1316: Representing Structure and Behavior

A NormalDistribution // Fill it with 500 numbers between -1.0 and 1.0, normally distributed for (int i=0; i < 500; i++){ try{ output.write("\t"+rng.nextGaussian()); output.newLine(); } catch (Exception ex) { System.out.println("Couldn't write the data!"); System.out.println(ex.getMessage()); } }

Page 30: Discrete Event Simulation CS1316: Representing Structure and Behavior

Graphing the normal distribution

Frequency

0

5

10

15

20

25

30

-2-1

.6-1

.2-0

.8-0

.4 00.

40.

81.

21.

6 2

Frequency

The end aren’t actually high—the tails go further.

Page 31: Discrete Event Simulation CS1316: Representing Structure and Behavior

How do we shift the distribution where we want it? // Fill it with 500 numbers with a mean of 5.0 and a //larger spread, normally distributed for (int i=0; i < 500; i++){ try{ output.write("\t"+((range * rng.nextGaussian())+mean)); output.newLine(); } catch (Exception ex) { System.out.println("Couldn't write the data!"); System.out.println(ex.getMessage()); } } Multiply the random nextGaussian()

by the range you want, then add the mean to shift it where you want it.

Page 32: Discrete Event Simulation CS1316: Representing Structure and Behavior

A new normal distribution

Frequency

02468

1012141618

-2

-1.5 -1

-0.5 0

0.5 1

1.5 2

2.5 3

3.5 4

4.5 5

5.5 6

6.5 7

7.5 8

8.5 9

9.5 10

Frequency

Page 33: Discrete Event Simulation CS1316: Representing Structure and Behavior

Key idea #3: Straightening Time

Straightening time

• Inserting it into the right place

• Sorting it afterwards We’ll actually do these in reverse order:

• We’ll add a new event, then sort it.

• Then we’ll insert it into the right place.

Page 34: Discrete Event Simulation CS1316: Representing Structure and Behavior

Exercising an EventQueue

public class EventQueueExercisor { public static void main(String[] args){ // Make an EventQueue EventQueue queue = new EventQueue(); // Now, stuff it full of events, out of order. SimEvent event = new SimEvent(); event.setTime(5.0); queue.add(event); event = new SimEvent(); event.setTime(2.0); queue.add(event); event = new SimEvent(); event.setTime(7.0); queue.add(event);

event = new SimEvent(); event.setTime(0.5); queue.add(event);

event = new SimEvent(); event.setTime(1.0); queue.add(event);

// Get the events back, hopefull in order! for (int i=0; i < 5; i++) { event = queue.pop(); System.out.println("Popped event

time:"+event.getTime()); } } }

We’re stuffing the EventQueue with events whose times are out of order.

Page 35: Discrete Event Simulation CS1316: Representing Structure and Behavior

If it works right, should look like this:

Welcome to DrJava.

> java EventQueueExercisor

Popped event time:0.5

Popped event time:1.0

Popped event time:2.0

Popped event time:5.0

Popped event time:7.0

Page 36: Discrete Event Simulation CS1316: Representing Structure and Behavior

Implementing an EventQueueimport java.util.*;

/** * EventQueue * It's called an event "queue," but it's not really. * Instead, it's a list (could be an array, could be a linked list) * that always keeps its elements in time sorted order. * When you get the nextEvent, you KNOW that it's the one * with the lowest time in the EventQueue **/public class EventQueue { private LinkedList elements; /// Constructor public EventQueue(){ elements = new LinkedList(); }

Page 37: Discrete Event Simulation CS1316: Representing Structure and Behavior

Mostly, it’s a queue

public SimEvent peek(){ return (SimEvent) elements.getFirst();} public SimEvent pop(){ SimEvent toReturn = this.peek(); elements.removeFirst(); return toReturn;} public int size(){return elements.size();} public boolean empty(){return this.size()==0;}

Page 38: Discrete Event Simulation CS1316: Representing Structure and Behavior

Two options for add()

/** * Add the event. * The Queue MUST remain in order, from lowest time to

highest. **/ public void add(SimEvent myEvent){ // Option one: Add then sort elements.add(myEvent); this.sort(); //Option two: Insert into order //this.insertInOrder(myEvent); }

Page 39: Discrete Event Simulation CS1316: Representing Structure and Behavior

There are lots of sorts!

Lots of ways to keep things in order.• Some are faster – best are O(n log n)

• Some are slower – they’re always O(n2)

• Some are O(n2) in the worst case, but on average, they’re better than that.

We’re going to try an insertion sort

Page 40: Discrete Event Simulation CS1316: Representing Structure and Behavior

How an insertion sort works

Consider the event at some position (1..n) Compare it to all the events before that

position backwards—towards 0.• If the comparison event time is LESS THAN the

considered event time, then shift the comparison event down to make room.

• Wherever we stop, that’s where the considered event goes.

Consider the next event…until done

Page 41: Discrete Event Simulation CS1316: Representing Structure and Behavior

InsertionSort public void sort(){ // Perform an insertion sort // For comparing to elements at smaller indices SimEvent considered = null; SimEvent compareEvent = null; // Just for use in

loop // Smaller index we're comparing to int compare; // Start out assuming that position 0 is "sorted" // When position==1, compare elements at

indices 0 and 1 // When position==2, compare at indices 0, 1,

and 2, etc. for (int position=1; position < elements.size();

position++){ considered = (SimEvent)

elements.get(position); // Now, we look at "considered" versus the

elements // less than "compare" compare = position;

// While the considered event is greater than the compared event ,

// it's in the wrong place, so move the elements up one.

compareEvent = (SimEvent) elements.get(compare-1);

while (compareEvent.getTime() > considered.getTime()) {

elements.set(compare,elements.get(compare-1));

compare = compare-1; // If we get to the end of the array, stop if (compare <= 0) {break;} // else get ready for the next time through

the loop else {compareEvent = (SimEvent)

elements.get(compare-1);} } // Wherever we stopped, this is where

"considered" belongs elements.set(compare,considered); } // for all positions 1 to the end } // end of sort()

Trace this out to convince yourself it works!

Page 42: Discrete Event Simulation CS1316: Representing Structure and Behavior

Useful Links on Sorting

http://ciips.ee.uwa.edu.au/~morris/Year2/PLDS210/sorting.html

http://www.cs.ubc.ca/spider/harrison/Java/sorting-demo.html

http://www.cs.brockport.edu/cs/java/apps/sorters/insertsort.html

These include animations that help to see how it’s all working

Recommended

Page 43: Discrete Event Simulation CS1316: Representing Structure and Behavior

Option #2: Put it in the right place

/** * Add the event. * The Queue MUST remain in order, from lowest time to

highest. **/ public void add(SimEvent myEvent){ // Option one: Add then sort //elements.add(myEvent); //this.sort(); //Option two: Insert into order this.insertInOrder(myEvent); }

Page 44: Discrete Event Simulation CS1316: Representing Structure and Behavior

insertInOrder() /** * Put thisEvent into elements, assuming * that it's already in order. **/ public void insertInOrder(SimEvent

thisEvent){ SimEvent comparison = null; // Have we inserted yet? boolean inserted = false; for (int i=0; i < elements.size(); i++){ comparison = (SimEvent)

elements.get(i);

// Assume elements from 0..i are less than thisEvent

// If the element time is GREATER, insert here and

// shift the rest down if (thisEvent.getTime() <

comparison.getTime()) { //Insert it here inserted = true; elements.add(i,thisEvent); break; // We can stop the search

loop } } // end for // Did we get through the list without

finding something // greater? Must be greater than any

currently there! if (!inserted) { // Insert it at the end elements.addLast(thisEvent);} }

Again, trace it out to convince yourself that it works!

Page 45: Discrete Event Simulation CS1316: Representing Structure and Behavior

Finally: A Discrete Event Simulation

Now, we can assemble queues, different kinds of random, and a sorted EventQueue to create a discrete event simulation.

Page 46: Discrete Event Simulation CS1316: Representing Structure and Behavior

Running a DESimulation

Welcome to DrJava.

> FactorySimulation fs = new FactorySimulation();

> fs.openFrames("D:/temp/");

> fs.run(25.0)

Page 47: Discrete Event Simulation CS1316: Representing Structure and Behavior

What we see (not much)

Page 48: Discrete Event Simulation CS1316: Representing Structure and Behavior

The detail tells the storyTime: 1.7078547183397625 Distributor: 0 Arrived at warehouseTime: 1.7078547183397625 Distributor: 0 is blocking>>> Timestep: 1Time: 1.727166341118611 Distributor: 3 Arrived at warehouseTime: 1.727166341118611 Distributor: 3 is blocking>>> Timestep: 1Time: 1.8778754913001443 Distributor: 4 Arrived at warehouseTime: 1.8778754913001443 Distributor: 4 is blocking>>> Timestep: 1Time: 1.889475045031698 Distributor: 2 Arrived at warehouseTime: 1.889475045031698 Distributor: 2 is blocking>>> Timestep: 1Time: 3.064560375192933 Distributor: 1 Arrived at warehouseTime: 3.064560375192933 Distributor: 1 is blocking>>> Timestep: 3Time: 3.444420374970288 Truck: 2 Arrived at warehouse with load 13Time: 3.444420374970288 Distributor: 0 unblocked!Time: 3.444420374970288 Distributor: 0 Gathered product for orders of 11>>> Timestep: 3Time: 3.8869697922832698 Truck: 0 Arrived at warehouse with load 18Time: 3.8869697922832698 Distributor: 3 unblocked!Time: 3.8869697922832698 Distributor: 3 Gathered product for orders of 12>>> Timestep: 3Time: 4.095930381479024 Distributor: 0 Arrived at market>>> Timestep: 4Time: 4.572840072576855 Truck: 1 Arrived at warehouse with load 20Time: 4.572840072576855 Distributor: 4 unblocked!Time: 4.572840072576855 Distributor: 4 Gathered product for orders of 19

Notice that time 2 never occurs!

Page 49: Discrete Event Simulation CS1316: Representing Structure and Behavior

What questions we can answer How long do distributors wait?

• Subtract the time that they unblock from the time that they block

How much product sits in the warehouse?• At each time a distributor leaves, figure out how much

is left in the warehouse. How long does the line get at the warehouse?

• At each block, count the size of the queue. Can we move more product by having more

distributors or more trucks?• Try it!

Page 50: Discrete Event Simulation CS1316: Representing Structure and Behavior

How DESimulation works

+getAgents()+add()+remove()+openFrames()+setUp()+openFile()+run()+endStep()+lineForFile()+closeFile()

#output

Simulation

+show()+replay()

FrameSequence

1

+frames

1

+init()+die()+getClosest()+countInRange()+act()

#speed

Agent

LinkedList

#agents1

*

*

1

+forward()+turn()+setColor()+setPenDown()

-heading-XPos-YPos

Turtle

*

#simulation

1

+setPicture()

World

*

-world

1

+isBlocked()+isReady()+validTime()+waitFor()+unblocked()+processEvent()

-blocked

DEAgent

+amountAvailable()+consume()+add()+addToList()

-amount

Resource

+push()+peek()+pop()+empty()+size()

Queue

-blocked

1*

+getTime()+addEvent()+log()+run()

-now

DESimluation

+peek()+add()+pop()+size()+empty()+insertInOrder()+sort()

EventQueue

*

-events

1

Page 51: Discrete Event Simulation CS1316: Representing Structure and Behavior

FactorySimulation: Extend a few classes

+getAgents()+add()+remove()+openFrames()+setUp()+openFile()+run()+endStep()+lineForFile()+closeFile()

#output

Simulation

+show()+replay()

FrameSequence

1

+frames

1

+init()+die()+getClosest()+countInRange()+act()

#speed

Agent

LinkedList

#agents1

*

*

1

+forward()+turn()+setColor()+setPenDown()

-heading-XPos-YPos

Turtle

*

#simulation

1

+setPicture()

World

*

-world

1

+isBlocked()+isReady()+validTime()+waitFor()+unblocked()+processEvent()

-blocked

DEAgent

+amountAvailable()+consume()+add()+addToList()

-amount

Resource

+push()+peek()+pop()+empty()+size()

Queue

-blocked

1*

+getTime()+addEvent()+log()+run()

-now

DESimulation

+peek()+add()+pop()+size()+empty()+insertInOrder()+sort()

EventQueue

*

-events

1

+newLoad()+tripTime()+init()+processEvents()

-load

Truck+newOrders()+timeToDeliver()+tripTime()+init()+processEvents()+isReady()+unblocked()

-amountOrdered

Distributor

+setUp()+getFactory()

FactorySimulation

-product1

*

Page 52: Discrete Event Simulation CS1316: Representing Structure and Behavior

DESimulation: Sets the Stage

DESimulation calls setUp to create agents and schedule the first events.

It provides log for writing things out to the console and a text file.

When it run()’s, it processes each event in the event queue and tells the corresponding agent to process a particular message.

Page 53: Discrete Event Simulation CS1316: Representing Structure and Behavior

What a DESimulation does: // While we're not yet at the stop time, // and there are more events to process while ((now < stopTime) && (!events.empty())) { topEvent = events.pop(); // Whatever event is next, that time is now now = topEvent.getTime(); // Let the agent now that its event has occurred topAgent = topEvent.getAgent(); topAgent.processEvent(topEvent.getMessage()); // repaint the world to show the movement // IF there is a world if (world != null) { world.repaint();} // Do the end of step processing this.endStep((int) now); }

As long as there are events in the queue, and we’re not at the stopTime:

Grab an event.

Make it’s time “now”

Process the event.

Page 54: Discrete Event Simulation CS1316: Representing Structure and Behavior

What’s an Event (SimEvent)?/** * SimulationEvent (SimEvent) -- an event that occurs in a simulation, * like a truck arriving at a factory, or a salesperson leaving the * market **/public class SimEvent{ /// Fields /// /** When does this event occur? */ public double time; /** To whom does it occur? Who should be informed when it occurred? */ public DEAgent whom; /** What is the event? We'll use integers to represent the meaning * of the event -- the "message" of the event. * Each agent will know the meaning of the integer for themselves. **/ public int message;

It’s a time, an Agent, and an integer that the Agent will understand as a message

Page 55: Discrete Event Simulation CS1316: Representing Structure and Behavior

DEAgent: Process events, block if needed

DEAgents define the constants for messages: What will be the main events for this agent?

If the agent needs a resource, it asks to see if it’s available, and if not, it blocks itself.

It will be told to unblock when it’s ready. Agents are responsible for scheduling their

OWN next event!

Page 56: Discrete Event Simulation CS1316: Representing Structure and Behavior

An Example: A Truck/** * Truck -- delivers product from Factory * to Warehouse. **/public class Truck extends DEAgent { /////// Constants for Messages public static final int FACTORY_ARRIVE = 0; public static final int WAREHOUSE_ARRIVE = 1; ////// Fields ///// /** * Amount of product being carried **/ public int load;

Page 57: Discrete Event Simulation CS1316: Representing Structure and Behavior

How Trucks start /** * Set up the truck * Start out at the factory **/ public void init(Simulation thisSim){ // Do the default init super.init(thisSim); this.setPenDown(false); // Pen up this.setBodyColor(Color.green); // Let green deliver! // Show the truck at the factory this.moveTo(30,350); // Load up at the factory, and set off for the warehouse load = this.newLoad(); ((DESimulation) thisSim).addEvent( new SimEvent(this,tripTime(),WAREHOUSE_ARRIVE)); }

The truck gets a load, then schedules itself to arrive at the Warehouse.

Page 58: Discrete Event Simulation CS1316: Representing Structure and Behavior

tripTime() uses the normal distribution

/** A trip distance averages 3 days */ public double tripTime(){ double delay = randNumGen.nextGaussian()+3; if (delay < 1) // Must take at least one day {return 1.0+((DESimulation) simulation).getTime();} else {return delay+((DESimulation) simulation).getTime();} }

Page 59: Discrete Event Simulation CS1316: Representing Structure and Behavior

newLoad() uses uniform

/** A new load is between 10 and 20 on a uniform distribution */

public int newLoad(){

return 10+randNumGen.nextInt(11);

}

Page 60: Discrete Event Simulation CS1316: Representing Structure and Behavior

How a Truck processes Events /** * Process an event. * Default is to do nothing with it. **/ public void processEvent(int message){ switch(message){ case FACTORY_ARRIVE: // Show the truck at the factory ((DESimulation) simulation).log(this.getName()+"\t Arrived at factory"); this.moveTo(30,350); // Load up at the factory, and set off for the warehouse load = this.newLoad(); ((DESimulation) simulation).addEvent( new SimEvent(this,tripTime(),WAREHOUSE_ARRIVE)); break;

Page 61: Discrete Event Simulation CS1316: Representing Structure and Behavior

Truck Arriving at the Warehouse case WAREHOUSE_ARRIVE: // Show the truck at the warehouse ((DESimulation) simulation).log(this.getName()+"\t Arrived at

warehouse with load \t"+load); this.moveTo(50,50); // Unload product -- takes zero time (unrealistic!) ((FactorySimulation) simulation).getProduct().add(load); load = 0; // Head back to factory ((DESimulation) simulation).addEvent( new SimEvent(this,tripTime(),FACTORY_ARRIVE)); break;

Page 62: Discrete Event Simulation CS1316: Representing Structure and Behavior

What Resources do

They keep track of what amount they have available (of whatever the resource is).

They keep a queue of agents that are blocked on this resource.

They can add to the resource, or have it consume(d).• When more resource comes in, the head of the queue

gets asked if it’s enough. If so, it can unblock.

Page 63: Discrete Event Simulation CS1316: Representing Structure and Behavior

How Resources alert agents /** * Add more produced resource. * Is there enough to unblock the first * Agent in the Queue? **/ public void add(int production) { amount = amount + production; if (!blocked.empty()){ // Ask the next Agent in the queue if it can be unblocked DEAgent topOne = (DEAgent) blocked.peek(); // Is it ready to run given this resource? if (topOne.isReady(this)) { // Remove it from the queue topOne = (DEAgent) blocked.pop(); // And tell it it’s unblocked topOne.unblocked(this); } } }

Page 64: Discrete Event Simulation CS1316: Representing Structure and Behavior

An example blocking agent: Distributor/** * Distributor -- takes orders from Market to Warehouse, * fills them, and returns with product. **/public class Distributor extends DEAgent { /////// Constants for Messages public static final int MARKET_ARRIVE = 0; public static final int MARKET_LEAVE = 1; public static final int WAREHOUSE_ARRIVE = 2; /** AmountOrdered so-far */ int amountOrdered;

Page 65: Discrete Event Simulation CS1316: Representing Structure and Behavior

Distributors start in the Market public void init(Simulation thisSim){ //First, do the normal stuff super.init(thisSim); this.setPenDown(false); // Pen up this.setBodyColor(Color.blue); // Go Blue! // Show the distributor in the market this.moveTo(600,460); // At far right // Get the orders, and set off for the warehouse amountOrdered = this.newOrders(); ((DESimulation) thisSim).addEvent( new SimEvent(this,tripTime(),WAREHOUSE_ARRIVE)); }

Page 66: Discrete Event Simulation CS1316: Representing Structure and Behavior

Distributors have 3 events

Arrive in Market: Schedule how long it’ll take to deliver.

Leave Market: Schedule arrive at the Factory

Arrive at Warehouse: Is there enough product available? If not, block and wait for trucks to bring enough product.

Page 67: Discrete Event Simulation CS1316: Representing Structure and Behavior

Processing Distributor Events /** * Process an event. * Default is to do nothing with it. **/ public void processEvent(int message){ switch(message){ case MARKET_ARRIVE: // Show the distributor at the market, far left ((DESimulation) simulation).log(this.getName()+"\t Arrived at

market"); this.moveTo(210,460); // Schedule time to deliver ((DESimulation) simulation).addEvent( new SimEvent(this,timeToDeliver(),MARKET_LEAVE)); break;

Page 68: Discrete Event Simulation CS1316: Representing Structure and Behavior

Leaving the Market

case MARKET_LEAVE: // Show the distributor at the market, far right ((DESimulation) simulation).log(this.getName()+"\t

Leaving market"); this.moveTo(600,460); // Get the orders, and set off for the warehouse amountOrdered = this.newOrders(); ((DESimulation) simulation).addEvent( new

SimEvent(this,tripTime(),WAREHOUSE_ARRIVE)); break;

Page 69: Discrete Event Simulation CS1316: Representing Structure and Behavior

Arriving at the Warehouse case WAREHOUSE_ARRIVE: // Show the distributor at the warehouse ((DESimulation) simulation).log(this.getName()+"\t Arrived at warehouse"); this.moveTo(600,50); // Is there enough product available? Resource warehouseProduct = ((FactorySimulation) simulation).getProduct(); if (warehouseProduct.amountAvailable() >= amountOrdered) { // Consume the resource for the orders warehouseProduct.consume(amountOrdered); // Zero time to load? ((DESimulation) simulation).log(this.getName()+"\t Gathered product for orders of \

t"+amountOrdered); // Schedule myself to arrive at the Market ((DESimulation) simulation).addEvent( new SimEvent(this,tripTime(),MARKET_ARRIVE)); } else {// We have to wait until more product arrives! ((DESimulation) simulation).log(this.getName()+"\t is blocking"); waitFor(((FactorySimulation) simulation).getProduct());} break;

Page 70: Discrete Event Simulation CS1316: Representing Structure and Behavior

Is there enough product?

/** Are we ready to be unlocked? */

public boolean isReady(Resource res) {

// Is the amount in the factory more than our orders?

return ((FactorySimulation) simulation).getProduct().amountAvailable() >= amountOrdered;}

Page 71: Discrete Event Simulation CS1316: Representing Structure and Behavior

If so, we’ll be unblocked /** * I've been unblocked! * @param resource the desired resource **/ public void unblocked(Resource resource){ super.unblocked(resource); // Consume the resource for the orders ((DESimulation) simulation).log(this.getName()+"\t unblocked!"); resource.consume(amountOrdered); // Zero time to load? ((DESimulation) simulation).log(this.getName()+"\t Gathered product for

orders of \t"+amountOrdered); // Schedule myself to arrive at the Market ((DESimulation) simulation).addEvent( new SimEvent(this,tripTime(),MARKET_ARRIVE)); }

Page 72: Discrete Event Simulation CS1316: Representing Structure and Behavior

The Overall Factory Simulation/** * FactorySimulation -- set up the whole simulation, * including creation of the Trucks and Distributors. **/public class FactorySimulation extends DESimulation { private Resource product; /** * Accessor for factory **/ public FactoryProduct getFactory(){return factory;}

Page 73: Discrete Event Simulation CS1316: Representing Structure and Behavior

Setting up the Factory Simulation

public void setUp(){ // Let the world be setup super.setUp(); // Give the world a reasonable background FileChooser.setMediaPath("D:/cs1316/MediaSources/"); world.setPicture(new Picture(

FileChooser.getMediaPath("EconomyBackground.jpg")));

// Create a warehouse resource product = new Resource(); //Track product // Create three trucks Truck myTruck = null; for (int i=0; i<3; i++){ myTruck = new Truck(world,this); myTruck.setName("Truck: "+i);}

// Create five Distributors Distributor sales = null; for (int i=0; i<5; i++){ sales = new Distributor(world,this); sales.setName("Distributor: "+i);} }

Page 74: Discrete Event Simulation CS1316: Representing Structure and Behavior

The Master Data Structure List:We use almost everything here!

Queues: For storing the agents waiting in line.

EventQueues: For storing the events scheduled to occur.

LinkedList: For storing all the agents.