From 01f2af9102cd1d3f84cc7de012013beca66b0c7e Mon Sep 17 00:00:00 2001 From: Kevin D Date: Sun, 15 Mar 2026 17:43:45 -0700 Subject: [PATCH] added second plot - pairwise distances --- plot1.m | 88 ++++++++++++++++++++++++++++++++++++++++++++++---- test/results.m | 13 +------- 2 files changed, 82 insertions(+), 19 deletions(-) diff --git a/plot1.m b/plot1.m index 76458cc..2e1ef45 100644 --- a/plot1.m +++ b/plot1.m @@ -7,10 +7,14 @@ simHists = simHists(endsWith({simHists.name}, 'miSimHist.mat')); assert(length(simHists) == length(simInits), "input data availability mismatch"); % Initialize plotting data -Cfinal = NaN(12, 1); -n = NaN(12, 1); -doubleIntegrator = NaN(12, 1); -numObjective = NaN(12, 1); +nRuns = length(simHists); +Cfinal = NaN(nRuns, 1); +n = NaN(nRuns, 1); +doubleIntegrator = NaN(nRuns, 1); +numObjective = NaN(nRuns, 1); +positions = cell(6, nRuns); +commsRadius = NaN(nRuns, 1); +collisionRadius = NaN(nRuns, 1); % Aggregate relevant data for ii = 1:length(simHists) @@ -26,11 +30,18 @@ for ii = 1:length(simHists) n(ii) = init.numAgents; doubleIntegrator(ii) = init.useDoubleIntegrator; numObjective(ii) = size(init.objectivePos, 1); + commsRadius(ii) = unique(init.comRange); + collisionRadius(ii) = unique(init.collisionRadius); for jj = 1:length(hist.out.agent) alphaDist(jj, ii) = hist.out.agent(jj).sensor.alphaDist; + positions{jj, ii} = hist.out.agent(jj).pos; + assert(hist.out.agent(jj).commsRadius == commsRadius(ii)); + assert(hist.out.agent(jj).collisionRadius == collisionRadius(ii)); end end +commsRadius = unique(commsRadius); assert(isscalar(commsRadius)); +collisionRadius = unique(collisionRadius); assert(isscalar(collisionRadius)); sensors = unique(alphaDist(1, :)); config = []; @@ -62,8 +73,8 @@ for ii = 1:length(simHists) end close all; -f = figure; -x = axes; grid(x, "on"); +f1 = figure; +x1 = axes; n_unique = sort(unique(n)); C = []; @@ -77,5 +88,68 @@ ylabel("Final coverage (fraction of maximum)"); title("Final performance of parameterizations"); legend(["$AI\alpha$"; "$AI\beta$"; "$AII\alpha$"; "$BI\beta$"], "Interpreter", "latex"); grid("on"); -keyboard +f2 = figure; +x2 = axes; + +% Compute pairwise distances between agents in each column of positions +% cell array +% Compute pairwise distances between agents +maxPairs = nchoosek(6, 2); % 15 pairs for max 6 agents +pairDist = cell(maxPairs, nRuns); +for ii = 1:nRuns + pp = 0; + for jj = 1:n(ii)-1 + for kk = jj+1:n(ii) + pp = pp + 1; + pairDist{pp, ii} = vecnorm(positions{jj, ii} - positions{kk, ii}, 2, 2); + end + end +end + +% Compute mean, min, max pairwise distance across all pairs and timesteps per run +meanPairDist = NaN(nRuns, 1); +minPairDist = NaN(nRuns, 1); +maxPairDist = NaN(nRuns, 1); +for ii = 1:nRuns + nPairs = nchoosek(n(ii), 2); + D = vertcat(pairDist{1:nPairs, ii}); + meanPairDist(ii) = mean(D); + minPairDist(ii) = min(D); + maxPairDist(ii) = max(D); +end + +% Group pairwise distance stats by n-value (same layout as bar plot) +nConfigs = nRuns / length(n_unique); +meanD = NaN(length(n_unique), nConfigs); +minD = NaN(length(n_unique), nConfigs); +maxD = NaN(length(n_unique), nConfigs); +for ii = 1:length(n_unique) + idx = find(n == n_unique(ii)); + meanD(ii, :) = meanPairDist(idx)'; + minD(ii, :) = minPairDist(idx)'; + maxD(ii, :) = maxPairDist(idx)'; +end + +% Plot whiskers (min to max) with mean markers +nGroups = length(n_unique); +barWidth = 0.8; +groupWidth = barWidth / nConfigs; +hold(x2, 'on'); +for jj = 1:nConfigs + xPos = (1:nGroups) + (jj - (nConfigs + 1) / 2) * groupWidth; + errorbar(x2, xPos, meanD(:, jj), meanD(:, jj) - minD(:, jj), maxD(:, jj) - meanD(:, jj), ... + 'o', 'LineWidth', 1.5, 'MarkerSize', 6, 'CapSize', 10); +end +hold(x2, 'off'); +set(x2, 'XTick', 1:nGroups, 'XTickLabel', string(n_unique)); +xlabel(x2, "Number of agents"); +ylabel(x2, "Pairwise distance"); +title(x2, "Pairwise Agent Distances (min/mean/max)"); +legend(x2, ["$AI\alpha$"; "$AI\beta$"; "$AII\alpha$"; "$BI\beta$"], "Interpreter", "latex"); +grid(x2, "on"); + +yline(collisionRadius, 'r--', "Label", "Collision Radius", "LabelHorizontalAlignment", "left", "HandleVisibility", "off"); +yline(commsRadius, 'r--', "Label", "Communications Radius", "LabelHorizontalAlignment", "left", "HandleVisibility", "off"); + +ylim([0, commsRadius + 5]); \ No newline at end of file diff --git a/test/results.m b/test/results.m index 22315ab..f97b98b 100644 --- a/test/results.m +++ b/test/results.m @@ -10,7 +10,7 @@ classdef results < matlab.unittest.TestCase %% Diagnostic Parameters % No effect on simulation dynamics makeVideo = false; % disable video writing for big performance increase - makePlots = false; % disable plotting for big performance increase (also disables video) + makePlots = true; % disable plotting for big performance increase (also disables video) plotCommsGeometry = false; % disable plotting communications geometries %% Scenario Reinitialization @@ -54,17 +54,6 @@ classdef results < matlab.unittest.TestCase end end - methods (TestMethodSetup) - % % Generate a random domain for each test - % function tc = setDomain(tc) - % tc.testClass.domain = rectangularPrism; - % % random integer-dimensioned cubic domain - % tc.testClass.domain = tc.testClass.domain.initializeRandom(REGION_TYPE.DOMAIN, "Domain", tc.minDimension); - % % Random bivariate normal PDF objective - % tc.testClass.domain.objective = tc.testClass.domain.objective.initializeRandomMvnpdf(tc.testClass.domain, tc.discretizationStep, tc.protectedRange); - % end - end - methods (Static, Access = private) function c = makeConfigs() rng(results.seed);