nodePositions = rand(numNodes, 2) * areaSize;
adjMatrix = zeros(numNodes);
distance = norm(nodePositions(i,:) - nodePositions(j,:));
particles = rand(numParticles, numNodes * 2) * areaSize;
velocities = zeros(numParticles, numNodes * 2);
personalBestPositions = particles;
personalBestScores = inf(numParticles, 1);
globalBestPosition = particles(1, :);
for iter = 1:maxIterations
currentPositions = reshape(particles(p, :), [numNodes, 2]);
adjMatrix = zeros(numNodes);
distance = norm(currentPositions(i,:) - currentPositions(j,:));
totalDistance = optimizeGraph(adjMatrix, currentPositions);
if totalDistance < personalBestScores(p)
personalBestScores(p) = totalDistance;
personalBestPositions(p, :) = particles(p, :);
if totalDistance < globalBestScore
globalBestScore = totalDistance;
globalBestPosition = particles(p, :);
velocities(p, :) = w * velocities(p, :) ...
+ c1 * rand * (personalBestPositions(p, :) - particles(p, :)) ...
+ c2 * rand * (globalBestPosition - particles(p, :));
particles(p, :) = particles(p, :) + velocities(p, :);
particles(p, :) = max(min(particles(p, :), areaSize), 0);
optimizedPositions = reshape(globalBestPosition, [numNodes, 2]);
adjMatrix = zeros(numNodes);
distance = norm(optimizedPositions(i,:) - optimizedPositions(j,:));
plot(G, 'XData', optimizedPositions(:,1), 'YData', optimizedPositions(:,2));
title('Optimized Wireless Sensor Network Graph');
disp(['Optimized Total Distance: ', num2str(globalBestScore)]);
function totalDistance = optimizeGraph(adjMatrix, nodePositions)
[rows, cols] = find(adjMatrix);
totalDistance = totalDistance + norm(nodePositions(rows(k),:) - nodePositions(cols(k),:));