Bombe tomber algorithme
J'ai un n x m
matrice composée d'entiers non négatifs. Par exemple:
2 3 4 7 1
1 5 2 6 2
4 3 4 2 1
2 1 2 4 1
3 1 3 4 1
2 1 4 3 2
6 9 1 6 4
"Lâchant une bombe" diminue d'une unité le nombre de la cellule cible et de huit de ses voisins, à moins de zéro.
x x x
x X x
x x x
Ce qu'est un algorithme qui permettrait de déterminer le nombre minimum de bombes nécessaires pour réduire toutes les cellules à zéro?
B Option (en Raison pour moi de ne pas être un lecteur attentif)
En fait la première version de problème n'est pas celui que je cherche la réponse. Je n'ai pas de lire attentivement l'ensemble de la tâche, il y a des contraintes supplémentaires, nous disons:
Ce sujet de problème simple, lorsque la séquence dans la ligne doit être non-augmentation:
8 7 6 6 5
est possible de séquence d'entrée
7 8 5 5 2
n'est pas possible depuis le 7 -> 8 croissante dans une séquence.
Peut-être trouver réponse pour "plus facile" cas serait de les aider dans la recherche de solution pour la plus dure.
PS: je crois que lorsque l'on a plusieurs mêmes situations nécessitent un minimum de bombes pour effacer la ligne supérieure, vous choisissez l'une que l'utilisation de la plupart des bombes sur le "côté gauche" de la ligne. Encore une preuve que pourrait être correct?
- Astuce: dans quelles circonstances est une bombe dans un endroit tout aussi bon comme une bombe dans un autre, et peut-être mieux?
- envisagez-vous gourmand et les déposer dans le plus grand? Parce que cela ne fonctionne pas. Prendre un 1x5 conseil avec
2 2 4 2 2
. Seulement de ces endroits, je pense, sont les coins, où vous pouvez mettre une bombe dans la diagonale du voisin, mais qui ne résout pas beaucoup. - Bien, je viens de trouver ot que certains champs peuvent être ignorées, comme dans l'exemple 2 3 1 5 Dropant sur 2,3,1 est inutile, parce que tomber sur eux la cause de certains sous-ensemble des dommages qui peuvent nous causer par une chute sur 5. Mais impossible de trouver comment le faire fonctionner à l'échelle mondiale (si c'est de manière correcte). De compensation 2 nécessite l'utilisation de 2 bombes larguées sur l'un de voisin et 5 contenant d'autres ensembles de dommages. Mais alors je ne sais pas quoi faire plus tard, car lorsque vous le réécrire (après la baisse), alors vous avez deux choix (il n'y a pas un super-ensemble de dommages).
- Grande question. J'ai une idée, je vais essayer avant de poster une réponse.
- Est-ce un problème NP-difficile, par hasard? Il semble être une variante de la Maximum de Problème de Couverture.
- Je pense que tu pourrais essayer de chercher le nombre qui a le plus de 1 autour d'elle. Quand il y a 2 nombres avec le même nombre de 1 que vous pourriez trouver celui avec le nombre le plus bas ou à moins de 0 et de répéter.
- Je soupçonne que l'OP est malveillant gars en essayant de décider si P = NP par le travail des autres. Honte à vous pour essayer de nous tromper, Kostek! 😛
- Ne peut pas être NP c'est utiliser sur concours (4 tâche -> 5h). Pouvez vous donner le lien vers le contenu si vous comprenez la langue polonaise comme une preuve.
- Il pourrait être encore NP et faisable. La taille du problème que vous avez donné n'est pas très grand. Il est assez difficile de produire un travail de réponse - laisser un seul qui s'exécute en temps polynomial.
- Je me demande à quelle vitesse l'algorithme du simplexe irait sur ce type de problème?
- +1 pour me donner quelque chose d'intéressant à réfléchir
- Êtes-vous vouloir un code de solution, un Mathématiques expression, ou tout simplement le processus de la pensée?
- "Une bombe modèle est un terme que je rêvais juste il ya quelques semaines. Il ne veut rien dire, mais vous seriez surpris de voir à quelle vitesse il est pris sur. Pourquoi, j'ai eu toutes sortes de gens convaincus, je pense qu'il est important pour les bombes pour faire exploser près de l'autre et faire une nette photographie aérienne. Il y a un colonel de Pianosa qui n'est guère concerné plus de savoir s'il frappe la cible ou non." Général Peckem, Catch 22.
- grand problème! Merci de poster le lien.
- Non, je ne pensais pas frappé-le-haut (qui ne convient pas à ma question). Oui, je pensais les coins, et en fait, ça aide beaucoup.
- Cela ressemble un peu comme dragueur de mines, à l'exception que vous pourriez mettre à la bombe sur un point plus d'une fois et le nombre seulement d'indiquer le nombre minimum de bombes sur et autour d'un point au lieu de le nombre exact.
- peut-être vous devriez clarifier, vous l'avez dit, la question est:
what's the minimum amount of bombs required to clean the board?
cela veut dire qu'il n'est pas forcément nécessaire de trouver un véritable bombardement de modèle, mais juste le nombre minimal de bombes? - Est-il un problème à partir d'une certaine ligne juge? Je voudrais essayer de vérifier ma solution.
- Peut-être que vous avez vu quelque chose que je n'ai pas, mais je suis assez sûr que vous ne pouvez pas trouver le nombre minimal de bombes sans essentiellement avoir calculé le motif réel...
- Il est assez facile de trouver une limite inférieure et la limite supérieure pour le nombre de bombes, et si ils matches que ça doit être le nombre exact de bombes nécessaires, qui peuvent être trouvés sans calculer le motif réel. Mais cette situation probablement qu'une fois dans une lune bleue, si jamais.
- Eh bien, exactement. Même si vous pensez plus sophistiqués limites que le immédiatement évidentes (la somme des valeurs/9, la somme des valeurs), ils ne sont pratiquement jamais coïncider. À moins que vos limites sont beaucoup plus sophistiqués, dans ce cas, ils pourraient contribuer à une solution et vous devriez poster une réponse avec des détails.
- J'ai ajouté une réponse qui décrit ce que je pense, c'est une méthode pour trouver une limite minimale, sans trouver une solution. Lorsqu'il est combiné avec un algorithme glouton, il peut être utilisé pour prouver que la solution trouvée par les cupides, dans ce cas particulier, est en effet une solution optimale.
- Si à partir d'un concours, quelles sont les limites de ces entrées?
- Serait intéressé à voir le problème d'origine.
- Aussi, si votre
m
etn
et les nombres sont tous assez petit, vous pouvez essayer de faire le plein de l'arbre de recherche, qui vous donnera la solution optimale, cependant, il va prendre beaucoup de temps. - 2.4 k vues en une seule journée? C'est quelque chose euh?
- Êtes-vous intéressé dans le problème de décision (c'est à dire, tout en sachant le nombre minimum de bombes requis), ou êtes-vous aussi intéressé par la problème d'optimisation (c'est à dire, sachant que les bombes sont nécessaires, non seulement combien)?
- ce n'est pas la manière dont la prise/de l'optimisation sont définis. La décision est "pouvez-vous le faire avec moins de
k
bombes", l'optimisation est "comment quelques bombes faut-il". Ni vous obliger à spécifier la solution complète sauf à titre de preuve. - certains gars postes de ses devoirs et obtient une tonne de rep pour elle. 😀
- 2.4 k est rien. J'ai vu plus de 100k en un jour avant.
- Pour les gens de jouer avec: jsbin.com/ivaruj/2 (ignorer le code s'il vous plaît, merci)
- Si de nombreuses réponses... Iwill essayer de reposter autant que possible. Si j'ai omis quelqu'un recomment pls. @Anthony Queen Quoi Que Ce Soit. La cible, c'est que je dois comprendre - pourquoi? Pourquoi certains approche fonctionne, comment faire face à des problèmes similaires et ainsi de suite.
- La panique ici, vous allez deadline24.pl/assets/Uploads/dl24.elim.Un.2012.pdf Il est polonais tho. Vous pouvez essayer quelques-uns de traduction, mais les effets ne sont pas garantie.
- Je n'ai trouvé aucun test ni juger sur la page ci-dessus. Mais peut-être tout simplement pas de recherche assez bon.
- Ewert Conseil d'administration est de 1000x1000 chaque champ de la "santé" ainsi 1000. Pas de limite de temps donnée.
- Cochez les 3 réponses ci-dessus
- Le bortsch 4 tâches, 5 heures pour le faire. Les limites ont été donnés 2 post ci-dessus. Doute je peux adapter avec de la mémoire (32 bits de la machine, je crois).
- Je veux savoir singulier nombre entier de bombes qui sont nécessaires pour diminuer toutes à 0. Le nombre doit être le plus petit possible.
- Hughes Troll... C'est juste de la préparation aux concours, rien à voir avec l'université.
- Si de nombreuses réponses que je ne peux pas suivre les lire T. T
- Aussi comme je l'ai dit sous-optimale n'est pas une option. La réponse doit être exacte, parce que les commentaires étaient binaire 1 (correct), 0(faux).
- J'ai donner la mise à jour à la tâche oublié une contrainte sequnce en ligne ne serait pas augmenter de manière
8 7 7 6 6 5 3 0
est de ligne valide4 2 3 2 1 8 7 7
n'est pas valide ligne - merci de laisser le problème, tel qu'il a été depuis le cas général, c'est beaucoup plus intéressant. Vous pouvez ajouter une nouvelle contrainte que la partie (b) ou de bonus, ou tout simplement une nouvelle section. Par exemple, demandez-lui: "Bonus: pouvez-vous trouver un algorithme efficace si les lignes sont non-décroissante?"
- Ok. Je vais le faire.
- Bien sûr, j'ai été un peu laxiste avec les définitions. Ça dépend, si; souvent, le certificat pour un problème d'optimisation combinatoire est l'affectation de variable, non seulement la valeur de la fonction objectif. Il sonne comme le certificat pour lequel Kostek est intéressée est plus simple (et peut-être prête à une moins complexes en termes de calcul de l'algorithme) que ce que la plupart des réponses ci-dessous supposent.
- Je ne comprends pas le contraindre. Pouvez-vous expliquer à nouveau s'il vous plaît? Le modifier, je veux dire. ( L'Option B? )
- pour le B contraindre, c'est que la séquence doit être de baisse, à la fois horizontale et à la verticale ou à l'horizontale est uniquement?
- Je recommande la suppression de l'option B, il est facile à résoudre comme nneonneo a montré et c'est une distraction de la question d'origine qui a généré une énorme quantité d'intérêt et les réponses. Je pense que vous devriez revenir à la question à sa forme d'origine et de laisser cette bonne conversation continue, même si elle n'est pas à la conversation que vous souhaitez démarrer :).
- Toute chance vous travaillez pour le Roomba et de la création d'une bombe à s'en décrocher drone de l'armée de l'air?
- Si une bombe diminue seulement horizontale et verticale voisins et tous les poids sont autorisés (version A), alors le problème est NP-dur, comme l'a démontré dans web.sau.edu/lilliskevinm/wirelessbib/ClarkColbournJohnson.pdf (Théorème 5.1), comme vous pouvez facilement convertir leur grille de graphiques à une matrice à l'aide de 0 et de 1 entrées. Lâchant une bombe est alors équivalente à l'ajout de ce sommet à l'ensemble dominant. Je suis sûr que vous pouvez prouver le cas avec la diagonale voisins NP-dur de la même façon avec quelques modifications.
Vous devez vous connecter pour publier un commentaire.
Il y a un moyen de réduire ce chiffre à un simple sous-problème.
Il y a 2 parties, l'explication de l'algorithme, et la raison pour laquelle l'algorithme
fournit une solution optimale. La première ne fera pas de sens sans la seconde, donc je vais
démarrer avec le pourquoi.
Si vous pensez que des bombardements, le rectangle (assumer un grand rectangle - pas de bords cas encore)
vous pouvez voir que la seule façon de réduire le rectangle creux de carrés sur le
périmètre à 0 est de la bombe soit le périmètre ou à la bombe le rectangle creux de
carrés à l'intérieur du périmètre. Je vais appeler le périmètre de la couche 1, et le rectangle à l'intérieur de la couche 2.
Une idée importante est qu'il n'y a pas de point de bombardement de la couche 1, parce que la
"blast radius", vous obtenez de le faire est toujours contenu dans le rayon de l'explosion de
un autre carré de la couche 2. Vous devriez être en mesure de facilement vous convaincre de cela.
Ainsi, on peut réduire le problème de trouver une manière optimale à la bombe à l'écart du périmètre, alors nous pouvons répéter que jusqu'à ce que toutes les places sont 0.
Mais bien sûr, ce n'est pas toujours de trouver une solution optimale si il est possible de bombe
loin du périmètre de moins en moins de façon optimale, mais en utilisant X bombes supplémentaires faire
le problème de la réduction de la couche intérieure plus simple par >X des bombes. Donc, si nous appelons
le permiter couche, si nous placer un X bombes quelque part dans la couche 2 (juste
à l'intérieur de la couche 1), peut-on réduire l'effort de la plus tard de bombardement à l'écart de la couche 2 de plus de
X? En d'autres termes, nous devons prouver que nous pouvons être gourmand dans la réduction de l'extérieur
de périmètre.
Mais, nous savons que nous pouvons être gourmand. Parce que pas de bombe dans la couche 2 peut être jamais plus
efficace dans la réduction de la couche 2 à 0 que un stratégiquement placé la bombe dans la couche 3. Et
pour la même raison qu'avant - il y a toujours une bombe on peut placer dans la couche 3 qui
aura une incidence sur chaque carré de la couche 2 qui, une bombe placée dans la couche 2 peut. Donc, il peut
jamais nous nuire d'être gourmand (dans ce sens de la gourmande).
Donc, tout ce que nous avons à faire est de trouver la manière optimale afin de réduire le permiter à 0 par les bombardements
la prochaine couche intérieure.
Nous sommes jamais fait de mal par le premier bombardement aérien de l'angle à 0, car seul le coin de la couche interne peut l'atteindre, de sorte que nous n'avons pas vraiment le choix (et, tout à la bombe sur le périmètre qui peut atteindre le coin a un rayon de l'explosion contenue dans le rayon de l'explosion du coin de la couche intérieure).
Une fois que nous avons fait, les places sur le périmètre adjacent à l'0 angle ne peut être atteint par 2 carrés de la couche intérieure:
À ce point, le périmètre est effectivement fermé 1 dimensions de la boucle, parce qu'une bombe va réduire de 3 cases adjacentes. Sauf pour certains étrangeté près des coins - X "hit" A,B,C,et D.
Maintenant nous ne pouvons pas utiliser tout rayon de l'explosion astuces - la situation de chaque carré est symétrique, sauf pour ce qui est étrange des coins, et là encore pas de rayon de l'explosion est un sous-ensemble de l'autre. Notez que si c'était une ligne (comme le Colonel de Panique discute) au lieu d'une boucle fermée, la solution est triviale. Les points d'extrémité doit être réduite à 0, et il n'a jamais nuit à vous bombarder les points adjacents à la fin des points, parce que le rayon de l'explosion est un sur-ensemble. Une fois que vous avez fait votre point de terminaison de 0, vous avez encore un nouveau point de terminaison, sorte de répétition (jusqu'à ce que la ligne est 0).
Donc, si nous pouvons réduire de façon optimale une seule place dans la couche de 0, nous avons un algorithme (parce que nous avons coupé la boucle et ont maintenant une ligne droite avec des points de terminaison). Je crois que les bombardements autour de la place avec la valeur la plus basse (ce qui vous donne 2 options) tels que la valeur la plus élevée dans les 2 carrés de la valeur la plus faible est le minimum possible (vous pouvez diviser votre bombardements de gérer ce) sera optimal, mais je n'ai pas (encore?) avoir une preuve.
there is no point bombing layer 1, because the "blast radius" you get from doing so is always contained within the blast radius of another square from layer 2
- Vous oubliez le cas où seule la couche 1 a une valeur non-nulle. Dans ce cas de bombardement de la couche 2 ne fera que réduire la somme de 1, tandis que le bombardement de la couche 1 permettra de réduire jusqu'à 3.But, we do know we can be greedy...
- Je ne suis pas l'achat de cette. Envisager1 1 2 1 1 2
sur le périmètre. Le nombre minimum de bombes est de 4, mais il y a trois solutions distinctes. Chaque solution a un impact différent sur la couche suivante. Tant qu'il y a de multiples minimale des solutions pour un périmètre, vous vous ne pouvez pas isoler complètement le périmètre sans tenir compte des couches internes. Je ne pense vraiment pas que ce problème peut être résolu sans retour en arrière.0011100
0100010
0000000
0000000
1110111
. La manière optimale de la bombe, la première couche est de la bombe dans le milieu de la deuxième rangée, en prenant un total de trois bombes pour tuer la couche externe. Mais alors vous avez besoin de deux bombes à prendre soin de la couche suivante. Optimale ne nécessite que quatre bombes total: deux pour la première deux lignes et de deux pour la dernière ligne.Pólya dit "Si vous ne pouvez pas résoudre un problème, alors il ya un problème plus facile, vous pouvez résoudre: trouver."
L'évidence plus simple problème est le 1-dimensions du problème (lorsque la grille est une seule ligne). Commençons par le plus simple des algorithmes goulûment bombardement de la plus grande cible. Quand est-ce mal?
Donné
1 1 1
, l'algorithme glouton est indifférent à la il les premières bombes. Bien sûr, le centre de la cellule est mieux - il de zéros tous les trois cellules à la fois. Ceci suggère un nouvel algorithme A, "bombe à minimiser la somme restante". Quand est-ce que l'algorithme de mal?Donné
1 1 2 1 1
, l'algorithme A est indifférent entre les bombardements de la 2e, 3e ou 4e cellules. Mais les bombardements de la 2ème cellule de quitter0 0 1 1 1
est mieux que les bombardements de la 3ème cellule de quitter1 0 1 0 1
. Comment résoudre ce problème? Le problème avec les bombardements de la 3ème cellule est qu'il nous laisse travailler à gauche et à travailler pour le droit qui doit être fait séparément.Comment à propos de "bombe à minimiser la somme restante, mais de maximiser le minimum de la gauche (d'où on a bombardé), en plus du minimum pour le droit". Appelons cet algorithme B. Quand est-ce que l'algorithme de mal?
Edit: Après avoir lu les commentaires, je suis d'accord beaucoup plus intéressante problème serait du à une dimension du problème a changé de sorte que les extrémités se rejoignent. Aimerais voir les progrès sur ce point.
J'ai dû arrêter à seulement une solution partielle à ce problème depuis que j'ai été hors du temps, mais nous espérons encore cette solution partielle fournit quelques indications sur une approche possible pour résoudre ce problème.
Lorsqu'ils sont confrontés à un problème difficile, je tiens à venir avec le plus simple des problèmes pour développer une intuition sur le problème de l'espace. Ici, la première étape j'ai pris était de réduire ce 2-D problème dans un 1-D de problème. Considérons une droite:
D'une manière ou d'une autre, vous savez que vous aurez besoin de bombe ou autour de la
4
spot 4 fois à le faire descendre à 0. Depuis la gauche de la tache est un nombre inférieur, il n'y a aucun avantage à bombarder les0
ou la4
sur le bombardement de la2
. En fait, je crois (mais il leur manque une preuve rigoureuse) que le bombardement de la2
jusqu'à ce que le4
spot descend à 0 est au moins aussi bonne qu'une autre stratégie pour obtenir que4
à 0. On peut continuer vers le bas de la ligne de la gauche vers la droite dans une stratégie comme ceci:Un couple de l'échantillon de bombardement commandes:
L'idée de départ avec un nombre qui doit aller vers le bas d'une manière ou d'une autre est un attrayant, car il devient tout à coup accessible pour trouver une solution qui, comme certains le prétendent à être au moins aussi bonne que toutes les autres solutions.
La prochaine étape dans la complexité où cette recherche de au moins aussi bonne est encore possible est sur le bord de la carte. Il est clair pour moi qu'il n'y a aucune stricte des prestations à la bombe contre le bord externe; vous êtes mieux de bombardement de la place d'en obtenir trois autres espaces de libre. Compte tenu de cela, nous pouvons dire que le bombardement de l'anneau à l'intérieur de la bordure est de au moins aussi bonne comme le bombardement du bord. En outre, on peut combiner cela avec l'intuition que le bombardement de la droite à l'intérieur de la bordure est en fait la seule façon d'obtenir de bord espaces à 0. Même plus, il est carrément simple pour déterminer la stratégie optimale (en ce qu'elle est au moins aussi bonne que n'importe quelle autre stratégie) pour obtenir l'angle des nombres jusqu'à 0. Nous avons mis tous ensemble et que vous pouvez obtenir beaucoup plus près d'une solution dans la 2-D de l'espace.
Compte tenu de l'observation au sujet de pièces de coin, nous pouvons dire que nous savons que la stratégie optimale pour passer d'une planche de départ à un conseil d'administration avec des zéros sur tous les angles. Ceci est un exemple de ce type de conseil (j'ai emprunté les numéros à partir du linéaire de deux planches ci-dessus). J'ai étiqueté certains espaces différemment, et je vais vous expliquer pourquoi.
On remarquera à la rangée du haut vraiment ressemble étroitement linéaires exemple que nous avons vu plus tôt. En rappelant que notre observation précédente selon laquelle la meilleure façon d'obtenir la rangée supérieure à 0 est de la bombe de la deuxième ligne (la
x
ligne). Il n'existe aucun moyen pour effacer la ligne d'en haut par les bombardements tout de lay
lignes et aucun avantage supplémentaire de bombardement de la ligne du haut, au cours de bombardements de l'espace correspondant sur lex
ligne.Nous pourrait appliquer le linéaire de la stratégie à partir de ci-dessus (à bombarder les espaces correspondants sur le
x
ligne), au sujet de nous-mêmes seulement avec le haut de la ligne et rien d'autre. Ce serait quelque chose comme ceci:Le défaut de cette approche est particulièrement évidente dans les deux derniers attentats à la bombe. Il est clair, étant donné que la seule bombe de sites qui permettent de réduire la
4
figure dans la première colonne de la deuxième ligne sont la premièrex
et lay
. Les deux derniers attentats à la bombe sont nettement inférieures à juste bombardements de la premièrex
, qui aurait fait exactement la même (en ce qui concerne la première place dans la rangée du haut, que nous n'avons pas d'autre moyen de compensation). Depuis, nous avons démontré que notre stratégie actuelle n'est pas optimale, une modification de la stratégie est clairement nécessaire.À ce point, je peux prendre un pas en arrière vers le bas dans la complexité et de se concentrer seulement un un coin. Considérons ceci:
Il est clair que la seule façon d'obtenir les espaces avec
4
à zéro sont à la bombe contre une combinaison dex
,y
, etz
. Avec quelques acrobaties dans mon esprit, je suis assez sûr que la solution optimale est de la bombex
trois fois et puisa
puisb
. Maintenant c'est une question de comprendre comment je suis arrivé à cette solution et si elle révèle toute l'intuition que nous pouvons utiliser à même de résoudre ce problème local. Je remarque qu'il n'y a pas de bombardements dey
etz
espaces. Essaye de trouver un coin où les bombardements de ces espaces de sens que donne un coin qui ressemble à ceci:Pour celui-ci, il est clair pour moi que la solution optimale est de la bombe
y
5 fois etz
5 fois. Nous allons aller un peu plus loin.Ici, il se sent de la même façon intuitive que la solution optimale est de la bombe
a
etb
6 fois et puisx
4 fois.Maintenant, il devient un jeu de la façon de transformer ces intuitions dans les principes que nous pouvons construire.
, Nous l'espérons, être poursuivi!
À jour sur la question d'un simple algorithme glouton donne un résultat optimal.
Chute d'Un[0,0] bombes d'Une cellule[1,1], puis déposez Une[1,0] bombes de la cellule A[2,1], et la poursuite de ce processus vers le bas. Pour nettoyer le coin en bas à gauche, déposer max(A[N-1,0], A[N-2,0], A[N-3,0]) bombes à la cellule d'Un[N-2,1]. Ce sera complètement nettoyer les 3 premières colonnes.
Avec la même approche, nettoyage des colonnes 3,4,5, puis les colonnes 6,7,8, etc.
Malheureusement, cela n'aide pas à trouver de solution pour le problème d'origine.
"Gros" problème (sans "nonicreasing" contrainte) peut être prouvée pour être NP-difficile. Voici l'esquisse de la preuve.
Supposons que nous avons un graphe planaire de degré au plus 3. Nous allons trouver le minimum vertex cover de ce graphe. Selon l'article de Wikipedia à ce problème est NP-difficile pour les graphes planaires de degré au plus 3. Cela pourrait être prouvée par la réduction de Planes 3SAT. Et la dureté de la Planaire 3SAT - par la réduction de 3SAT. Ces deux épreuves sont présentées dans les dernières conférences en "Algorithmique Limites Inférieures" par le prof. Erik Demaine (cours 7 et 9).
Si nous nous sommes séparés quelques bords de l'original graphique (graphique de gauche sur le schéma), chacune avec le même nombre de nœuds supplémentaires, le graphe obtenu (graphique de droite sur le schéma) devraient avoir exactement le même minimum vertex cover d'origine pour les sommets. Cette transformation permet d'aligner graphe de sommets à l'arbitraire des positions sur la grille.
Si nous plaçons graphique uniquement des sommets de même les lignes et les colonnes (de telle sorte que deux arêtes incident à un sommet forme un angle aigu), insérer "ceux" là où il y a un bord, et insérer des "zéros" à d'autres positions sur la grille, on peut utiliser n'importe quelle solution pour le problème d'origine pour trouver le minimum vertex cover.
Vous pouvez représenter ce problème comme programmation en nombres entiers problème. (ceci est juste l'une des solutions possibles pour aborder ce problème)
Avoir des points:
on peut écrire 16 équations pour le point f, par exemple, détient
minimaised plus de la somme de tous les indices et de solution entière.
Solution est bien sûr la somme de cet index.
Ceci peut être encore simplifiée par le réglage de tous les xi, sur les limites de 0, de sorte que vous finissez par avoir 4+1 équation dans cet exemple.
Problème est qu'il n'est pas trivial algorhitm pour résoudre de tels problèmes. tI ne suis pas expert sur ce sujet, mais la résolution de ce problème comme un problème de programmation linéaire est NP-difficile.
C'est une réponse partielle, j'essaie de trouver une limite inférieure et la limite supérieure, qui pourrait être le nombre de bombes.
En 3x3 et petits conseil d'administration, la solution est trivialement toujours la plus grande cellule numérotée.
Dans les conseils d'administration de plus de 4x4, la première évident limite inférieure correspond à la somme des angles:
cependant vous organiser la bombe, il est impossible d'effacer ce 4x4 conseil avec moins de 2+1+6+4=13 bombes.
Il a été mentionné dans d'autres réponses que de placer la bombe sur la deuxième-à-coin pour éliminer le coin n'est jamais pire que de placer la bombe sur le coin lui-même, étant donné que le conseil d'administration:
Nous pouvons zéro les coins en plaçant des bombes sur la deuxième-à-coin pour donner un nouveau conseil d'administration:
So far So good. Nous avons besoin de 13 bombes pour effacer les coins.
Maintenant d'observer le nombre de 6, 4, 3 et 2 indiquées ci-dessous:
Il n'y a aucun moyen de bombe deux de ces cellules à l'aide d'une seule bombe, de sorte que le minimum de la bombe a augmenté de 6+4+3+2, donc augmenter le nombre de bombes que nous avons utilisé pour effacer les coins, on obtient que le nombre minimum de bombes requis pour cette carte est devenue 28 bombes. Il est impossible d'effacer cette carte avec les moins de 28 bombes, ce qui est la borne inférieure de cette carte.
Vous pouvez utiliser l'algorithme glouton pour établir une limite supérieure. D'autres réponses ont montré que l'algorithme glouton donne une solution qui utilise 28 bombes. Depuis que nous avons montré précédemment que pas de solution optimale peut avoir moins de 28 bombes, donc 28 bombes est en effet une solution optimale.
Quand gourmand et la méthode pour trouver le minimum lié, je l'ai mentionné ci-dessus ne converge pas bien, je suppose que vous n'avez pas à revenir à la vérification de toutes les combinaisons.
L'algorithme pour trouver la limite inférieure est la suivante:
minimums
liste.minimums
liste pour obtenir la limite inférieure.Ce serait une approche gourmande:
Calculer un "score" de la matrice d'ordre n X m, où le score[i][j] est le total des déductions de points dans la matrice si la position (i,j) est bombardée. (Max score d'un point de 9 min score est de 0)
Déplacement de la ligne sage, et trouver la première position avec un score élevé (dire (i,j)).
Bombe (i,j). Augmentation de la bombe comte.
Si tous les éléments de la matrice d'origine ne sont pas à zéro, puis goto 1.
J'ai des doutes que c'est la solution optimale si.
Edit:
L'approche Gourmande que j'ai posté ci-dessus, alors qu'il travaille, plus probablement, ne nous donne pas la solution optimale. Alors j'ai pensé que devrait ajouter certains éléments de DP pour elle.
Je pense que nous pouvons convenir que, à tout moment, l'un des postes les plus élevés "note" (note[i][j] = total des déductions de points si (i,j) est bombardée) doit être ciblée. Partant de cette hypothèse, voici la nouvelle approche:
NumOfBombs(M): (retourne le nombre minimum d'attentats à la bombe obligatoire)
Donnée une Matrice M d'ordre n X m. Si tous les éléments de M sont égaux à zéro, puis de retour 0.
Calculer le "score" de la matrice M.
Laisser le k distincts positions P1,P2,...Pk (1 <= k <= n*m), les positions de M avec les scores les plus élevés.
retour (1 + min( NumOfBombs(M1), NumOfBombs(M2), ..., NumOfBombs(Mk) ) )
où M1,M2,...,Mk sont les matrices résultantes si nous bombarder les positions P1, P2, ..., Pk, respectivement.
Aussi, si nous voulons l'ordre des positions de nuke en plus de cela, nous devons garder une trace des résultats de "min".
Votre nouveau problème, avec le nondecreasing valeurs entre les lignes, est assez facile à résoudre.
Observer que la colonne de gauche contient le plus grand nombre. Par conséquent, toute solution optimale doit d'abord réduire cette colonne à zéro. Ainsi, nous pouvons effectuer une 1-D bombardement au cours de cette colonne, la réduction de chaque élément à zéro. Nous laissons les bombes tombent sur la deuxième colonne, de sorte qu'ils font le maximum de dégâts. Il y a beaucoup de posts ici à faire avec les 1D cas, je pense que, si je me sens en sécurité dans sauter ce cas. (Si vous voulez me décrire, je peux.). En raison de la diminution de la propriété, les trois colonnes de gauche seront tous réduits à zéro. Mais, nous allons prouvable utiliser un nombre minimum de bombes ici parce que la colonne de gauche doit être remis à zéro.
Maintenant, une fois que la colonne de gauche est mis à zéro, nous venons de couper les trois colonnes de gauche qui sont maintenant remis à zéro et répéter l'opération avec la réduction de la matrice. Cela doit nous donner une solution optimale car à chaque étape, nous utilisons un prouvable nombre minimum de bombes.
Il n'est pas nécessaire de transformer le problème linéaire des sous-problèmes.
Au lieu d'utiliser un simple gourmand heuristique, qui est à bombe les coins, en commençant par la plus grande.
Dans l'exemple donné il y a quatre coins, { 2, 1, 6, 4 }. Pour chaque coin, il n'y a pas de meilleure déplacer que de bombarder la cellule en diagonale vers le coin, de sorte que nous savons pour un fait, notre première 2+1+6+4 = 13 attentats à la bombe doit être dans ces cellules de la diagonale. Après l'attentat à la bombe nous nous retrouvons avec une nouvelle matrice:
Après les 13 premiers attentats à la bombe, nous utilisons l'heuristique d'éliminer 3 0 2 par l'intermédiaire de trois attentats à la bombe. Maintenant, nous avons 2 nouveaux coins, { 2, 1 } dans le 4e rang. Nous bombarder ceux, 3 attentats à la bombe. Nous avons réduit la matrice de 4 x 4 maintenant. Il y a un coin, le coin supérieur gauche. Nous avons bombe. Maintenant, nous avons 2 coins gauche, { 5, 3 }. Depuis le 5 est le plus grand coin, on bombe que le premier, 5 attentats à la bombe, puis enfin à la bombe le 3 dans l'autre coin. Le total est 13+3+3+1+5+3 = 28.
Ce n'est d'une largeur de recherche pour le chemin le plus court (une série d'attentats à l'explosif) par le biais de ce "labyrinthe" de postes. Non, je ne peux pas prouver qu'il n'existe pas d'algorithme plus rapide, désolé.
Il semble qu'une approche de programmation linéaire peut être très utile ici.
Laisser Pm x n être la matrice avec les valeurs des positions:
Maintenant laisse définir une bombe de la matrice B(x, y)m x n,avec 1 ≤ x ≤ m, 1 ≤ y ≤ n comme ci-dessous
de telle manière que
Par exemple:
Nous sommes donc à la recherche d'une matrice Bm x n = [bij] que
Peut être définie comme une somme de bombe matrices:
(qij serait alors le quantité de bombes nous arrêtions en position pij)
pij - bij ≤ 0 (pour être plus succinct, disons-le comme P - B ≤ 0)
Aussi, B devrait minimiser la somme .
Nous pouvons aussi écrire B comme le vilain de la matrice à l'avance:
et depuis P - B ≤ 0 (ce qui signifie P ≤ B) nous avons assez linéaire système d'inéquation ci-dessous:
Être qmn x 1 défini comme
pmn x 1 défini comme
Nous pouvons dire que nous avons un système de Le système représenté ci-dessous en tant que produit de matrices http://latex.codecogs.com/gif.download?S%5Cmathbf%7Bq%7D&espace;%5Cge&espace;%5Cmathbf%7Bp%7D être Smn x mn la matrice à inverser à résoudre le système. Je n'ai pas le développer moi-même, mais je crois qu'il devrait être facile à faire dans le code.
Maintenant, nous avons un minimum de problème qui peut être énoncé comme
Je crois que c'est quelque chose de facile, presque banale pour être résolu avec quelque chose comme le algorithme du simplexe (il y a plutôt cool doc à ce sujet). Cependant, je ne sais presque pas de programmation linéaire (je vais prendre un cours à ce sujet sur Coursera, mais il est juste dans le futur...), j'ai eu quelques maux de tête à essayer de le comprendre et j'ai un énorme travail en freelance pour finir donc, je viens de donner jusqu'ici. Il peut être que j'ai fait quelque chose de mal à un certain point, ou qu'il ne peut pas aller plus loin, mais je crois que cette voie peut éventuellement conduire à un la solution. De toute façon, je suis impatient pour votre feedback.
(Merci pour ce site exceptionnel pour créer des images à partir de LaTeX expressions)
"Despite the many crucial applications of this problem, and intense interest by researchers, no efficient algorithm is known for it.
voir la page 254. Entier la programmation linéaire est un très gros problème de calcul. Notre seul espoir, pour être efficace consiste à exploiter les propriétés intrinsèques au sujet de votre matrice S. Il n'est pas que arbitraires, après tout.Cette gourmande solution
semble être correct:Comme indiqué dans les commentaires, il va échouer en 2D. Mais peut-être que vous pouvez l'améliorer.
Pour 1D:
Si il y a au moins 2 numéros que vous n'avez pas besoin de tirer le plus à gauche parce que le tournage de la deuxième n'est pas pire. Donc tirer à la seconde, alors que la première n'est pas 0, parce que vous avez à faire. Passer à la cellule suivante. N'oubliez pas la dernière cellule.
Code C++:
Donc pour la 2D:
Nouveau: vous n'avez pas besoin de tirer sur la première ligne (si il y a la seconde). Donc tirer à la seconde. Résoudre 1D tâche de première ligne. (parce que vous devez le faire à null). Aller vers le bas. N'oubliez pas la dernière ligne.
"0110","1110","1110"
. Vous avez seulement besoin d ' 1 coup, mais je crois que Votre algorithme 2.Mathematica Linéaire en nombres Entiers Programmation à l'aide de branch-and-bound
Comme il a déjà été mentionné, ce problème peut être résolu à l'aide de programmation linéaire en nombres entiers (qui est NP-Dur). Mathematica a déjà PAI intégré.
"To solve an integer linear programming problem Mathematica first solves the equational constraints, reducing the problem to one containing inequality constraints only. Then it uses lattice reduction techniques to put the inequality system in a simpler form. Finally, it solves the simplified optimization problem using a branch-and-bound method."
[voir L'Optimisation Sous Contraintes De Tutoriel dans Mathematica.. ]J'ai écrit le code suivant qui utilise ILP bibliothèques de Mathematica. Il est étonnamment rapide.
Pour l'exemple fourni dans le problème:
Sorties
Pour tous ceux qui lisent ce avec un algorithme glouton
Essayer votre code sur la suite de 10x10 problème:
Ici, il est séparées des virgules:
Pour ce problème, ma solution contient 208 bombes. Voici une solution possible (j'ai été en mesure de résoudre ce en environ 12 secondes).
Comme un moyen de tester les résultats de Mathematica est de produire, de voir si votre algorithme glouton peut faire mieux.
Afin de minimiser le nombre de bombes, nous avons à en maximiser les effets de chaque bombe. Pour arriver à cela, à chaque étape, nous devons sélectionner la meilleure cible. Pour chaque point de sommation et il est huit voisins - peut être utilisée comme un critère d'efficacité de la quantité de bombardement de ce point. Cette offre à peu près de la séquence optimale de bombes.
UPD: il faut aussi prendre le nombre de zéros en compte, parce que bombin est inefficace. En fait, le problème est de minimiser le nombre de hitted zéros. Mais nous ne pouvons pas savoir comment n'importe quelle étape nous rapproche de cet objectif. Je suis d'accord avec l'idée que le problème est NP-complet. Je suggérons une approche gourmande, qui donnera une réponse réel.
1010101
,0010100
(rangée du haut, du bas de ligne) de Votre approche nécessitera 3. Il peut être fait en 2.Je crois que, pour réduire la quantité de bombes, vous avez besoin simplement de maximiser la quantité de dégâts..
pour cela besoin de vérifier la zone de qui a la plus grande force.. si vous en premier lieu à analyser le terrain avec un 3x3 noyau et de vérifier si la somme est plus fort.. et de la bombe de là.. et le faire jusqu'à ce que le terrain est plat.. pour ce dépôt, la réponse est 28
Ici est une solution à généraliser les bonnes propriétés des angles.
Supposons que nous pourrions trouver un parfait point de chute pour un champ donné, c'est un meilleur moyen pour diminuer la valeur. Ensuite, pour trouver le nombre minimum de bombes à être abandonné, une première version de l'algorithme pourrait être (le code est à copier-collé à partir d'un rubis de mise en œuvre):
Le défi est
choose_a_perfect_drop_point
. Tout d'abord, définissons ce qu'est un parfait point de chute.(x, y)
diminue la valeur dans(x, y)
. Il peut aussi diminuer les valeurs d'autres cellules.(x, y)
est mieux qu'un point de chute b pour(x, y)
si elle diminue les valeurs dans une bonne sur-ensemble de cellules qui b diminue.(x, y)
sont équivalent si elles diminuent le même ensemble de cellules.(x, y)
est parfait si c'est équivalent à l'ensemble maximal de points de chute pour(x, y)
.Si il y en est un parfait point de chute pour
(x, y)
, vous ne pouvez pas réduire la valeur à(x, y)
de manière plus efficace que de larguer une bombe sur l'un des parfaits points de chute pour(x, y)
.Un parfait point de chute pour un champ donné est un parfait point de chute pour un de ses cellules.
Voici quelques exemples:
Le parfait point de chute pour la cellule
(0, 0)
(index de base zéro) est(1, 1)
. Tous les autres points de chute pour(1, 1)
, c'est-à(0, 0)
,(0, 1)
, et(1, 0)
, la baisse des cellules.Un parfait point de chute pour la cellule
(2, 2)
(index de base zéro) est(2, 2)
, et aussi toutes les cellules qui l'entourent(1, 1)
,(1, 2)
,(1, 3)
,(2, 1)
,(2, 3)
,(3, 1)
,(3, 2)
, et(3, 3)
.une parfaite points de chute pour la cellule
(2, 2)
est(3, 1)
: Il diminue la valeur de(2, 2)
, et la valeur dans(4, 0)
. Tous les autres points de chute pour(2, 2)
sont pas maximale, car ils diminuent d'une cellule de moins en moins. Le parfait point de chute pour(2, 2)
est aussi le parfait point de chute pour(4, 0)
, et c'est le seul parfait point de chute pour le champ. Elle conduit à la solution parfaite pour ce champ (une bombe de baisse).Il n'est pas parfait point de chute pour
(2, 2)
: les Deux(1, 1)
et(1, 3)
diminution(2, 2)
et une autre cellule (ils sont maximales points de chute pour(2, 2)
), mais ils ne sont pas équivalents. Cependant,(1, 1)
est un parfait point de chute pour(0, 0)
, et(1, 3)
est un parfait point de chute pour(0, 4)
.Avec cette définition parfaite des points de chute et d'un certain ordre de vérifications, j'obtiens le résultat suivant pour l'exemple dans la question:
Cependant, l'algorithme ne fonctionne que si il y a au moins un parfait point de chute après chaque étape. Il est possible de construire des exemples où il n'existe pas de points de chute:
Pour ces cas, nous pouvons modifier l'algorithme de sorte qu'au lieu d'un parfait point de chute, nous avons choisi un système de coordonnées avec un choix minimal maximum de points de chute, puis de calculer le minimum pour chaque choix. Dans le cas ci-dessus, toutes les cellules contenant des valeurs de deux maximal de points de chute. Par exemple,
(0, 1)
a au maximum les points de chute(1, 1)
et(1, 2)
. Choisir soit l'un, puis calcualting le minimum conduit à ce résultat:Voici une autre idée:
Commençons par l'attribution d'un poids à chaque espace sur le conseil d'administration pour combien de numéros serait réduite par la chute d'une bombe là. Donc, si l'espace a une valeur non-nulle, il obtient un point, et si tout l'espace adjacent à celui-ci dispose d'un nombre différent de zéro, il obtient un point supplémentaire. Donc si il y a un 1000 par 1000 grille, nous avons un poids attribué à chaque de 1 million d'espaces.
Ensuite trier la liste des espaces en poids, et de la bombe celui avec le plus de poids. C'est d'obtenir la plupart de coup pour notre argent, pour ainsi dire.
Après cela, mettez à jour le poids de chaque espace dont le poids est touché par la bombe. Ce sera l'espace dont vous avez bombardé, et tout l'espace immédiatement à côté de lui, et tout l'espace adjacent à ceux-ci. En d'autres termes, tout l'espace qui aurait pu avoir sa valeur réduite à zéro par les bombardements, ou la valeur d'un voisin un espace réduit à zéro.
Ensuite, re-trier la liste des espaces à poids. Étant donné que seul un petit sous-ensemble des espaces avaient leur poids changé par l'attentat à la bombe, vous n'aurez pas besoin de recourir, pour l'ensemble de la liste, il suffit de déplacer ceux-ci dans la liste.
Bombe le nouveau plus grand poids de l'espace, et répétez la procédure.
Cela garantit que tous les bombardements réduit d'autant de cases que possible (en gros, il touche que très peu d'espaces qui sont déjà de zéro que possible), de sorte qu'il serait optimal, sauf que leur peut-être des liens en poids. Si vous deviez faire un peu de suivi quand il y a égalité pour le poids du sommet. Seulement une cravate pour le poids du sommet des questions, cependant, pas d'autres liens, donc j'espère que c'est pas trop le suivi.
Edit:
Mysticial du contre-exemple ci-dessous montre que, en fait, ce n'est pas la garantie d'être optimale, indépendamment de l'existence de liens en poids. Dans certains cas, en réduisant le poids autant que possible dans une étape donnée laisse le reste des bombes trop étendus pour obtenir un haut cumulée de réduction après la deuxième étape que vous pourriez avoir avec un peu moins gourmand choix dans la première étape. J'ai été un peu dérouté par la notion que les résultats sont insensibles à l'ordre des attentats à la bombe. Ils sont insensible à la commande, que vous pouvez prendre une série d'attentats à la bombe et de les rejouer depuis le début dans un ordre différent et de se retrouver avec le même conseil. Mais cela ne veut pas suivre à partir de ce que vous pouvez considérer chaque bombardement de façon indépendante. Ou, au moins, chaque attentat doit être considéré dans un manière qui tienne compte de la façon dont il met en place le conseil pour la suite des attentats à la bombe.
1010101
,0010100
peut-être un contre-exemple qui prouve que cette approche soit pas optimale. Cette approche nécessite 3. Il peut être fait en 2.Eh bien, supposons que nous nombre les postes du conseil, 1, 2, ..., n x m. Toute séquence de bombe gouttes peut être représenté par une séquence de nombres dans cette série, où le nombre peut répéter. Toutefois, l'effet sur le conseil d'administration est le même, peu importe de quel ordre vous déposez des bombes, si vraiment pas le choix de la bombe gouttes peut être représenté par une liste de n x m, où le premier nombre représente le nombre de bombes larguées sur la position 1, le second nombre représente le nombre de bombes larguées sur la position 2, etc. Appelons cette liste de n x m numéros de la "clé".
Vous pouvez essayer d'abord le calcul de tous les états résultant de l'1 bombe laisser tomber, puis les utiliser pour calculer tous les états résultant de l'2 bombe gouttes, etc jusqu'à ce que vous obtenez tous les zéros. Mais à chaque étape, vous permettrait de mettre en cache les états à l'aide de la clé que j'ai défini ci-dessus, de sorte que vous pouvez utiliser ces résultats dans le calcul de l'étape suivante (une "programmation dynamique" de l'approche).
Mais en fonction de la taille de n, m, et les numéros dans la grille, les besoins en mémoire de cette approche pourrait être excessive. Vous pouvez jeter tous les résultats à la N de la bombe gouttes une fois que vous avez calculé à tous les résultats pour N + 1, donc il y a quelques économies. Et bien sûr, vous pourriez ne cache rien au coût de la faire prendre beaucoup plus -- la programmation dynamique approche des métiers de la mémoire pour la vitesse.
Si vous voulez l'absolu solution optimale pour nettoyer le conseil d'administration, vous devrez utiliser le classique retour en arrière, mais si la matrice est très grand, il va prendre des heures pour trouver la meilleure solution, si vous voulez un "possible" solution optimale, vous pouvez utiliser l'algorithme glouton, si vous avez besoin d'aide pour l'écriture de l'algorithme, je peux vous aider à
Venez pour penser à elle, c'est la meilleure façon. Faire une autre matrice de stocker les points que vous retirez par la chute d'une bombe, puis il a choisi la cellule avec le maximum de points et de chute de la bombe il y a de mise à jour de la matrice de points et continuer. Exemple:
valeur de la cellule +1 pour chaque cellule adjacente avec une valeur supérieure à 0
Force Brute !
Je sais que c'est pas efficace, mais même si vous trouvez un algorithme plus rapide, vous pouvez toujours tester à l'encontre de ce résultat pour savoir comment elle est exacte.
Utiliser certains de récursivité, comme ceci:
Vous pouvez le rendre plus efficace par la mise en cache, si elle est différente façon conduire à un même résultat, vous ne devriez pas répéter les mêmes étapes.
D'élaborer:
si bombardement de cellules 1,3,5 conduit au même résultat que le bombardement de cellules 5,3,1 , ensuite, vous ne devriez pas refaire toutes les prochaines étapes à nouveau dans les deux cas, 1 seul suffit, vous devez les stocker quelque part tous les états et à l'utilisation de ses résultats.
Un hachage de table stats peut être utilisé pour faire une comparaison rapide.
Edit: n'a pas remarqué que Kostek, près de la même approche, alors maintenant je fais plus forte demande:
Si les coins de claire sont choisis pour être toujours sur la couche externe, alors il est optimal.
Dans OP exemple: déposer 2 (1+1 ou 2) sur autre chose que sur 5 n'a pas conduit à frapper un carré que l'abandon de sur 5 aurait frappé. Donc, nous devons tout simplement goutte 2 à 5 (et 6 en bas à gauche 1 ...)
Après cela, il y a une seule façon de clair (en haut à gauche) coin ce qui était initialement en 1 (actuellement 0), et qui consiste à déposer 0 sur B3 (excel comme la notation).
Et ainsi de suite.
Seulement après compensation de l'ensemble A et E et colonnes 1 et 7 lignes, commencer à nettoyer une couche plus profonde.
Envisager effacé seulement ceux intentionaly effacé, la compensation d'une valeur de 0 coins ne coûte rien et simplifie la pensée à ce sujet.
Parce que toutes les bombes de cette façon doit être supprimé et cela conduit à des prairies artificielles, il est la solution optimale.
Après une bonne nuit de sommeil, j'ai réalisé que ce n'est pas vrai.
Envisager
Mon approche serait de larguer des bombes sur B3 et C2, lors de la suppression de B2 serait assez
Voici ma solution.. je ne vais pas l'écrire dans le code mais comme je n'ai pas le temps, mais je crois que cela doit produire un nombre optimal de coups chaque fois, bien que je ne suis pas sûr de savoir comment efficace, il serait à trouver les points à la bombe.
Tout d'abord, comme @Luka Rahne a déclaré dans un des commentaires, l'ordre dans lequel vous bombe n'est pas important, seule la combinaison.
Deuxièmement, comme beaucoup d'autres l'ont dit, le bombardement 1-désactiver la diagonale du coin est optimale, car elle touche plus de points que les coins.
Cela génère la base de ma version de l'algorithme:
Nous pouvons bombe le "1 dans les coins" en premier ou en dernier, il n'a pas d'importance (en théorie)
Nous la bombe à ceux de la première, car elle rend les décisions ultérieures plus facile (dans la pratique)
Nous bombarder le point qui touche le plus de points, tandis que, simultanément, les bombardements les coins.
Nous allons définir les Points De Résistance à être les points de la carte avec le la plupart des non-bombable points + plus grand nombre de 0 autour d'eux
non-bombable points peuvent être définis comme des points qui n'existent pas dans notre portée de la carte, nous sommes à la recherche à.
Je vais également définir des 4 bornes qui va gérer notre portée:
Top=0, Left=0, Bas=k,droite=j.
(valeurs de départ)
Enfin, je vais définir optimale des bombes comme des bombes qui sont tombées sur des points qui sont adjacentes à des points de résistance et sont en contact (1) les plus valorisées point de résistance et (2) le plus grand nombre de points possible.
Concernant le approche il est évident que nous travaillons à partir de l'extérieur. Nous allons être en mesure de travailler avec 4 'bombardiers' en même temps.
Les premiers points de résistance sont évidemment nos coins. Le "hors limite" points ne sont pas bombable (il y a 5 points en dehors de la portée de chaque coin). Afin de nous bombarder les points en diagonale l'un des coins de la première.
Algorithme:
si(somme(lié)==0) avance lié
répétez jusqu'à ce que le HAUT=BAS et de GAUCHE=DROITE
Je vais essayer d'écrire le code plus tard
Vous pouvez utiliser l'état de la planification de l'espace.
Par exemple, à l'aide d'Un* (ou une de ses variantes) couplé à une heuristique
f = g + h
comme ceci:J'ai 28 se déplace aussi bien. J'ai utilisé deux tests pour le meilleur mouvement suivant: d'abord le déplacement de produire le minimum de la somme pour le conseil d'administration. Deuxièmement, pour l'égalité des sommes, le déménagement, la production de la densité maximale, définie comme:
C'est Haskell. "résoudre conseil" montre le moteur de la solution. Vous pouvez jouer le jeu en tapant "principale", puis entrez un point cible, "le meilleur" pour une recommandation, ou "quit" pour quitter.
De SORTIE:
*Principal> résoudre conseil
[(4,4),(3,6),(3,3),(2,2),(2,2),(4,6),(4,6),(2,6),(3,2),(4,2),(2,6),(3,3),(4,3),(2,6),(4,2),(4,6),(4,6),(3,6),(2,6),(2,6),(2,4),(2,4),(2,6),(3,6),(4,2),(4,2),(4,2),(4,2)]
Il semble y avoir un nonbipartite correspondance de sous-structure ici. Considérons l'exemple suivant: la
La solution optimale pour ce cas a une taille 5, puisque c'est la taille d'une couverture minimale des sommets d'un 9-cycle par ses bords.
Ce cas, en particulier, montre que la programmation linéaire relax quelques personnes ont posté n'est pas exacte, ne fonctionne pas, et tous ceux d'autres mauvaises choses. Je suis sûr que je peux réduire la couverture de "les sommets de mon planar cubes graphique de quelques bords que possible" à votre problème, ce qui me fait douter si les avides/hill-climbing solutions sont travail.
Je ne vois pas une façon de résoudre ce problème en temps polynomial dans le pire des cas. Il y a peut être un très habile binaire-recherche-et-DP solution que je ne suis pas voyant.
MODIFIER: je vois que le concours (http://deadline24.pl) est indépendant de la langue; ils vous envoient un tas de fichiers d'entrée et de vous les envoyer sorties. Si vous n'avez pas besoin de quelque chose qui s'exécute dans le pire des cas en temps polynomial. En particulier, vous arrivez à look à l'entrée!
Il y a un tas de petites affaires dans l'entrée. Ensuite, il y a un 10x1000 cas, un 100x100 cas, et une 1000x1000 cas. Les trois cas sont tous très bien comportés. Adjacents horizontalement entrées ont généralement la même valeur. Sur une relativement costaud machine, je suis en mesure de résoudre tous les cas par brute-forcer l'aide de CPLEX dans juste un couple de minutes. J'ai eu de la chance sur les 1000x1000; le LP de relaxation arrive à avoir une partie intégrante de la solution optimale. Mes solutions sont d'accord avec la
.ans
fichiers fournis dans l'ensemble de données de test.Je parie que vous pouvez utiliser la structure de l'entrée dans une manière beaucoup plus directe que j'ai fait, si vous avez pris un coup d'oeil; vous pouvez juste tape sur la première ligne, ou deux, ou trois à plusieurs reprises jusqu'à ce que vous n'avez rien à gauche. (On dirait que, dans le 1000x1000, toutes les lignes sont nonincreasing? Je suppose que c'est là que votre "partie B" vient-il? )
Je ne peux pas penser à un moyen de calculer le nombre réel sans le calcul de la campagne de bombardement à l'aide de ma meilleure heuristique et j'espère obtenir un résultat raisonnable.
Donc ma méthode consiste à calculer un bombardement de mesure du rendement pour chaque cellule, la bombe de la cellule avec la valeur la plus élevée, .... itère le processus jusqu'à ce que j'ai aplati tout. Certains ont préconisé l'aide de simples dommages potentiels (c'est à dire le score de 0 à 9), comme une métrique, mais qui tombe court en battant la valeur élevée des cellules et ne faisant pas usage de dommages se chevauchent. J'avais calculer
cell value - sum of all neighbouring cells
, réinitialiser aucun résultat positif à 0 et l'utilisation de la valeur absolue de quelque chose de négatif. Intuitivement, cette mesure devrait faire un choix, de maximiser les dégâts de chevauchement sur les cellules avec un nombre élevé à la place de pilonner les personnes directement.Le code ci-dessous atteint destruction totale de la zone de test dans 28 des bombes (notez que l'utilisation de potentiel de dégâts que métrique rendements 31!).
L'résultant des bombardements modèle est sortie comme suit (les valeurs de champ sur la gauche, métrique sur la droite)
Cela peut être résolu à l'aide d'un arbre de profondeur O(3^(n)). Où n est la somme de toutes les cases.
D'abord considérer qu'il est trivial à résoudre le problème avec un arbre de O(9^n), il suffit de considérer toutes les bombardements endroits. Pour un exemple, voir Alfe de la mise en œuvre.
Prochaine réaliser que nous pouvons travailler à la bombe de bas en haut et de toujours obtenir un minimum de bombardement modèle.
Cet algorithme est correct parce que
Dans la pratique, cet algorithme va régulièrement faire mieux que son maximum théorique, car il va régulièrement à la bombe hors voisins et de réduire la taille de la recherche. Si nous supposons que chaque bombardement diminue la valeur de 4 cibles supplémentaires, alors notre algorithme va s'exécuter en O(3^(n/4)), soit environ O(1.3^n).
Parce que cet algorithme est toujours exponentielle, il serait sage de limiter la profondeur de la recherche. On pourrait limiter le nombre de branches a permis à un nombre, X, et une fois que nous sommes cette profonde nous la force de l'algorithme pour choisir le meilleur chemin à il a identifié jusqu'à présent (celui qui a le total minimum du conseil de somme dans l'un de ses terminal des feuilles). Ensuite notre algorithme s'exécute en temps O(3^X) de temps, mais il n'est pas garanti d'obtenir la bonne réponse. Cependant, on peut toujours augmenter de X et de tester empiriquement si le compromis entre l'accroissement de calcul et de meilleures réponses en vaut la peine.
fonction d'évaluation, le total de la somme:
de la fonction objectif:
détruire fonction:
objectif de la fonction:
linéaire de la maximisation de la fonction:
Ce n'est pas optimal, mais peut être optimisé grâce à la recherche d'une meilleure évaluation de la fonction ..
.. mais la réflexion sur ce problème, je pensais que l'un des principaux problèmes est d'obtenir des abandonnés les chiffres dans le milieu de zéros à un certain point, alors j'aimerais prendre une autre approche .. ce qui est de dominer valeurs minimales en zéro, puis essayer de s'échapper de zéros que possible, ce qui conduit en général à une minimisation de peu de valeur existante(s) ou
Tous ce problème se résume à est le calcul d'une distance d'édition. Il suffit de calculer une variante de la distance de Levenshtein entre la matrice et le zéro de la matrice, où les modifications sont remplacés par des attentats à la bombe, à l'aide de la programmation dynamique pour stocker les distances entre les tableaux intermédiaires. Je suggère d'utiliser une table de hachage de la matrice, comme une clé. En pseudo-Python:
C'était une réponse à la première question posée. Je n'avais pas remarqué qu'il a changé les paramètres.
Créer une liste de toutes les cibles. Affecter une valeur à la cible sur la base du nombre de valeurs positives impactée par une baisse (lui-même, et tous les voisins). Valeur la plus élevée serait un neuf.
Trier les cibles par le nombre de cibles touchées (Décroissant), avec un second tri décroissant sur la somme de chaque touché la cible.
Larguer une bombe sur la première cible, puis re-calculer les cibles et répétez jusqu'à ce que toutes les valeurs sont égales à zéro.
D'accord, ce n'est pas toujours la plus optimale. Par exemple,
Cette approche permettrait de prendre 5 bombes pour effacer. De manière optimale, même si, vous pouvez le faire en 4. Encore, assez
très proche et il n'y a pas de retour en arrière. Pour la plupart des situations, il sera optimale, ou très proche.
À l'aide de l'origine du problème des chiffres, cette approche permet de résoudre 28 bombes.
L'ajout de code pour illustrer cette approche (à l'aide d'un formulaire avec un bouton):
Classe, vous aurez besoin de:
09090
Cette approche nécessite de 18 bombes. Il peut être fait en 9.1010101
,0010100
?2010102
,0010100
Cela peut être fait en 4 bombes. Mais si je suis la compréhension de votre algorithme correctement, il bombe le milieu de la première qui, essentiellement, est gaspillée.La plus lente, mais plus simple et sans erreur de l'algorithme est de générer et de tester toutes les possibilités. pour ce cas est très simple (parce que le résultat est indépendant de l'ordre de la bombe de placement).
code peut ressembler à ceci:
cela peut être optimisé dans beaucoup de façons,... le plus simple est de rétablir la solution avec M la matrice, mais vous avez besoin de changer la valeur max et aussi le TP[][] décrémenter code
Plusieurs réponses jusqu'à présent temps exponentiel, certaines concernent la programmation dynamique. Je doute que si elles sont nécessaires.
Ma solution est O(mn) où m, n sont des dimensions de la planche, S est la somme de tous les nombres entiers. L'idée est plutôt bruteforce: trouver l'emplacement qui peuvent tuer les plus à chaque fois et de mettre fin à 0.
Il donne 28 se déplace pour le conseil donné, et imprime également le conseil d'administration après chaque chute.
Complète, auto-explicatif code: