Advertisement
Guest User

Untitled

a guest
Dec 18th, 2012
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.60 KB | None | 0 0
  1. import java.util.ArrayList;
  2.  
  3. public class simulator {
  4.    
  5.     private double clock,T;
  6.     private ArrayList<Server> servers;
  7.     private ArrayList<Message> messageQueue;
  8.     private EventGenerator eventGenerator;
  9.     private int serverDrops;
  10.     private double totalHandlingTime;
  11.     private int M;
  12.     simulator(double lambda,double miu,double alpha,double beta,int k,double T)
  13.     {
  14.         this.T = T;
  15.         clock = 0;
  16.         serverDrops = 0;
  17.         totalHandlingTime = 0;
  18.         M = 0;
  19.         Message.DISTRIBUTION = lambda;
  20.         ServerDrop.DISTRIBUTION = alpha;
  21.         ServerRepair.DISTRIBUTION = beta;
  22.         messageQueue = new ArrayList<Message>();
  23.         eventGenerator = new EventGenerator();
  24.         servers = new ArrayList<Server>(k);
  25.         for (int i = 0 ; i < k ; ++i)
  26.         {
  27.             servers.add(new Server(miu));
  28.         }
  29.     }
  30.    
  31.     private int countMessages()
  32.     {
  33.         int count = messageQueue.size();
  34.         for (Server s : servers)
  35.         {
  36.             if (!s.isFree())
  37.                 ++count;
  38.         }
  39.         return count;
  40.     }
  41.     private Server getMinimalFreeServer()
  42.     {
  43.         Server minServer = null;
  44.         for (Server server : servers)
  45.         {
  46.             if (server.isActive && server.isFree())
  47.             {
  48.                 if (minServer == null)
  49.                 {
  50.                     minServer = server;
  51.                 }
  52.                 else
  53.                 {
  54.                     if (server.operationEnd < minServer.operationEnd)
  55.                     {
  56.                         minServer = server;
  57.                     }
  58.                 }
  59.             }
  60.         }
  61.         return minServer;
  62.     }
  63.    
  64.     private Server getMinimalServer()
  65.     {
  66.         Server minServer = servers.get(0);
  67.         for (Server server : servers)
  68.         {
  69.             if (server.isActive && server.operationEnd < minServer.operationEnd)
  70.                 minServer = server;
  71.         }
  72.         return minServer;
  73.     }
  74.     private void DisableServer()
  75.     {
  76.         for (Server s : servers)
  77.         {
  78.             if (s.isActive == true)
  79.             {
  80.                 s.isActive = false;
  81.                 if (!s.isFree()) {
  82.                     messageQueue.add(s.disable(clock));
  83.                 }
  84.                 break;
  85.             }
  86.         }
  87.         ++serverDrops;
  88.     }
  89.    
  90.     private void EnableServer()
  91.     {
  92.         for (Server s : servers)
  93.         {
  94.             if (s.isActive == false)
  95.             {
  96.                 s.isActive = true;
  97.                 if (!messageQueue.isEmpty())
  98.                     s.addMessage(messageQueue.remove(0),clock);
  99.                 break;
  100.             }
  101.         }
  102.     }
  103.     private void updateServers()
  104.     {
  105.         int currentMessages = countMessages();
  106.         if (currentMessages > M)
  107.             M = currentMessages;
  108.         for (Server s : servers)
  109.         {
  110.             s.update(clock);
  111.         }
  112.     }
  113.     private void updateSimulator()
  114.     {
  115.         updateServers();
  116.         while (!messageQueue.isEmpty())
  117.         {
  118.             Server openServer = getMinimalFreeServer();
  119.             if (openServer == null)
  120.             {
  121.                 break;
  122.             }
  123.             Message message = messageQueue.remove(0);
  124.             openServer.addMessage(message, Math.max(openServer.operationEnd,message.getArrival()));
  125.             openServer.update(clock);
  126.         }
  127.     }
  128.     private void emptyQueue()
  129.     {
  130.         while (!messageQueue.isEmpty())
  131.         {
  132.             clock = getMinimalServer().operationEnd;
  133.             updateSimulator();
  134.         }
  135.     }
  136.     public void Simulate()
  137.     {
  138.         int N = 0;
  139.         while ( clock < T || !messageQueue.isEmpty() )
  140.         {
  141.             if (clock >= T)
  142.             {
  143.                 eventGenerator.StopGeneratingMessages();
  144.             }
  145.             Event event = eventGenerator.getEvent();
  146.             if (event == null)
  147.             {
  148.                 emptyQueue();
  149.                 break;
  150.             }
  151.             clock = event.getArrival();
  152.             if (event instanceof Message)
  153.             {
  154.                 messageQueue.add((Message)event);
  155.             }
  156.             else if (event instanceof ServerDrop)
  157.             {
  158.                 DisableServer();
  159.             }
  160.             else {
  161.                 EnableServer();
  162.             }
  163.             updateSimulator();
  164.         }
  165.         for (Server s : servers)
  166.         {
  167.             N+=s.messagesHandled;
  168.             totalHandlingTime += s.totalHandlingTime;
  169.         }
  170.         System.out.println(N + " " + serverDrops + " " + totalHandlingTime/clock
  171.                            + " " + clock + " " + totalHandlingTime/N + " " + M);       
  172.     }
  173.     public static void main(String args[])
  174.     {
  175.         new simulator(50,63,0,1,1,10000).Simulate();
  176.     }
  177. }
  178.  
  179. import java.util.Random;
  180.  
  181.  
  182. public class Exponential {
  183.     public static double Instance(double miu)
  184.     {
  185.         return -Math.log(new Random().nextDouble())/miu;
  186.     }
  187. }
  188.  
  189.  
  190. class Server {
  191.     public Message activeMessage;
  192.     public double miu;
  193.     public double operationStart,operationEnd;
  194.     public double totalHandlingTime;
  195.     public boolean isActive;
  196.     public int messagesHandled;
  197.     Server(double miu) {
  198.         activeMessage = null;
  199.         operationStart = 0;
  200.         operationEnd = 0;
  201.         messagesHandled = 0;
  202.         totalHandlingTime = 0;
  203.         this.miu = miu;
  204.         isActive = true;
  205.     }
  206.     public boolean isFree() { return (activeMessage == null); }
  207.     public void update(double clock) {
  208.         if ( clock >= operationEnd && activeMessage != null)
  209.         {
  210.             ++messagesHandled;
  211.             totalHandlingTime += operationEnd - activeMessage.getArrival();
  212.             activeMessage = null;
  213.         }
  214.     }
  215.     public Message disable(double clock)
  216.     {
  217.         Message message = (activeMessage == null) ? null :  new Message(activeMessage);
  218.         if (activeMessage != null)
  219.             totalHandlingTime += clock - operationStart;
  220.         activeMessage = null;
  221.         isActive = false;
  222.         return message;
  223.     }
  224.     public void addMessage(Message message,double time)
  225.     {
  226.         if (message == null)
  227.         {
  228.             return;
  229.         }
  230.         activeMessage = message;
  231.         operationStart = time;
  232.         operationEnd = operationStart + Exponential.Instance(miu);
  233.     }
  234. }
  235.  
  236. class EventGenerator {
  237.     private Message message;
  238.     private ServerDrop serverDrop;
  239.     private ServerRepair serverRepair;
  240.     private boolean generateMessages;
  241.     private boolean generateRepairs;
  242.     private boolean generateDrops;
  243.     public void StopGeneratingMessages() {
  244.         generateMessages = false;
  245.     }
  246.     public EventGenerator()
  247.     {
  248.         message = new Message(Exponential.Instance(Message.DISTRIBUTION));
  249.         serverDrop = new ServerDrop(Exponential.Instance(ServerDrop.DISTRIBUTION));
  250.         serverRepair = new ServerRepair(Exponential.Instance(ServerRepair.DISTRIBUTION));
  251.         generateMessages = (Message.DISTRIBUTION != 0);
  252.         generateRepairs = (ServerRepair.DISTRIBUTION != 0);
  253.         generateDrops = (ServerDrop.DISTRIBUTION != 0);
  254.     }
  255.  
  256.     public Event getEvent() {
  257.         Event result;
  258.         if ( (generateMessages == true) &&
  259.            ( (message.getArrival() <= serverDrop.getArrival()) || (generateDrops == false) ) &&
  260.            ( (message.getArrival() <= serverRepair.getArrival()) || (generateRepairs == false) ))
  261.         {
  262.             double exponentialInstance = Exponential.Instance(Message.DISTRIBUTION);
  263.             result = new Message(message.getArrival());
  264.             message = new Message(message.getArrival()+exponentialInstance);
  265.         }
  266.         else if ( (generateDrops == true) &&
  267.                 ( (serverDrop.getArrival() <= serverRepair.getArrival()) || (generateRepairs == false) ) )
  268.         {
  269.             double exponentialInstance = Exponential.Instance(ServerDrop.DISTRIBUTION);
  270.             result = new ServerDrop(serverDrop);
  271.             serverDrop = new ServerDrop(serverDrop.getArrival()+exponentialInstance);
  272.         }
  273.         else if (generateRepairs == true)
  274.         {
  275.             double exponentialInstance = Exponential.Instance(ServerRepair.DISTRIBUTION);
  276.             result = new ServerRepair(serverRepair);
  277.             serverRepair = new ServerRepair(serverRepair.getArrival()+exponentialInstance);
  278.         }
  279.         else
  280.         {
  281.             result = null;
  282.         }
  283.         return result;
  284.     }
  285. }
  286.  
  287. class Event {
  288.     public double getArrival() { return arrival; }
  289.     public void setArrival(double arrival) { this.arrival = arrival; }
  290.     public Event(double start) { this.arrival = start; }
  291.     public Event(Event e) {
  292.         this.arrival = e.arrival;
  293.     }
  294.     private double arrival;
  295. }
  296.  
  297. class Message extends Event {
  298.     public static double DISTRIBUTION;
  299.     public Message(double start) {
  300.         super(start);
  301.     }
  302.     public Message(Message message) {
  303.         super(message);
  304.     }
  305.  
  306. }
  307.  
  308. class ServerDrop extends Event {
  309.     public static double DISTRIBUTION;
  310.     public ServerDrop(double start) {
  311.         super(start);
  312.     }
  313.     public ServerDrop(ServerDrop serverDrop) {
  314.         super(serverDrop);
  315.     }
  316. }
  317.  
  318. class ServerRepair extends Event {
  319.     public static double DISTRIBUTION;
  320.     public ServerRepair(double start) {
  321.         super(start);
  322.     }
  323.     public ServerRepair(ServerRepair serverRepair) {
  324.         super(serverRepair);
  325.     }
  326. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement