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),:));