Filipe Rodrigues 3642e545bd Finished exercise 3a.
Co-authored-by: Ricardo-Rodrigues <R1cardu7@users.noreply.github.com>
2023-12-04 16:26:37 +00:00

59 lines
1.9 KiB
R
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

require(ggplot2)
require(pracma)
status_thinking <- "Thinking"
status_backlogged <- "Backlogged"
calc_throughput <- function(slots_len, prob_backlogged, prob_thinking) {
slots <- as.list(rep(status_thinking, slots_len))
total_steps <- 50000
successes <- 0
for (cur_step in 1:total_steps) {
# Get all the slots that will be transmitting
transmitting <- sapply(seq_along(slots), function(slot_idx) {
prob <- ifelse(slots[slot_idx] == status_thinking, prob_thinking, prob_backlogged)
ifelse(rbinom(1, 1, prob) == 1, slot_idx, -1)
})
transmitting <- transmitting[transmitting != -1]
# Then check if we succeeded and set the next status of all the transmitting
success <- length(transmitting) == 1
next_status <- ifelse(success, status_thinking, status_backlogged)
for (slot_idx in transmitting) {
slots[slot_idx] <- next_status
}
# Finally if we succeeded, add it to the number of successes
successes <- successes + success
}
success_ratio <- successes / total_steps
success_ratio
}
create_graph <- function(slots_len, probs_thinking, probs_backlogged, output_file) {
throughput <- lapply(probs_backlogged, function(prob_backlogged) {
sapply(probs_thinking, function(prob_thinking) calc_throughput(slots_len, prob_backlogged, prob_thinking))
})
prob_names <- lapply(probs_backlogged, function(prob) rep(as.character(prob), length(probs_thinking)))
throughput_data <- data.frame(
x = probs_thinking,
y = unlist(throughput),
p = unlist(prob_names)
)
plot <- ggplot(throughput_data) +
geom_line(aes(.data$x, .data$y, color = .data$p)) +
scale_x_log10(limit = c(0.0005, 0.3)) +
xlab("σ") +
ylab("Throughput")
ggsave(plot, file = output_file, device = "svg")
}
set.seed(0)
pdf(NULL)
create_graph(10, logseq(1 + 1e-7, 1.3, 1000) - 1, c(0.3, 0.4, 0.5, 0.6), "output/3b-aloha10.svg")
create_graph(25, logseq(1 + 1e-7, 1.3, 1000) - 1, c(0.2, 0.3), "output/3b-aloha25.svg")