[PYTHON] Résolution du problème N Queen avec l'optimisation des combinaisons

Quel est le problème de N Queen?

Placez N reines sur le plateau N x N. En ce moment, Aucune pièce ne doit être dans une position où elle peut être prise par une autre pièce.

Ce problème peut également être résolu avec Optimisation de combinaison.

Formulation

Fonction objectif Aucun
Variables $ x_j \ in \ {0, 1 \} ~ ~ \ forall j \ in Each cell $ S'il faut le placer dans cette cellule td>
Contraintes $ \ sum_ {j \ in Each cell ~~~~~} {\ {x_j | La verticale correspond à i colonnes \}} = 1 ~ ~ \ forall i \ in \ {0, \ cdots, N-1 \} $ Un par colonne
$ \ sum_ {j \ dans chaque cellule ~~~~~} {\ {x_j | side i line \}} = 1 ~ ~ \ forall i \ in \ {0, \ cdots, N -1 \} $ Un par ligne
$ \ sum_ {j \ in Each cell ~~~~~} {\ {x_j | Vertical + horizontal i \}} \ le 1 ~ ~ \ forall i \ in \ {0, \ cdots , 2 N-2 \} $ Une diagonale ou moins
$ \ sum_ {j \ in Each cell ~~~~~} {\ {x_j | Vertical-horizontal i-N + 1 \}} \ le 1 ~ ~ \ forall i \ in \ { 0, \ cdots, 2 N-2 \} $ Une diagonale ou moins

Essayez de résoudre avec Python

Formulons et résolvons-le.

python3


%matplotlib inline
import pandas as pd, matplotlib.pyplot as plt
from itertools import product
from ortoolpy import addvar
from pulp import *
def NQueen(N):
    r = range(N)
    m = LpProblem()
    a = pd.DataFrame([(i, j, addvar(cat=LpBinary))
        for i, j in product(r, r)], columns=['Verticale', 'côté', 'x'])
    for i in r:
        m += lpSum(a[a.Verticale== i].x) == 1
        m += lpSum(a[a.côté== i].x) == 1
    for i in range(2*N-1):
        m += lpSum(a[a.Verticale+ a.côté== i].x) <= 1
        m += lpSum(a[a.Verticale- a.côté== i-N+1].x) <= 1
    %time m.solve()
    return a.x.apply(value).reshape(N, -1)
for N in [8, 16, 32, 64, 128]:
    plt.imshow(NQueen(N), cmap='gray', interpolation='none')
    plt.show()
>>>
CPU times: user 4 ms, sys: 4 ms, total: 8 ms
Wall time: 27.5 ms

CPU times: user 16 ms, sys: 4 ms, total: 20 ms
Wall time: 84.4 ms

CPU times: user 48 ms, sys: 4 ms, total: 52 ms
Wall time: 272 ms

CPU times: user 236 ms, sys: 0 ns, total: 236 ms
Wall time: 1.88 s

CPU times: user 956 ms, sys: 20 ms, total: 976 ms
Wall time: 11.3 s

image

c'est tout

Recommended Posts

Résolution du problème N Queen avec l'optimisation des combinaisons
Résolvez le problème des 4 couleurs grâce à l'optimisation des combinaisons
Paver la route avec l'optimisation des combinaisons
Résolution de la théorie des jeux avec l'optimisation des combinaisons
Résolution des problèmes de planification des infirmières grâce à l'optimisation des combinaisons
Résolution du problème d'horaire des infirmières (optimisation des équipes) avec un algorithme génétique
Essayez de résoudre le problème N Queen avec SA de PyQUBO
Résolution des problèmes de sac à dos avec les outils OR de Google - Pratiquer les bases des problèmes d'optimisation combinée
Résolvez le problème du sac à dos Python avec l'algorithme glouton
Résolution du problème de l'iris avec scikit-learn ver1.0 (régression logistique)
Jeux de regroupement avec optimisation des combinaisons
Optimisation combinée avec recuit quantique
Maximisez les ventes des restaurants grâce à l'optimisation combinée
Allez voir les baleines avec l'optimisation des combinaisons
La puissance des solveurs d'optimisation combinée
Langage C 8 reine résolution de problèmes 3 modèles
Optimisation des combinaisons - Problème typique - Problème d'itinéraire de transport (optimisation de la livraison)
Résolvons le portefeuille avec une optimisation continue
Empilons les livres à plat avec l'optimisation des combinaisons
Résolvez le problème du voyageur de commerce avec OR-Tools
Résolution du problème du voyageur de commerce avec l'algorithme génétique (GA) et sa bibliothèque (vcopt)
Essayez de résoudre le problème du fizzbuzz avec Keras
Trouver la main de "Millijan" par l'optimisation des combinaisons
Décidons le cours de date par optimisation de combinaison
Minimisez le nombre de polissages en optimisant la combinaison
Juger la finition du mahjong par l'optimisation des combinaisons
Résolution du modèle Lorenz 96 avec Julia et Python
J'ai essayé de résoudre le problème d'optimisation du placement de la machine virtuelle (version simple) avec blueqat
Utiliser l'optimisation des combinaisons
Optimisation des combinaisons - Problème typique - Problème de placement des installations sans contrainte de capacité
Résolution du problème d'itinéraire de transport (VRP) Planification d'entiers mixtes
Essayez de résoudre le problème d'affectation du médecin de formation avec Python
○○ Résolution de problèmes dans le département de mathématiques avec optimisation
Le 14ème problème de référence d'écriture en temps réel hors ligne avec Python
J'ai essayé de résoudre le problème avec Python Vol.1