Supposons que nous ayons un ensemble fini de disques en , et nous souhaitons calculer le plus petit disque pour lequel . Une manière standard de le faire est d'utiliser l'algorithme de Matoušek, Sharir et Welzl [1] pour trouver une base de , et que , le plus petit disque contenant . Le disque peut être calculé algébriquement utilisant le fait que, étant donné que est une base, chaque disque est tangente à .
( est une base de si est minimale telle que base A comporte au plus trois éléments;. En général pour les boules dans une base a au plus . Éléments)
Il s'agit d'un algorithme récursif randomisé comme suit. (Mais voir ci-dessous pour une version itérative, qui peut être plus facile à comprendre.)
Procédure :
Entrée : ensembles finis de disques , , où est une base (de ).
- Si , retour .
- Sinon, choisissez au hasard.
- Soit .
- Si puis retour .
- Sinon, retournez , où B ″ est une base de B ′ ∪ { X } .
Utilisé comme pour calculer une base de L .
Récemment, j'ai eu à implémenter cet algorithme. Après avoir vérifié que les résultats étaient corrects dans des millions de cas de test générés aléatoirement, j'ai remarqué que j'avais fait une erreur dans l'implémentation. Dans la dernière étape, je retournais plutôt que M S W ( L , B ″ ) .
Malgré cette erreur, l'algorithme donnait les bonnes réponses.
Ma question: pourquoi cette version incorrecte de l'algorithme donne-t-elle apparemment des réponses correctes ici? Cela fonctionne-t-il toujours (de manière prouvée)? Si oui, est-ce également vrai dans les dimensions supérieures?
Ajouté: quelques idées fausses
Plusieurs personnes ont proposé des arguments incorrects à l'effet que l'algorithme modifié est trivialement correct, il peut donc être utile de prévenir certaines idées fausses ici. Une fausse croyance populaire semble être que . Voici un contre-exemple à cette affirmation. Compte tenu de disques a , b , c , d , e comme ci - dessous (la limite de ⟨ a , b , e ⟩ est également montré en rouge):
on peut avoir ; et notez que e ∉ ⟨ c , d ⟩ :
Voici comment cela peut se produire. La première observation est que :
- Nous souhaitons calculer
- Choisissez
- Soit
- Remarquons que
- Soit donc une base de B ′ ∪ { X } = { a , b , c , e }
- Observez que
- Renvoie , qui est { b , c }
Considérons maintenant .
- Nous souhaitons calculer
- Choisissez
- Soit
- Remarquons que
- Soit donc une base de B ′ ∪ { X } = { b , c , d }
- Observez que
- Renvoie , qui est { c , d }
(Par souci de clarté, disons que les disques ont tous un rayon 2 et sont centrés sur ( 30 , 5 ) , ( 30 , 35 ) , ( 10 , 5 ) , ( 60 , 26 ) et ( 5 , 26 ) respectivement.)
Ajouté: une présentation itérative
Il peut être plus facile de penser à une présentation itérative de l'algorithme. Je trouve certainement plus facile de visualiser son comportement.
Entrée : une liste de disques Sortie : une base L
- Soit .
- Mélangez au hasard.
- Pour chaque dans L :
- Si :
- Soit une base de B ∪ { X } .
- Revenez à l'étape 2.
- Retour .
La raison pour laquelle l'algorithme se termine, soit dit en passant, est que l' étape 5 augmente toujours le rayon de - et il n'y a que de nombreuses valeurs possibles finiment de B .
La version modifiée n'a pas une présentation itérative aussi simple que je sache. (J'ai essayé d'en donner un dans l'édition précédente de ce post, mais c'était faux - et j'ai donné des résultats incorrects.)
Référence
[1] Jiří Matoušek, Micha Sharir et Emo Welzl. Une limite sous-exponentielle pour la programmation linéaire. Algorithmica, 16 (4-5): 498-516, 1996.