Le fait que ce problème puisse être résolu à l'aide d'une "recherche directe" (comme on peut le voir dans l'exemple suivant) est une bonne chose. une autre réponse ) signifie que l'on peut considérer cela comme un optimisation globale problème. Il existe plusieurs façons de résoudre de tels problèmes, chacune étant adaptée à certains scénarios. Par curiosité personnelle, j'ai décidé de résoudre ce problème à l'aide d'une algorithme génétique .
D'une manière générale, un tel algorithme nous oblige à considérer la solution comme un ensemble de "gènes" soumis à une "évolution" sous une certaine "fonction d'adéquation". Il se trouve qu'il est assez facile d'identifier les gènes et la fonction d'aptitude dans ce problème :
- Gènes :
x
, y
, r
.
- Fonction d'aptitude : techniquement, il s'agit de l'aire maximale du cercle, mais cela équivaut à la valeur maximale de la fonction d'aptitude.
r
(ou minimum -r
puisque l'algorithme requiert une fonction pour minimiser ).
- Contrainte spéciale - si
r
est plus grande que la distance euclidienne au plus proche des points fournis (c'est-à-dire que le cercle contient un point), l'organisme "meurt".
Vous trouverez ci-dessous une implémentation de base d'un tel algorithme (" base "parce qu'il n'est pas du tout optimisé et qu'il y a beaucoup de place pour l'optimisation. sans mauvais jeu de mots dans ce problème).
function [x,y,r] = q42806059b(cloudOfPoints)
% Problem setup
if nargin == 0
rng(1)
cloudOfPoints = rand(100,2)*5; % equivalent to Ander's initialization.
end
%{
figure(); plot(cloudOfPoints(:,1),cloudOfPoints(:,2),'.w'); hold on; axis square;
set(gca,'Color','k'); plot(0.7832,2.0694,'ro'); plot(0.7832,2.0694,'r*');
%}
nVariables = 3;
options = optimoptions(@ga,'UseVectorized',true,'CreationFcn',@gacreationuniform,...
'PopulationSize',1000);
S = max(cloudOfPoints,[],1); L = min(cloudOfPoints,[],1); % Find geometric bounds:
% In R2017a: use [S,L] = bounds(cloudOfPoints,1);
% Here we also define distance-from-boundary constraints.
g = ga(@(g)vectorized_fitness(g,cloudOfPoints,[L;S]), nVariables,...
[],[], [],[], [L 0],[S min(S-L)], [], options);
x = g(1); y = g(2); r = g(3);
%{
plot(x,y,'ro'); plot(x,y,'r*');
rectangle('Position',[x-r,y-r,2*r,2*r],'Curvature',[1 1],'EdgeColor','r');
%}
function f = vectorized_fitness(genes,pts,extent)
% genes = [x,y,r]
% extent = [Xmin Ymin; Xmax Ymax]
% f, the fitness, is the largest radius.
f = min(pdist2(genes(:,1:2), pts, 'euclidean'), [], 2);
% Instant death if circle contains a point:
f( f < genes(:,3) ) = Inf;
% Instant death if circle is too close to boundary:
f( any( genes(:,3) > genes(:,1:2) - extent(1,:) | ...
genes(:,3) > extent(2,:) - genes(:,1:2), 2) ) = Inf;
% Note: this condition may possibly be specified using the A,b inputs of ga().
f(isfinite(f)) = -genes(isfinite(f),3);
%DEBUG:
%{
scatter(genes(:,1),genes(:,2),10 ,[0, .447, .741] ,'o'); % All
z = ~isfinite(f); scatter(genes(z,1),genes(z,2),30,'r','x'); % Killed
z = isfinite(f); scatter(genes(z,1),genes(z,2),30,'g','h'); % Surviving
[~,I] = sort(f); scatter(genes(I(1:5),1),genes(I(1:5),2),30,'y','p'); % Elite
%}
Et voici un tracé "time-lapse" de 47 générations d'un parcours typique :
(Les points bleus représentent la génération actuelle, les croix rouges les organismes "insta-killed", les hexagrammes verts les organismes "non-insta-killed" et le cercle rouge la destination).
0 votes
Je suppose que vous avez une limite de rayon, non ? Je suppose également que vous voulez dire le plus petit cercle avec au moins
n
particules à l'intérieur sinon le plus grand cercle estr=Inf
. Ou voulez-vous dire le plus grand cercle contenant le maximumn
des particules ?2 votes
@AnderBiguri Je crois qu'il veut dire le plus grand cercle. sans les particules qu'il contient
3 votes
@AnderBiguri Je pense qu'il veut dire le plus grand cercle qui peut tenir dans l'espace. sans contenant des points...
0 votes
@Wolfie hum... J'ai mal interprété la déclaration des "3 points".
3 votes
@AnderBiguri, je pense que l'algorithme proposé était : 1) Obtenir tous les triplets de points. 2) Définir des cercles en utilisant ces ensembles de 3 points (ce sera unique). 3) Eliminer les cercles contenant des points. 4) Trouver le plus grand cercle restant. Le problème étant qu'il y a beaucoup de triplets, l'algorithme est donc lent.
0 votes
@DanielAlder merci, votre interprétation du problème est correcte et c'est la même que celle sur laquelle je voulais m'informer.
0 votes
Merci @Wolfie, votre interprétation du problème est correcte et est la même que celle sur laquelle je me suis renseigné et votre explication de l'algorithme est correcte (ce sur quoi je travaille actuellement).
0 votes
@AnderBiguri oui je veux dire le plus grand cercle qui peut tenir dans l'espace sans contenir aucun point...
0 votes
@AnderBiguri merci pour la suggestion. Je vais essayer de travailler avec la triangulation ou la dilatation de Voronoï dans le traitement d'images pour voir si cela peut résoudre mon problème.
0 votes
@TarunKumarAgrawal est-ce que ma réponse fonctionne ? Avez-vous besoin de plus d'aide ?
1 votes
@AnderBiguri Merci beaucoup pour la solution. Elle fonctionne bien pour mon problème