MATLAB PROGRAM
clear; clc; close all;
%% ================= PARAMETERS =================
num_clusters = 5;
nodes_per_cluster = 10;
cluster_radius = 5;
cluster_distance = 20;
SNR = -20:2:20;
num_iterations = 500;
%% ================= PREALLOCATION =================
cluster_centers = zeros(num_clusters, 2);
PU_nodes = cell(num_clusters, 1);
SU_nodes = cell(num_clusters, 1);
Pd_Voting = zeros(num_clusters, length(SNR));
Pd_Voting_WOA = zeros(num_clusters, length(SNR));
%% ================= CLUSTER GENERATION =================
for i = 1:num_clusters
% Ensure clusters do not overlap
valid_position = false;
while ~valid_position
x = randi([0, 100]);
y = randi([0, 100]);
valid_position = true;
for j = 1:i-1
if norm([x y] - cluster_centers(j,:)) < cluster_distance
valid_position = false;
break;
end
end
end
cluster_centers(i,:) = [x y];
% Generate nodes inside cluster
nodes = zeros(nodes_per_cluster,2);
nodes(1,:) = cluster_centers(i,:); % SU-CH
for j = 2:nodes_per_cluster
theta = 2*pi*rand();
r = cluster_radius * sqrt(rand());
nodes(j,:) = cluster_centers(i,:) + [r*cos(theta) r*sin(theta)];
end
% Random PU selection
num_PUs = randi([2 4]);
PU_idx = randperm(nodes_per_cluster-1, num_PUs) + 1;
PU_nodes{i} = nodes(PU_idx,:);
SU_nodes{i} = nodes(setdiff(2:nodes_per_cluster, PU_idx), :);
end
%% ================= MONTE CARLO SIMULATION =================
for i = 1:num_clusters
num_SUs = size(SU_nodes{i},1);
num_PUs = size(PU_nodes{i},1);
for snr_idx = 1:length(SNR)
snr = SNR(snr_idx);
Pd_Voting_iter = zeros(1,num_iterations);
Pd_Voting_WOA_iter = zeros(1,num_iterations);
for iter = 1:num_iterations
fading = raylrnd(1,num_SUs,num_PUs);
ED_results = zeros(num_SUs,1);
for su_idx = 1:num_SUs
energy_sum = 0;
for pu_idx = 1:num_PUs
noise = randn(1,100);
signal = sqrt(10^(snr/10)) * fading(su_idx,pu_idx);
received_signal = signal + noise;
energy = sum(abs(received_signal).^2)/length(received_signal);
energy_sum = energy_sum + energy;
end
threshold_ED = chi2inv(0.9,2);
ED_results(su_idx) = energy_sum > threshold_ED;
end
% -------- Voting Logic --------
voting_threshold = 0.5;
Pd_Voting_iter(iter) = mean(ED_results) > voting_threshold;
% -------- Voting + WOA (Improved threshold) --------
woa_threshold = 0.3;
Pd_Voting_WOA_iter(iter) = mean(ED_results) > woa_threshold;
end
Pd_Voting(i,snr_idx) = mean(Pd_Voting_iter);
Pd_Voting_WOA(i,snr_idx) = mean(Pd_Voting_WOA_iter);
end
end
%% ================= Pf COMPUTATION =================
Pf_Voting = 1 - Pd_Voting;
Pf_Voting_WOA = 1 - Pd_Voting_WOA;
%% ================= AVERAGE Pd FOR BAR PLOTS =================
avg_Pd_Voting = mean(Pd_Voting,2);
avg_Pd_Voting_WOA = mean(Pd_Voting_WOA,2);
%% ================= ENERGY MODEL AT SU-CH =================
E_RX_per_SU = 0.01; % mJ
E_comp_base = 0.05; % mJ
E_WOA = 0.03; % mJ
avg_Energy_Voting = zeros(num_clusters,1);
avg_Energy_WOA = zeros(num_clusters,1);
for i = 1:num_clusters
num_SUs = size(SU_nodes{i},1);
% Voting Energy
avg_Energy_Voting(i) = (num_SUs * E_RX_per_SU) + E_comp_base;
% Voting + WOA Energy
avg_Energy_WOA(i) = (num_SUs * E_RX_per_SU) + E_comp_base + E_WOA;
end
%% ================= PLOT 1: Pd vs SNR =================
figure;
plot(SNR, mean(Pd_Voting,1), 'o-','LineWidth',2); hold on;
plot(SNR, mean(Pd_Voting_WOA,1), 's-','LineWidth',2);
xlabel('SNR (dB)');
ylabel('Probability of Detection (P_d)');
title('P_d vs SNR');
legend('Voting','Voting with WOA','Location','southeast');
ylim([0 1]);
grid on;
%% ================= PLOT 2: Pf vs SNR =================
figure;
plot(SNR, mean(Pf_Voting,1), 'o-','LineWidth',2); hold on;
plot(SNR, mean(Pf_Voting_WOA,1), 's-','LineWidth',2);
xlabel('SNR (dB)');
ylabel('Probability of False Alarm (P_f)');
title('P_f vs SNR');
legend('Voting','Voting with WOA','Location','northeast');
ylim([0 1]);
grid on;
%% ================= PLOT 3: Avg Energy at SU-CH =================
figure;
bar([avg_Energy_Voting avg_Energy_WOA],'grouped');
xlabel('Cluster Index');
ylabel('Average Energy Consumed at SU-CH (mJ)');
title('Avg Energy Consumed at SU-CH vs Number of Clusters');
legend('Voting','Voting with WOA','Location','northwest');
grid on;
SIMULATED OUTPUTS
DOWNLOAD LINK