Guest User

Untitled

a guest
Sep 22nd, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.32 KB | None | 0 0
  1. import java.util.Scanner;
  2. import cs2030.simulator.Event;
  3. import cs2030.simulator.Customer;
  4. import cs2030.simulator.EventComparator;
  5. import cs2030.simulator.EventManager;
  6. import cs2030.simulator.ArrivalEvent;
  7.  
  8.  
  9.  
  10. public class Main {
  11. public static void main(String[] args) {
  12. Scanner sc = new Scanner(System.in);
  13. int seed = sc.nextInt();
  14. int numServers = sc.nextInt();
  15. int numCustomer = sc.nextInt();
  16. double arrivalRate = sc.nextDouble();
  17. double svcRate = sc.nextDouble();
  18. double restRate = 1.0;
  19.  
  20. EventManager eventManager = new EventManager(numServers, numCustomer,
  21. seed,arrivalRate,svcRate,restRate);
  22. eventManager.doService();
  23. }
  24. }
  25.  
  26. package cs2030.simulator;
  27. import java.util.PriorityQueue;
  28.  
  29. public class EventManager {
  30. Server [] servers;
  31. PriorityQueue<Event> events;
  32. Statistics statistics = new Statistics();
  33. RandomGenerator gen;
  34.  
  35. public EventManager (int numServers, int numCustomer,
  36. int seed, double arrivalRate, double svcRate, double restRate) {
  37. this.events = new PriorityQueue<>(new EventComparator());
  38. this.gen = new RandomGenerator(seed, arrivalRate,svcRate,restRate);
  39. double time = 0;
  40. Customer customer = new Customer(time);
  41. ArrivalEvent tempEvent = new ArrivalEvent(customer,time);
  42. events.add(tempEvent);
  43. for (int i = 0;i < numCustomer-1;i++) {
  44. double x = gen.genInterArrivalTime();
  45. time += x;
  46. customer = new Customer(time);
  47. tempEvent = new ArrivalEvent(customer,time);
  48. events.add(tempEvent);
  49. }
  50. this.servers = new Server [numServers];
  51. for (int i = 0;i < numServers;i++){
  52. this.servers[i] = new Server();
  53. }
  54. }
  55.  
  56. public void doService(){
  57. while (events.size() > 0){
  58. Event firstEvent = getFirstEvent();
  59. System.out.println(firstEvent);
  60. Event newEvent = firstEvent.getNextEvent(servers,gen);
  61. if (newEvent != null){
  62. newEvent.updateStatistics(statistics);
  63. events.add(newEvent);
  64. }
  65.  
  66. }
  67. System.out.println(statistics);
  68. }
  69.  
  70. public Event getFirstEvent() {
  71. return events.poll();
  72. }
  73. }
  74.  
  75. package cs2030.simulator;
  76.  
  77. public class Customer {
  78. private static int counter = 1;
  79. private final int customerID;
  80. private final double time;
  81.  
  82. public Customer(double time) {
  83. this.customerID = counter;
  84. this.time = time;
  85. counter++;
  86. }
  87.  
  88. public int getCustomerID() {
  89. return this.customerID;
  90. }
  91.  
  92. public double getTime() {
  93. return this.time;
  94. }
  95.  
  96. }
  97.  
  98. package cs2030.simulator;
  99.  
  100. class Statistics {
  101. private double waitingTime = 0;
  102. private int numLeft = 0;
  103. private int numServed = 0;
  104.  
  105. public Statistics(){}
  106.  
  107. public void increaseServed() {
  108. numServed++;
  109. }
  110.  
  111. public void increaseWaitingTime(double time) {
  112. waitingTime += time;
  113. }
  114.  
  115. public void increaseLeft() {
  116. numLeft++;
  117. }
  118.  
  119. public String toString() {
  120. double x = waitingTime / numServed;
  121. return '[' + String.format("%.3f",x) + ' ' +
  122. numServed + ' ' + numLeft + ']';
  123. }
  124. }
  125.  
  126. package cs2030.simulator;
  127.  
  128. class Server {
  129. private static int counter = 1;
  130. private int serverID;
  131. private Event served = null;
  132. private Event wait = null;
  133.  
  134. public Server() {
  135. this.serverID = counter;
  136. counter++;
  137. }
  138.  
  139. public int getServerID() {
  140. return this.serverID;
  141. }
  142.  
  143. public void setServedEvent(Event newEvent) {
  144. this.served = newEvent;
  145. }
  146. public void setWaitEvent (Event newEvent) {
  147. this.wait = newEvent;
  148. }
  149.  
  150. public boolean canTakeServedEvent() {
  151. return (served == null && wait == null);
  152. }
  153.  
  154. public boolean canTakeWaitEvent() {
  155. return (served != null && wait == null);
  156. }
  157.  
  158. public void flushDoneEvent(DoneEvent event) {
  159. if (served != null) {
  160. served = null;
  161. }
  162. if (wait != null) {
  163. served = wait;
  164. wait = null;
  165. }
  166. }
  167.  
  168. public double getDoneTime() {
  169. return this.served.getTime();
  170. }
  171. }
  172.  
  173. package cs2030.simulator;
  174. import java.util.Comparator;
  175.  
  176.  
  177. public class EventComparator implements Comparator<Event> {
  178. public int compare(Event e1, Event e2) {
  179. if (e1.getTime() < e2.getTime()) {
  180. return -1;
  181. } else if (e1.getTime() > e2.getTime()) {
  182. return 1;
  183. } else if (e1.getCustomerID() < e2.getCustomerID()) {
  184. return -1;
  185. } else if (e1.getCustomerID() > e2.getCustomerID()) {
  186. return 1;
  187. } else {
  188. System.out.println("Bug with code, please check");
  189. return 0;
  190. }
  191.  
  192. }
  193. }
  194.  
  195. package cs2030.simulator;
  196.  
  197. public abstract class Event {
  198. private final Customer customer;
  199. private final double time;
  200.  
  201. public Event(Customer customer, double time) {
  202. this.customer = customer;
  203. this.time = time;
  204. }
  205.  
  206. public abstract Event getNextEvent(Server [] servers,RandomGenerator gen);
  207.  
  208. public abstract void updateStatistics(Statistics statistics);
  209.  
  210. public Customer getCustomer() {
  211. return this.customer;
  212. }
  213.  
  214. public int getCustomerID() {
  215. return this.customer.getCustomerID();
  216. }
  217.  
  218. public double getTime() {
  219. return this.time;
  220. }
  221. }
  222.  
  223. package cs2030.simulator;
  224.  
  225. public class ArrivalEvent extends Event {
  226. public ArrivalEvent(Customer customer, double time) {
  227. super(customer, time);
  228. }
  229.  
  230. public Event getNextEvent(Server [] servers,RandomGenerator gen) {
  231. Server freeServer = getFreeServer(servers);
  232. if (freeServer == null) {
  233. return createLeaveEvent();
  234. } else if (freeServer.canTakeServedEvent()) {
  235. ServedEvent newEvent = createServedEvent(freeServer);
  236. freeServer.setServedEvent(newEvent);
  237. return newEvent;
  238. } else if (freeServer.canTakeWaitEvent()) {
  239. WaitEvent newEvent = createWaitEvent(freeServer);
  240. freeServer.setWaitEvent(newEvent);
  241. return newEvent;
  242. } else {
  243. System.out.println("Bug in ArrivalEvents");
  244. return null;
  245. }
  246. }
  247.  
  248.  
  249. public LeaveEvent createLeaveEvent() {
  250. return new LeaveEvent(this.getCustomer(),this.getTime());
  251. }
  252.  
  253. public ServedEvent createServedEvent(Server freeServer) {
  254. return new ServedEvent(this.getCustomer(),this.getTime(),freeServer);
  255. }
  256.  
  257. public WaitEvent createWaitEvent(Server freeServer) {
  258. return new WaitEvent(this.getCustomer(),this.getTime(),freeServer);
  259. }
  260.  
  261. public void updateStatistics(Statistics statistics) {
  262. return;
  263. }
  264.  
  265. public Server getFreeServer(Server[] servers) {
  266. boolean hasFoundSlots = false;
  267. Server choiceServer = null;
  268. for (int i = 0; i < servers.length;i++) {
  269. Server newServer = servers[i];
  270. if (newServer.canTakeServedEvent()) {
  271. return newServer;
  272. } else if (newServer.canTakeWaitEvent() && !hasFoundSlots) {
  273. choiceServer = newServer;
  274. hasFoundSlots = true;
  275. }
  276. }
  277. if (hasFoundSlots == false) {
  278. return null;
  279. } else {
  280. return choiceServer;
  281. }
  282. }
  283.  
  284. public String toString() {
  285. return String.format("%.3f",this.getTime()) + ' ' +
  286. this.getCustomerID() + " arrives";
  287. }
  288. }
  289.  
  290. package cs2030.simulator;
  291.  
  292. class DoneEvent extends Event {
  293. private Server server;
  294.  
  295. public DoneEvent(Customer customer, double time, Server server) {
  296. super(customer,time);
  297. this.server = server;
  298. }
  299.  
  300. public Event getNextEvent(Server [] servers,RandomGenerator gen) {
  301. this.server.flushDoneEvent(this);
  302. return null;
  303. }
  304.  
  305. public void updateStatistics(Statistics statistics) {
  306. return;
  307. }
  308.  
  309. public String toString() {
  310. return String.format("%.3f",this.getTime()) +
  311. ' ' + this.getCustomerID() + " done serving by " +
  312. server.getServerID();
  313. }
  314.  
  315. }
  316.  
  317. package cs2030.simulator;
  318.  
  319. class WaitEvent extends Event{
  320. private Server server;
  321.  
  322. public WaitEvent(Customer customer, double time, Server server){
  323. super(customer,time);
  324. this.server = server;
  325. }
  326.  
  327. public ServedEvent getNextEvent(Server [] servers,RandomGenerator gen){
  328. if (!this.server.canTakeWaitEvent()){
  329. ServedEvent newEvent = new ServedEvent(this.getCustomer(),
  330. this.server.getDoneTime(), this.server);
  331. this.server.setWaitEvent(newEvent);
  332. return newEvent;
  333. }
  334. return null;
  335. }
  336.  
  337. public void updateStatistics(Statistics statistics){
  338. return ;
  339. }
  340.  
  341. public String toString(){
  342. return (String.format("%.3f",this.getTime()) +
  343. ' ' + this.getCustomerID() + " waits to be served by " +
  344. server.getServerID());
  345. }
  346.  
  347. }
  348.  
  349. package cs2030.simulator;
  350.  
  351. class ServedEvent extends Event {
  352. private Server server;
  353.  
  354. public ServedEvent(Customer customer, double time, Server server) {
  355. super(customer,time);
  356. this.server=server;
  357. }
  358.  
  359. public DoneEvent getNextEvent(Server [] servers,RandomGenerator gen) {
  360. double x = gen.genServiceTime​();
  361. DoneEvent newEvent = new DoneEvent(this.getCustomer(),
  362. this.getTime() + x,this.server);
  363. this.server.setServedEvent(newEvent);
  364. return newEvent;
  365. }
  366.  
  367. public void updateStatistics(Statistics statistics) {
  368. statistics.increaseServed();
  369. statistics.increaseWaitingTime(this.getTime() - this.getCustomer().getTime());
  370. }
  371.  
  372. public String toString() {
  373. return (String.format("%.3f",this.getTime()) + ' ' +
  374. this.getCustomerID() + " served by " + server.getServerID());
  375. }
  376. }
  377.  
  378. package cs2030.simulator;
  379.  
  380. class LeaveEvent extends Event {
  381. private Server server;
  382.  
  383. public LeaveEvent(Customer customer, double time) {
  384. super(customer,time);
  385. }
  386.  
  387. public Event getNextEvent(Server [] servers, RandomGenerator gen) {
  388. return null;
  389. }
  390.  
  391.  
  392. public void updateStatistics(Statistics statistics) {
  393. statistics.increaseLeft();
  394. }
  395.  
  396. public String toString() {
  397. return String.format("%.3f",this.getTime()) +
  398. ' ' + this.getCustomerID() + " leaves";
  399. }
  400.  
  401. }
  402.  
  403. 1
  404. 1
  405. 5
  406. 1.0
  407. 1.0
  408.  
  409.  
  410. 0.000 1 arrives
  411. 0.000 1 served by 1
  412. 0.313 1 done serving by 1
  413. 0.314 2 arrives
  414. 0.314 2 served by 1
  415. 0.417 2 done serving by 1
  416. 1.205 3 arrives
  417. 1.205 3 served by 1
  418. 1.904 3 done serving by 1
  419. 2.776 4 arrives
  420. 2.776 4 served by 1
  421. 2.791 4 done serving by 1
  422. 3.877 5 arrives
  423. 3.877 5 served by 1
  424. 4.031 5 done serving by 1
  425. [0.000 5 0]
  426.  
  427.  
  428. 1
  429. 2
  430. 10
  431. 1.0
  432. 1.0
  433.  
  434. 0.000 1 arrives
  435. 0.000 1 served by 1
  436. 0.313 1 done serving by 1
  437. 0.314 2 arrives
  438. 0.314 2 served by 1
  439. 0.417 2 done serving by 1
  440. 1.205 3 arrives
  441. 1.205 3 served by 1
  442. 1.904 3 done serving by 1
  443. 2.776 4 arrives
  444. 2.776 4 served by 1
  445. 2.791 4 done serving by 1
  446. 3.877 5 arrives
  447. 3.877 5 served by 1
  448. 3.910 6 arrives
  449. 3.910 6 served by 2
  450. 3.922 6 done serving by 2
  451. 4.031 5 done serving by 1
  452. 9.006 7 arrives
  453. 9.006 7 served by 1
  454. 9.043 8 arrives
  455. 9.043 8 served by 2
  456. 9.105 9 arrives
  457. 9.105 9 waits to be served by 1
  458. 9.160 10 arrives
  459. 9.160 10 waits to be served by 2
  460. 10.484 7 done serving by 1
  461. 10.484 9 served by 1
  462. 10.781 9 done serving by 1
  463. 11.636 8 done serving by 2
  464. 11.636 10 served by 2
  465. 11.688 10 done serving by 2
  466. [0.386 10 0]
Add Comment
Please, Sign In to add comment