From ec202d7790b0f77c764966b592d5ba87c05e6891 Mon Sep 17 00:00:00 2001 From: Kevin D Date: Sun, 11 Jan 2026 12:42:48 -0800 Subject: [PATCH] reimplemented gradient ascent as central finite differences method --- @agent/agent.m | 5 +- @agent/initialize.m | 49 +----- @agent/partition.m | 35 ++++ @agent/run.m | 162 +++++------------- @miSim/miSim.m | 1 - @miSim/partition.m | 2 +- @miSim/run.m | 2 +- @sensingObjective/initialize.m | 5 +- @sensingObjective/sensingObjective.m | 3 +- .../PR5LYpNCHNsKl-th1ypVJR7QPBAd.xml | 6 + .../PR5LYpNCHNsKl-th1ypVJR7QPBAp.xml | 2 + test/test_miSim.m | 5 +- 12 files changed, 101 insertions(+), 176 deletions(-) create mode 100644 @agent/partition.m create mode 100644 resources/project/hjJloWDVwJVRCwGO0y5r9iO7IDk/PR5LYpNCHNsKl-th1ypVJR7QPBAd.xml create mode 100644 resources/project/hjJloWDVwJVRCwGO0y5r9iO7IDk/PR5LYpNCHNsKl-th1ypVJR7QPBAp.xml diff --git a/@agent/agent.m b/@agent/agent.m index eeedb78..c96a73d 100644 --- a/@agent/agent.m +++ b/@agent/agent.m @@ -31,14 +31,13 @@ classdef agent % Plotting scatterPoints; - debug = false; - debugFig; plotCommsGeometry = true; end methods (Access = public) [obj] = initialize(obj, pos, vel, pan, tilt, collisionGeometry, sensorModel, guidanceModel, comRange, index, label); - [obj] = run(obj, domain, partitioning, t, index); + [obj] = run(obj, domain, partitioning, t, index, agents); + [partitioning] = partition(obj, agents, objective) [obj, f] = plot(obj, ind, f); updatePlots(obj); end diff --git a/@agent/initialize.m b/@agent/initialize.m index 4577a99..c95bc28 100644 --- a/@agent/initialize.m +++ b/@agent/initialize.m @@ -1,4 +1,4 @@ -function obj = initialize(obj, pos, vel, pan, tilt, collisionGeometry, sensorModel, comRange, label, debug, plotCommsGeometry) +function obj = initialize(obj, pos, vel, pan, tilt, collisionGeometry, sensorModel, comRange, label, plotCommsGeometry) arguments (Input) obj (1, 1) {mustBeA(obj, 'agent')}; pos (1, 3) double; @@ -9,7 +9,6 @@ function obj = initialize(obj, pos, vel, pan, tilt, collisionGeometry, sensorMod sensorModel (1, 1) {mustBeSensor}; comRange (1, 1) double; label (1, 1) string = ""; - debug (1, 1) logical = false; plotCommsGeometry (1, 1) logical = false; end arguments (Output) @@ -23,57 +22,11 @@ function obj = initialize(obj, pos, vel, pan, tilt, collisionGeometry, sensorMod obj.collisionGeometry = collisionGeometry; obj.sensorModel = sensorModel; obj.label = label; - obj.debug = debug; obj.plotCommsGeometry = plotCommsGeometry; % Add spherical geometry based on com range obj.commsGeometry = obj.commsGeometry.initialize(obj.pos, comRange, REGION_TYPE.COMMS, sprintf("%s Comms Geometry", obj.label)); - if obj.debug - obj.debugFig = figure; - tiledlayout(obj.debugFig, "TileSpacing", "tight", "Padding", "compact"); - nexttile; - axes(obj.debugFig.Children(1).Children(1)); - axis(obj.debugFig.Children(1).Children(1), "image"); - xlabel(obj.debugFig.Children(1).Children(1), "X"); ylabel(obj.debugFig.Children(1).Children(1), "Y"); - title(obj.debugFig.Children(1).Children(1), "Objective"); - nexttile; - axes(obj.debugFig.Children(1).Children(1)); - axis(obj.debugFig.Children(1).Children(1), "image"); - xlabel(obj.debugFig.Children(1).Children(1), "X"); ylabel(obj.debugFig.Children(1).Children(1), "Y"); - title(obj.debugFig.Children(1).Children(1), "Sensor Performance"); - nexttile; - axes(obj.debugFig.Children(1).Children(1)); - axis(obj.debugFig.Children(1).Children(1), "image"); - xlabel(obj.debugFig.Children(1).Children(1), "X"); ylabel(obj.debugFig.Children(1).Children(1), "Y"); - title(obj.debugFig.Children(1).Children(1), "Gradient Objective"); - nexttile; - axes(obj.debugFig.Children(1).Children(1)); - axis(obj.debugFig.Children(1).Children(1), "image"); - xlabel(obj.debugFig.Children(1).Children(1), "X"); ylabel(obj.debugFig.Children(1).Children(1), "Y"); - title(obj.debugFig.Children(1).Children(1), "Gradient Sensor Performance"); - nexttile; - axes(obj.debugFig.Children(1).Children(1)); - axis(obj.debugFig.Children(1).Children(1), "image"); - xlabel(obj.debugFig.Children(1).Children(1), "X"); ylabel(obj.debugFig.Children(1).Children(1), "Y"); - title(obj.debugFig.Children(1).Children(1), "Sensor Performance x Gradient Objective"); - nexttile; - axes(obj.debugFig.Children(1).Children(1)); - axis(obj.debugFig.Children(1).Children(1), "image"); - xlabel(obj.debugFig.Children(1).Children(1), "X"); ylabel(obj.debugFig.Children(1).Children(1), "Y"); - title(obj.debugFig.Children(1).Children(1), "Gradient Sensor Performance x Objective"); - nexttile; - axes(obj.debugFig.Children(1).Children(1)); - axis(obj.debugFig.Children(1).Children(1), "image"); - xlabel(obj.debugFig.Children(1).Children(1), "X"); ylabel(obj.debugFig.Children(1).Children(1), "Y"); - title(obj.debugFig.Children(1).Children(1), "Agent Performance (C)"); - nexttile; - axes(obj.debugFig.Children(1).Children(1)); - axis(obj.debugFig.Children(1).Children(1), "image"); - xlabel(obj.debugFig.Children(1).Children(1), "X"); ylabel(obj.debugFig.Children(1).Children(1), "Y"); - title(obj.debugFig.Children(1).Children(1), "Gradient Agent Performance (del C)"); - end - % Initialize FOV cone obj.fovGeometry = cone; obj.fovGeometry = obj.fovGeometry.initialize([obj.pos(1:2), 0], tand(obj.sensorModel.alphaTilt) * obj.pos(3), obj.pos(3), REGION_TYPE.FOV, sprintf("%s FOV", obj.label)); diff --git a/@agent/partition.m b/@agent/partition.m new file mode 100644 index 0000000..80012ce --- /dev/null +++ b/@agent/partition.m @@ -0,0 +1,35 @@ +function [partitioning] = partition(obj, agents, objective) + arguments (Input) + obj (1, 1) {mustBeA(obj, 'agent')}; + agents (:, 1) {mustBeA(agents, 'cell')}; + objective (1, 1) {mustBeA(objective, 'sensingObjective')}; + end + arguments (Output) + partitioning (:, :) double; + end + + % Assess sensing performance of each agent at each sample point + % in the domain + agentPerformances = cellfun(@(x) reshape(x.sensorModel.sensorPerformance(x.pos, x.pan, x.tilt, [objective.X(:), objective.Y(:), zeros(size(objective.X(:)))]), size(objective.X)), agents, 'UniformOutput', false); + agentPerformances{end + 1} = objective.sensorPerformanceMinimum * ones(size(agentPerformances{end})); % add additional layer to represent the threshold that has to be cleared for assignment to any partiton + agentPerformances = cat(3, agentPerformances{:}); + + % Get highest performance value at each point + [~, idx] = max(agentPerformances, [], 3); + + % Collect agent indices in the same way as performance + indices = 1:size(agents, 1); + agentInds = squeeze(tensorprod(indices, ones(size(objective.X)))); + if size(agentInds, 1) ~= size(agents, 1) + agentInds = reshape(agentInds, [size(agents, 1), size(agentInds)]); % needed for cases with 1 agent where prior squeeze is too agressive + end + agentInds = num2cell(agentInds, 2:3); + agentInds = cellfun(@(x) squeeze(x), agentInds, 'UniformOutput', false); + agentInds{end + 1} = zeros(size(agentInds{end})); % index for no assignment + agentInds = cat(3, agentInds{:}); + + % Use highest performing agent's index to form partitions + [m, n, ~] = size(agentInds); + [jj, kk] = ndgrid(1:m, 1:n); + partitioning = agentInds(sub2ind(size(agentInds), jj, kk, idx)); +end \ No newline at end of file diff --git a/@agent/run.m b/@agent/run.m index 9c28f3e..769821d 100644 --- a/@agent/run.m +++ b/@agent/run.m @@ -1,10 +1,11 @@ -function obj = run(obj, domain, partitioning, t, index) +function obj = run(obj, domain, partitioning, timestepIndex, index, agents) arguments (Input) obj (1, 1) {mustBeA(obj, 'agent')}; domain (1, 1) {mustBeGeometry}; partitioning (:, :) double; - t (1, 1) double; + timestepIndex (1, 1) double; index (1, 1) double; + agents (:, 1) {mustBeA(agents, 'cell')}; end arguments (Output) obj (1, 1) {mustBeA(obj, 'agent')}; @@ -14,134 +15,63 @@ function obj = run(obj, domain, partitioning, t, index) partitionMask = partitioning == index; objectiveValues = domain.objective.values(partitionMask); % f(omega) on W_n - % Compute sensor performance across partition + % Compute sensor performance on partition maskedX = domain.objective.X(partitionMask); maskedY = domain.objective.Y(partitionMask); - zFactor = 1; - sensorValues = obj.sensorModel.sensorPerformance(obj.pos, obj.pan, obj.tilt, [maskedX, maskedY, zeros(size(maskedX))]); % S_n(omega, P_n) on W_n - sensorValuesLower = obj.sensorModel.sensorPerformance(obj.pos - [0, 0, zFactor * domain.objective.discretizationStep], obj.pan, obj.tilt, [maskedX, maskedY, zeros(size(maskedX))]); % S_n(omega, P_n - [0, 0, z]) on W_n - sensorValuesHigher = obj.sensorModel.sensorPerformance(obj.pos + [0, 0, zFactor * domain.objective.discretizationStep], obj.pan, obj.tilt, [maskedX, maskedY, zeros(size(maskedX))]); % S_n(omega, P_n - [0, 0, z]) on W_n - % Put the values back into the form of the partition to enable basic operations on this data - F = NaN(size(partitionMask)); - F(partitionMask) = objectiveValues; - S = NaN(size(partitionMask)); - Slower = S; - Shigher = S; - S(partitionMask) = sensorValues; - Slower(partitionMask) = sensorValuesLower; - Shigher(partitionMask) = sensorValuesHigher; - - % Find agent's performance - C = S .* F; - obj.performance = [obj.performance, sum(C(~isnan(C)))]; % at current Z only - C = cat(3, Shigher, S, Slower) .* F; - - % Compute gradient on agent's performance - [gradCX, gradCY, gradCZ] = gradient(C, domain.objective.discretizationStep); % grad C - gradC = cat(4, gradCX, gradCY, gradCZ); - nGradC = vecnorm(gradC, 2, 4); - - if obj.debug - % Compute additional component-level values for diagnosing issues - [gradSensorPerformanceX, gradSensorPerformanceY] = gradient(S, domain.objective.discretizationStep); % grad S_n - [gradObjectiveX, gradObjectiveY] = gradient(F, domain.objective.discretizationStep); % grad f - gradS = cat(3, gradSensorPerformanceX, gradSensorPerformanceY, zeros(size(gradSensorPerformanceX))); % grad S_n - gradF = cat(3, gradObjectiveX, gradObjectiveY, zeros(size(gradObjectiveX))); % grad f - - ii = 8; - hold(obj.debugFig.Children(1).Children(ii), "on"); - cla(obj.debugFig.Children(1).Children(ii)); - imagesc(obj.debugFig.Children(1).Children(ii), F./max(F, [], 'all')); - hold(obj.debugFig.Children(1).Children(ii), "off"); - ii = ii - 1; - hold(obj.debugFig.Children(1).Children(ii), "on"); - cla(obj.debugFig.Children(1).Children(ii)); - imagesc(obj.debugFig.Children(1).Children(ii), S./max(S, [], 'all')); - hold(obj.debugFig.Children(1).Children(ii), "off"); - ii = ii - 1; - hold(obj.debugFig.Children(1).Children(ii), "on"); - cla(obj.debugFig.Children(1).Children(ii)); - imagesc(obj.debugFig.Children(1).Children(ii), vecnorm(gradF, 2, 3)./max(vecnorm(gradF, 2, 3), [], 'all')); - hold(obj.debugFig.Children(1).Children(ii), "off"); - ii = ii - 1; - hold(obj.debugFig.Children(1).Children(ii), "on"); - cla(obj.debugFig.Children(1).Children(ii)); - imagesc(obj.debugFig.Children(1).Children(ii), vecnorm(gradS, 2, 3)./max(vecnorm(gradS, 2, 3), [], 'all')); - hold(obj.debugFig.Children(1).Children(ii), "off"); - ii = ii - 1; - hold(obj.debugFig.Children(1).Children(ii), "on"); - cla(obj.debugFig.Children(1).Children(ii)); - imagesc(obj.debugFig.Children(1).Children(ii), S .* vecnorm(gradF, 2, 3)./max(vecnorm(gradF, 2, 3), [], 'all')); - hold(obj.debugFig.Children(1).Children(ii), "off"); - ii = ii - 1; - hold(obj.debugFig.Children(1).Children(ii), "on"); - cla(obj.debugFig.Children(1).Children(ii)); - imagesc(obj.debugFig.Children(1).Children(ii), F .* vecnorm(gradS, 2, 3)./max(vecnorm(gradS, 2, 3), [], 'all')./(max(F .* vecnorm(gradS, 2, 3)./max(vecnorm(gradS, 2, 3), [], 'all')))); - hold(obj.debugFig.Children(1).Children(ii), "off"); + % Compute agent performance at the current position and each delta position +/- X, Y, Z + delta = domain.objective.discretizationStep; % smallest possible step size that gets different results + deltaApplicator = [0, 0, 0; 1, 0, 0; -1, 0, 0; 0, 1, 0; 0, -1, 0; 0, 0, 1; 0, 0, -1]; % none, +X, -X, +Y, -Y, +Z, -Z + C_delta = NaN(7, 1); % agent performance at delta steps in each direction + for ii = 1:7 + % Apply delta to position + pos = obj.pos + delta * deltaApplicator(ii, 1:3); - ii = ii - 1; - hold(obj.debugFig.Children(1).Children(ii), "on"); - cla(obj.debugFig.Children(1).Children(ii)); - imagesc(obj.debugFig.Children(1).Children(ii), C./max(C, [], 'all')); - hold(obj.debugFig.Children(1).Children(ii), "off"); - ii = ii - 1; - hold(obj.debugFig.Children(1).Children(ii), "on"); - cla(obj.debugFig.Children(1).Children(ii)); - imagesc(obj.debugFig.Children(1).Children(ii), nGradC./max(nGradC, [], 'all')); - hold(obj.debugFig.Children(1).Children(ii), "off"); - [x, y] = find(nGradC == max(nGradC, [], "all")); + % Compute performance values on partition + if ii < 5 + % Compute sensing performance + sensorValues = obj.sensorModel.sensorPerformance(obj.pos, obj.pan, obj.tilt, [maskedX, maskedY, zeros(size(maskedX))]); % S_n(omega, P_n) on W_n + % Objective performance does not change for 0, +/- X, Y steps. + % Those values are computed once before the loop and are only + % recomputed when +/- Z steps are applied + else + % Redo partitioning for Z stepping only + partitioning = obj.partition(agents, domain.objective); - % just pick one - r = randi([1, size(x, 1)]); - x = x(r); y = y(r); + % Recompute partiton-derived performance values for objective + partitionMask = partitioning == index; + objectiveValues = domain.objective.values(partitionMask); % f(omega) on W_n - % switch them - temp = x; - x = y; - y = temp; - - % find objective location in discrete domain - [~, xIdx] = find(domain.objective.groundPos(1) == domain.objective.X); - xIdx = unique(xIdx); - [yIdx, ~] = find(domain.objective.groundPos(2) == domain.objective.Y); - yIdx = unique(yIdx); - for ii = 8:-1:1 - hold(obj.debugFig.Children(1).Children(ii), "on"); - % plot GA selection - scatter(obj.debugFig.Children(1).Children(ii), x, y, 'go'); - scatter(obj.debugFig.Children(1).Children(ii), x, y, 'g+'); - % plot objective center - scatter(obj.debugFig.Children(1).Children(ii), xIdx, yIdx, 'ro'); - scatter(obj.debugFig.Children(1).Children(ii), xIdx, yIdx, 'r+'); - hold(obj.debugFig.Children(1).Children(ii), "off"); + % Recompute partiton-derived performance values for sensing + maskedX = domain.objective.X(partitionMask); + maskedY = domain.objective.Y(partitionMask); + sensorValues = obj.sensorModel.sensorPerformance(pos, obj.pan, obj.tilt, [maskedX, maskedY, zeros(size(maskedX))]); % S_n(omega, P_n) on W_n end + + % Rearrange data into image arrays + F = NaN(size(partitionMask)); + F(partitionMask) = objectiveValues; + S = NaN(size(partitionMask)); + S(partitionMask) = sensorValues; + + % Compute agent performance + C = S .* F; + C_delta(ii) = sum(C(~isnan(C))); end - % return now if there is no data to work with, and do not move - if all(isnan(nGradC), 'all') - return; - end + % Compute gradient by finite central differences + gradC = [(C_delta(2)-C_delta(3))/(2*delta), (C_delta(4)-C_delta(5))/(2*delta), (C_delta(6)-C_delta(7))/(2*delta)]; - % Use largest grad(C) value to find the direction of the next position - [xNextIdx, yNextIdx, zNextIdx] = ind2sub(size(nGradC), find(nGradC == max(nGradC, [], 'all'))); - % switch them - temp = xNextIdx; - xNextIdx = yNextIdx; - yNextIdx = temp; + % Compute scaling factor + targetRate = 0.2 - 0.0008 * timestepIndex; % slow down as you get closer + rateFactor = targetRate / norm(gradC); - roundingScale = 10^-log10(domain.objective.discretizationStep); - zKey = zFactor * [1; 0; -1]; - pNext = [floor(roundingScale .* mean(unique(domain.objective.X(:, xNextIdx))))./roundingScale, floor(roundingScale .* mean(unique(domain.objective.Y(yNextIdx, :))))./roundingScale, obj.pos(3) + zKey(zNextIdx)]; % have to do some unfortunate rounding here sometimes - - % Determine next position - vDir = (pNext - obj.pos)./norm(pNext - obj.pos, 2); - rate = 0.1 - 0.0004 * t; % slow down as you get closer, coming to a stop by the end - nextPos = obj.pos + vDir * rate; + % Compute unconstrained next position + pNext = obj.pos + rateFactor * gradC; % Move to next position obj.lastPos = obj.pos; - obj.pos = nextPos; + obj.pos = pNext; % Reinitialize collision geometry in the new position d = obj.pos - obj.collisionGeometry.center; diff --git a/@miSim/miSim.m b/@miSim/miSim.m index cc3e5ad..3f5687d 100644 --- a/@miSim/miSim.m +++ b/@miSim/miSim.m @@ -13,7 +13,6 @@ classdef miSim agents = cell(0, 1); % agents that move within the domain adjacency = NaN; % Adjacency matrix representing communications network graph constraintAdjacencyMatrix = NaN; % Adjacency matrix representing desired lesser neighbor connections - sensorPerformanceMinimum = 1e-6; % minimum sensor performance to allow assignment of a point in the domain to a partition partitioning = NaN; perf; % sensor performance timeseries array performance = 0; % simulation performance timeseries vector diff --git a/@miSim/partition.m b/@miSim/partition.m index 7090eaa..044a55d 100644 --- a/@miSim/partition.m +++ b/@miSim/partition.m @@ -9,7 +9,7 @@ function obj = partition(obj) % Assess sensing performance of each agent at each sample point % in the domain agentPerformances = cellfun(@(x) reshape(x.sensorModel.sensorPerformance(x.pos, x.pan, x.tilt, [obj.objective.X(:), obj.objective.Y(:), zeros(size(obj.objective.X(:)))]), size(obj.objective.X)), obj.agents, 'UniformOutput', false); - agentPerformances{end + 1} = obj.sensorPerformanceMinimum * ones(size(agentPerformances{end})); % add additional layer to represent the threshold that has to be cleared for assignment to any partiton + agentPerformances{end + 1} = obj.domain.objective.sensorPerformanceMinimum * ones(size(agentPerformances{end})); % add additional layer to represent the threshold that has to be cleared for assignment to any partiton agentPerformances = cat(3, agentPerformances{:}); % Get highest performance value at each point diff --git a/@miSim/run.m b/@miSim/run.m index d8be1a1..646ce9c 100644 --- a/@miSim/run.m +++ b/@miSim/run.m @@ -33,7 +33,7 @@ function [obj] = run(obj) % Iterate over agents to simulate their unconstrained motion for jj = 1:size(obj.agents, 1) - obj.agents{jj} = obj.agents{jj}.run(obj.domain, obj.partitioning, obj.t, jj); + obj.agents{jj} = obj.agents{jj}.run(obj.domain, obj.partitioning, obj.timestepIndex, jj, obj.agents); end % Adjust motion determined by unconstrained gradient ascent using diff --git a/@sensingObjective/initialize.m b/@sensingObjective/initialize.m index 5af4843..257f5e1 100644 --- a/@sensingObjective/initialize.m +++ b/@sensingObjective/initialize.m @@ -1,10 +1,11 @@ -function obj = initialize(obj, objectiveFunction, domain, discretizationStep, protectedRange) +function obj = initialize(obj, objectiveFunction, domain, discretizationStep, protectedRange, sensorPerformanceMinimum) arguments (Input) obj (1,1) {mustBeA(obj, 'sensingObjective')}; objectiveFunction (1, 1) {mustBeA(objectiveFunction, 'function_handle')}; domain (1, 1) {mustBeGeometry}; discretizationStep (1, 1) double = 1; protectedRange (1, 1) double = 1; + sensorPerformanceMinimum (1, 1) double = 1e-6; end arguments (Output) obj (1,1) {mustBeA(obj, 'sensingObjective')}; @@ -12,6 +13,8 @@ function obj = initialize(obj, objectiveFunction, domain, discretizationStep, pr obj.discretizationStep = discretizationStep; + obj.sensorPerformanceMinimum = sensorPerformanceMinimum; + obj.groundAlt = domain.minCorner(3); obj.protectedRange = protectedRange; diff --git a/@sensingObjective/sensingObjective.m b/@sensingObjective/sensingObjective.m index 53c843f..40414c6 100644 --- a/@sensingObjective/sensingObjective.m +++ b/@sensingObjective/sensingObjective.m @@ -10,10 +10,11 @@ classdef sensingObjective Y = []; values = []; protectedRange = 1; % keep obstacles from crowding objective + sensorPerformanceMinimum = 1e-6; % minimum sensor performance to allow assignment of a point in the domain to a partition end methods (Access = public) - [obj] = initialize(obj, objectiveFunction, domain, discretizationStep, protectedRange); + [obj] = initialize(obj, objectiveFunction, domain, discretizationStep, protectedRange, sensorPerformanceMinimum); [obj] = initializeRandomMvnpdf(obj, domain, protectedRange, discretizationStep, protectedRange); [f ] = plot(obj, ind, f); end diff --git a/resources/project/hjJloWDVwJVRCwGO0y5r9iO7IDk/PR5LYpNCHNsKl-th1ypVJR7QPBAd.xml b/resources/project/hjJloWDVwJVRCwGO0y5r9iO7IDk/PR5LYpNCHNsKl-th1ypVJR7QPBAd.xml new file mode 100644 index 0000000..99772b4 --- /dev/null +++ b/resources/project/hjJloWDVwJVRCwGO0y5r9iO7IDk/PR5LYpNCHNsKl-th1ypVJR7QPBAd.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/resources/project/hjJloWDVwJVRCwGO0y5r9iO7IDk/PR5LYpNCHNsKl-th1ypVJR7QPBAp.xml b/resources/project/hjJloWDVwJVRCwGO0y5r9iO7IDk/PR5LYpNCHNsKl-th1ypVJR7QPBAp.xml new file mode 100644 index 0000000..7c8e137 --- /dev/null +++ b/resources/project/hjJloWDVwJVRCwGO0y5r9iO7IDk/PR5LYpNCHNsKl-th1ypVJR7QPBAp.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/test/test_miSim.m b/test/test_miSim.m index 438bd05..4b9b789 100644 --- a/test/test_miSim.m +++ b/test/test_miSim.m @@ -456,13 +456,10 @@ classdef test_miSim < matlab.unittest.TestCase tc.agents{1} = tc.agents{1}.initialize([tc.domain.center(1:2)-tc.domain.dimensions(1)/3, 3], zeros(1,3), 0, 0, geometry1, sensor, 3, "", false); % Initialize the simulation - tc.testClass = tc.testClass.initialize(tc.domain, tc.domain.objective, tc.agents, tc.minAlt, tc.timestep, tc.partitoningFreq, tc.maxIter, cell(0, 1), true, false); + tc.testClass = tc.testClass.initialize(tc.domain, tc.domain.objective, tc.agents, tc.minAlt, tc.timestep, tc.partitoningFreq, tc.maxIter, cell(0, 1)); % Run the simulation tc.testClass = tc.testClass.run(); - if isgraphics(tc.testClass.agents{1}.debugFig) - close(tc.testClass.agents{1}.debugFig); - end % tc.verifyGreaterThan(tc.testClass.performance(end)/max(tc.testClass.performance), 0.99); % ends up very near a relative maximum end