#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <sstream>
using namespace std;
void generateGnuplotScript(const vector<double>& G, const vector<double>& sucplain, const vector<double>& sucslotted) {
ofstream scriptFile("plot_script.gnu");
if (!scriptFile.is_open()) {
cerr << "Failed to open plot script file!" << endl;
return;
}
scriptFile << "set terminal png\n";
scriptFile << "set output 'plot.png'\n";
scriptFile << "set xlabel 'G'\n";
scriptFile << "set ylabel 'Throughput'\n";
scriptFile << "plot '-' with lines title 'Plain ALOHA', '-' with lines title 'Slotted ALOHA'\n";
for (int i = 0; i < G.size(); ++i) {
scriptFile << G[i] << " " << sucplain[i] << endl;
}
scriptFile << "e\n";
for (int i = 0; i < G.size(); ++i) {
scriptFile << G[i] << " " << sucslotted[i] << endl;
}
scriptFile << "e\n";
scriptFile.close();
cout << "Gnuplot script generated successfully!" << endl;
}
int main() {
const int N = 100000; // Number of packets in unit time
vector<double> PacketArrivalTimes(N);
// Generate random numbers between 0 and 1
generate(PacketArrivalTimes.begin(), PacketArrivalTimes.end(), []() { return rand() / (double)RAND_MAX; });
// Sort PacketArrivalTimes
sort(PacketArrivalTimes.begin(), PacketArrivalTimes.end());
vector<double> y1(N - 1);
vector<double> y2(N - 1);
// Calculate left difference between arrival times
for (int i = 0; i < N - 1; ++i) {
y1[i] = PacketArrivalTimes[i + 1] - PacketArrivalTimes[i];
}
// Calculate right difference (shift x by 1)
for (int i = 0; i < N - 1; ++i) {
y2[i] = PacketArrivalTimes[(i + 1) % N] - PacketArrivalTimes[i];
}
vector<double> sucplain(100);
vector<double> sucslotted(100);
vector<double> G(100);
// Varying G between 0 and 1.5 in 100 steps
for (int m = 0; m < 100; ++m) {
G[m] = m / 66.0;
double dur = G[m] / N;
int NumberSuccessfulPlain = 0;
int NumberSuccessfulSlotted = 0;
// Count successful transmissions for Plain ALOHA and Slotted ALOHA
for (int i = 0; i < N - 1; ++i) {
if (y1[i] > dur && y2[i] > dur) {
++NumberSuccessfulPlain;
}
if (y1[i] > dur) {
++NumberSuccessfulSlotted;
}
}
// Calculate throughput for Plain ALOHA and Slotted ALOHA
sucplain[m] = NumberSuccessfulPlain * dur;
sucslotted[m] = NumberSuccessfulSlotted * dur;
}
// Generate Gnuplot script
generateGnuplotScript(G, sucplain, sucslotted);
// Invoke Gnuplot
system("gnuplot plot_script.gnu");
return 0;
}