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
75import { useEffect, useState } from "react"
export default function Sim(){
// u customers per hour
// a average number of customers that can be served in an hour
// expected wait = a / u(u-a)
// expected customers waiting at any time = a^2 / u(u-a)
// scan time = 5s each
// customers per hour = 60*60 (seconds in an hour) / scan time
// inputs
const [ scanTime, setScanTime ] = useState(5);
const [ customers,SetCustomers ] = useState(1); // customers running 1 scan a week
const [ averageScanSize, setAverageScanSize ] = useState(5000);
//const [ weeklyScansPerCustomer, setWeeklyScansPerCustomer ] = useState(1);
// intermediates
const [λ, setλ] = useState(0); // requests arriving per hour
const [μ, setμ] = useState(0); // scans able to be processed per hour
// outputs
const [ expectedWait, setExpectedWait ] = useState(0)
const [ expectedCustomersInQueue, setExpectedCustomersInQueue ] = useState(0);
useEffect(()=>{
setμ( 1/scanTime ); // scans able to be processed per second
setλ( customers / (7 * 24 * 60 * 60 ) ); // Customers running scans per second
let serviceRate = μ/averageScanSize;
console.log(serviceRate);
setExpectedWait( 1 / ( μ - λ ) );
setExpectedCustomersInQueue( μ / ( 1-μ ) );
},[
scanTime,
//weeklyScansPerCustomer,
customers, λ, μ, averageScanSize])
return (
<>
<div>
<input value={scanTime} id="scanTime" /><label htmlFor="scanTime">Average Scan Time</label>
</div>
<div>
<input value={customers} id="customers" /><label htmlFor="customers">Customers</label>
</div>
<div>
{ μ } Scans Able to Be Processed
</div>
<div>
{ λ.toFixed(2) } Expected Scans Requested
</div>
<div>
{ expectedCustomersInQueue.toFixed(2) } Expected Average Customers in Queue
</div>
<div>
{ expectedWait.toFixed(2) } Expected Average Wait
</div>
</>
)
}
/*
Buses arrive every 30 minutes on average, so that's an average rate of 2 per hour.
I arrive at the bus station, I can use this to generate the next bus ETA:
randomExponential(2); // => 0.3213031016466269 hours, i.e. 19 minutes
*/
// Exponential random number generator
function randomExponential(lambda:number) {
return - Math.log(1 - Math.random()) / lambda;
}