rendered paste bodyimport java.util.Scanner;
import java.util.Random;
import java.lang.Math;
public class sim2
{
static double TSs=0,TQs=0,Ws=0,T=0,constant,lambda,TS,runTime,a,c;
static int TSc=0,TQc=0,Wc=0,Birthcount=0; //counters
static double Lprob = 0;
static LList planner = new LList();
static LList queue = new LList();
public static void main(String[] args){
lambda = 30;
TS = .03;
runTime = 100;
c = .05;
//c = .001/.01/.02/.05<==============================================
constant = runTime / 200;//monitering
planner.insert(T + getRandTime(lambda), 0 , 0);
planner.insert(T + constant, 2, 0);
while(T < runTime){
double b;
T = planner.head.time;
b = planner.head.func;
planner.remove();
if(b == 0){
birth();}
else if(b == 1){
death();}
else if(b == 2){
monitor();
}
}
results();
}
public static double getRandTime(double rate){
double U,V;
Random r = new Random();
U = r.nextDouble();
V = - Math.log(1-U)/rate;
return V;
}
public static void birth(){
Birthcount++;
queue.insertEnd(T, 0, getRandTime(1.0/TS));//generates time wanted serving
planner.insert(T + getRandTime(lambda), 0 , 0);//inserts next birth
if(queue.head.wants > c){//wants more than time slice
planner.insert(T + c, 1 , 0);//birth for continous
queue.head.wants = c - queue.head.wants;//subtract time already served
}else{//time slice is enought
planner.insert(T + queue.head.wants, 1 , 0);//death upon wanting
queue.head.wants =0;//needs no more time serving
}
}
public static void death(){
double initT = queue.head.time;//get timestamp
double headw = queue.head.wants;//get wanting serve
if(queue.head.wants == 0){//success, update counters
TQs += (T-initT)/100;//updating time and changing units.
TQc++;
queue.remove();
}else{
queue.insertEnd(initT, 0, headw);//wants more, rebirth
queue.remove();
}
}
public static void monitor(){
Ws += queue.total;
Wc++;
planner.insert(T + constant, 2, 0);
}
public static void results(){
double Lamb,Ts,Ro,Q,W=0,Tq,Tw=0;
//calculate real values
Lamb = lambda;
Ts = TS;
Ro = Lamb*Ts;
Q = Ro / (1 - Ro);
W = Q - Ro;
Tq = Q / Lamb;
Tw = W / Lamb;
//output real values
System.out.println("Real Values:\n");
System.out.println("Tq = " + Tq);
System.out.println("---------------------------");
//calculate observed values
Lamb = Birthcount / runTime;
Ts = TSs / TSc;
Ro = Lamb*Ts;
Q = Ro / (1 - Ro);
W = Ws/Wc;
Tq = TQs/ TQc;
Tw = W/Lamb;
//output observed values
System.out.println("Observed Values: for c: " + c + "\n");
System.out.println("Tq = " + Tq);
System.out.println("---------------------------");
}
}