mirror of
https://github.com/Zenithsiz/ist-ddrs-lab2
synced 2026-02-03 22:23:55 +00:00
37 lines
1.3 KiB
R
37 lines
1.3 KiB
R
# Calculates the throughput of a network using the kleinrock approximation
|
|
approx_kleinrock <- function(link_capacities, flows, packet_size) {
|
|
# Calculate the arrival rates per link and for the whole network
|
|
# (bits / s)
|
|
λ_network <- 0
|
|
λ_per_link <- replicate(length(link_capacities), 0)
|
|
for (flow in flows) {
|
|
λ_network <- λ_network + flow$rate
|
|
for (link_idx in flow$route) {
|
|
λ_per_link[link_idx] <- λ_per_link[link_idx] + flow$rate
|
|
}
|
|
}
|
|
|
|
# Then calculate the service rates
|
|
# (packets / s)
|
|
μ_per_link <- link_capacities / packet_size
|
|
|
|
# Then the average packets per link and in the network
|
|
# (packets)
|
|
avg_packets_per_link <- λ_per_link / (μ_per_link - λ_per_link)
|
|
avg_packets_network <- sum(avg_packets_per_link)
|
|
|
|
# And finally the average packet delay per link, then flow and in the network
|
|
# (seconds)
|
|
avg_packet_delay_network <- sum(avg_packets_per_link) / λ_network
|
|
avg_packet_delay_per_link <- 1 / (μ_per_link - λ_per_link)
|
|
avg_packet_delay_per_flow <- lapply(flows, function(flow) {
|
|
sum(sapply(flow$route, function(link_idx) avg_packet_delay_per_link[link_idx]))
|
|
})
|
|
|
|
list(
|
|
avg_packet_delay_per_flow = avg_packet_delay_per_flow,
|
|
avg_packet_delay_network = avg_packet_delay_network,
|
|
avg_packets_network = avg_packets_network
|
|
)
|
|
}
|