De temps en temps, je dois produire un cartographe pour montrer les points d'intérêt. Première étape pour créer des pages, en utilisant un maillage régulier:
Je n'aime pas la solution car a) il y a des pages avec des points uniques (par exemple la page 25) assis sur le bord et b) trop de pages.
Le premier problème est facile à résoudre en utilisant du code, - déplacez le rectangle de l'étendue de la page au centre de l'étendue des points pertinents:
Je n'aime toujours pas ça, ça a l'air très encombré car le nombre de pages reste le même. N'oubliez pas, ils finissent tous par être de véritables pages papier A3 en plusieurs exemplaires du rapport!.
J'ai donc préparé un code qui réduit le nombre de pages. Dans cet exemple de 45 à 34.
Je ne sais pas si c'est le meilleur résultat qui puisse être obtenu,
Quelle est la meilleure stratégie (pseudo-code, publication, bibliothèque Python) pour parcourir les points afin de minimiser le nombre de rectangles de taille donnée pour capturer tous les points? Certes, quelqu'un l'a découvert dans la théorie des jeux, l'art militaire ou l'industrie de la pêche
Ceci est une mise à jour de la question d'origine:
Cela montre l'étendue réelle et la taille de page requises:
Zoom rapproché affichant 10 pages sur 164:
Exemple de classe d'entités ponctuelles
La taille du rectangle peut changer dès qu'il reste dans les limites, c'est-à-dire que plus petit est bien.
Réponses:
Ce n'est pas la réponse, je pensais juste publier une solution Python pour ceux qui seraient intéressés:
l'a appliqué récemment pour la planification de l'enquête:
METTRE À JOUR:
Il semble que pour certains modèles traitant des points «errants», la première voie à suivre. J'ai utilisé le pelage de la coque convexe pour les identifier, idée de whuber, impossible de trouver le message, désolé.
la source
Cela ressemble à une version géométrique du problème de couverture maximale qui est étroitement liée au problème de couverture définie , et ces deux sont NP-Complete.
Donc, pour le résoudre, on pourrait utiliser l'approximation. J'essaierais l'algorithme suivant et il semble fonctionner parfaitement. Bien qu'en raison de la complexité du problème, nous ne pouvons pas trouver la meilleure réponse.
une implémentation de cet algorithme, uniquement pour le cercle, est ici: http://jsfiddle.net/nwvao72r/3/
la source