-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTraffic.java
More file actions
169 lines (135 loc) · 4.51 KB
/
Copy pathTraffic.java
File metadata and controls
169 lines (135 loc) · 4.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
/*****************************************************************************/
//program simulates traffic dynamics
public class Traffic
{
private final int EMPTY = 0; //empty location
private final int PLUS = 1; //type one vehicle moves down
private final int MINUS = 2; //type two vehicle moves right
private int[][] array; //array of vehicles
private int size; //size of array
private int iterations; //number iterations
private double density; //density of vehicles
private Random random; //random number generator
private TrafficDrawer drawer; //drawing object
private int seed; //seed value for printing later
/*****************************************************************************/
//Constructor of traffic class
public Traffic(int size, int iterations, double density, int seed)
{
this.array = new int[size][size]; //create array
this.size = size; //set size
this.iterations = iterations; //set iterations
this.density = density; //set density
this.random = new Random(seed); //create random number generator
this.seed = seed; //store seed value for output later
this.drawer = new TrafficDrawer(array, size); //create drawing object
}
/*****************************************************************************/
//Method runs simulation
public void run(String fileLoc) throws IOException
{
DecimalFormat df = new DecimalFormat(".00");
df.setRoundingMode(RoundingMode.DOWN);
PrintWriter outFile = new PrintWriter(new FileWriter(fileLoc));
outFile.println("***********************************");
outFile.println("* Size = " + size);
outFile.println("* Iterations = " + iterations);
outFile.println("* Density = " + density);
outFile.println("* Seed = " + seed);
outFile.println("***********************************");
//initialize vehicles
initialize();
//keeps track of how many times a car goes to move but cant
//in this particular vehicle update
int tempGridLock = 0;
//keeps track of how many times a car moves without impediment
//used for calculating gridlock percentage later
int nonGridLock = 0;
//keeps track of gridlock percentage
double gridLockPercent = 0;
//run iterations
for (int n = 0; n < iterations; n++)
{
//reset variables for iteration re-use
tempGridLock = 0;
nonGridLock = 0;
gridLockPercent = 0;
//draw array
draw();
//update vehicles
for (int m = 0; m < size * size; m++)
{
//pick a location randomly
int i = random.nextInt(size);
int j = random.nextInt(size);
//if down moving vehicle
if (array[i][j] == PLUS)
{
if (array[(i+1)%size][j] == EMPTY) //if down is empty
{
array[i][j] = EMPTY; //move down
array[(i+1)%size][j] = PLUS;
nonGridLock = nonGridLock + 1;
}
else if (array[(i+1)%size][j] == MINUS || array[(i+1)%size][j] == PLUS)
{
tempGridLock = tempGridLock + 1;
}
}
//if right moving vehicle
else if (array[i][j] == MINUS)
{
if (array[i][(j+1)%size] == EMPTY) //if right is empty
{
array[i][j] = EMPTY; //move right
array[i][(j+1)%size] = MINUS;
nonGridLock = nonGridLock + 1;
}
else if (array[i][(j+1)%size] == MINUS || array[i][(j+1)%size] == PLUS)
{
tempGridLock = tempGridLock + 1;
}
}
//if location is empty do nothing
}
gridLockPercent = tempGridLock + nonGridLock;
gridLockPercent = tempGridLock / gridLockPercent;
gridLockPercent = gridLockPercent * 100;
outFile.println(df.format(gridLockPercent));
}
outFile.close();
}
/*****************************************************************************/
//Method initializes vehicles
private void initialize()
{
//go through all locations
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
if (random.nextDouble() < density)
{
if (random.nextDouble() < 0.5) //assign down vehicle
array[i][j] = PLUS;
else
array[i][j] = MINUS; //assign right vehicle
}
else
array[i][j] = EMPTY; //assign empty location
}
}
}
/*****************************************************************************/
//method draws array of vehicles
private void draw()
{
drawer.repaint(); //repaint array
//try {Thread.sleep(1);} catch(Exception e){} //pause
}
/*****************************************************************************/
}