36 lines
1.7 KiB
Matlab
36 lines
1.7 KiB
Matlab
function obj = partition(obj)
|
|
arguments (Input)
|
|
obj (1, 1) {mustBeA(obj, 'miSim')};
|
|
end
|
|
arguments (Output)
|
|
obj (1, 1) {mustBeA(obj, 'miSim')};
|
|
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, [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 = cat(3, agentPerformances{:});
|
|
|
|
% Get highest performance value at each point
|
|
[~, idx] = max(agentPerformances, [], 3);
|
|
|
|
% Collect agent indices in the same way as performance
|
|
agentInds = cellfun(@(x) x.index * ones(size(obj.objective.X)), obj.agents, 'UniformOutput', false);
|
|
agentInds{end + 1} = zeros(size(agentInds{end})); % index for no assignment
|
|
agentInds = cat(3, agentInds{:});
|
|
|
|
% Get highest performing agent's index
|
|
[m,n,~] = size(agentInds);
|
|
[i,j] = ndgrid(1:m, 1:n);
|
|
obj.partitioning = agentInds(sub2ind(size(agentInds), i, j, idx));
|
|
|
|
% Get individual agent sensor performance
|
|
for ii = 1:size(obj.agents, 1)
|
|
obj.agents{ii}.performance = sum(agentPerformances(sub2ind(size(agentInds), i, j, idx)), 'all');
|
|
end
|
|
|
|
% Current total performance
|
|
sum(arrayfun(@(x) x.performance, [obj.agents{:}]))
|
|
obj.performance = sum(max(agentPerformances(:, :, 1:(end - 1)), [], 3), 'all'); % do not count final "non-assignment" layer in computing cumulative performance
|
|
end |