[PYTHON] Essayez de résoudre le problème N Queen avec SA de PyQUBO

J'ai essayé le problème N Queen pour approfondir ma compréhension de PyQUBO en utilisant les heures de fin d'année et de nouvel an.

Je pense que PyQUBO est un outil de création QUBO très pratique pour utiliser une machine de recuit. "Résolvez le problème du réglage de seulement m à 1 sur n avec une machine de recuit utilisant PyQUBO" https://qiita.com/morimorijap/items/196e7fc86ecff927bf40 Je l'utilise également dans de tels cas, mais je vais essayer de résoudre à nouveau le problème de N Queen en utilisant PyQUBO.

Quel est le problème de N Queen? Les 8 reines de Wikipédia ont des carrés de 8 x 8 et 8 reines https://ja.wikipedia.org/wiki/Eight Queen D'autre part, la masse dit des problèmes NxN.

Puisque le mouvement de la reine se déroule dans huit directions en diagonale vers le haut, le bas, la gauche et la droite tant qu'il n'y a pas d'obstruction, il devient un problème de disposer la reine de sorte qu'il n'y ait pas de reine dans la colonne, la rangée ou en diagonale. Sous la forme d'une fonction de coût pour résoudre ce problème sur une machine de recuit,

Hamiltonien dans le problème N-Queen, colonne colonne, ligne rangée, diagonale diagonale

H = \sum_{col}\left(\sum_{i \in col} x_i - 1\right)^2 + \sum_{row}\left(\sum_{i \in row} x_i - 1\right)^2 + \sum_{diag} \left((\sum_{i \in diag} x_i ) (\sum_{i \in diag} x_i - 1 )\right)

Ce sera.

L'expression de la fonction de coût diagonal est différente, mais il s'agit d'un article de T-Wave de l'Université de Tohoku "Résolution du problème N-Queen avec une machine D-Wave" https://qard.is.tohoku.ac.jp/T- Vague /? P = 884 Sera également utile.

Dans le cas du 4x4

Screen Shot 2020-01-03 at 17.09.22.png

Considérant l'expression d'une masse comme, PyQUBO exprime un Array comme Binary (q [0]) au format QUBO de 0,1.

from pyqubo import Array, Placeholder, solve_qubo, Sum
from pprint import pprint
import numpy as np

Tout d'abord, importez ce dont vous avez besoin, comme PyQUBO. Supposons que vous vouliez créer un carré 4x4.

# N-Nombre de carrés de la reine
N = 4

#Créez des variables 0 et 1 avec pyQUBO pour les carrés NxN
q = Array.create('q', (N*N), 'BINARY')

q_shape = np.reshape(q,(N,N))
print(q_shape)

Puis

[[Binary(q[0]) Binary(q[1]) Binary(q[2]) Binary(q[3])] [Binary(q[4]) Binary(q[5]) Binary(q[6]) Binary(q[7])] [Binary(q[8]) Binary(q[9]) Binary(q[10]) Binary(q[11])] [Binary(q[12]) Binary(q[13]) Binary(q[14]) Binary(q[15])]]

De cette façon, vous pouvez créer un binaire PyQUBO sous la forme d'un tableau 4x4. La partie de ligne est la suivante dans la formule, donc

\sum_{row}\left(\sum_{i \in row} x_i - 1\right)^2

En exprimant cela dans PyQUBO, vous pouvez découper chaque ligne, les ajouter telles quelles, les mettre au carré et enfin les additionner.

#ligne
row_const = 0.0
for row in range(N):
    row_const += (sum(i for i in q_shape[row, :]) -1)**2

En outre, les colonnes peuvent être exprimées comme suit.

\sum_{col}\left(\sum_{i \in col} x_i - 1\right)^2
#Colonne
col_const = 0.0
for col in range(N):
    col_const += (sum(i for i in q_shape[:, col]) -1)**2

Ce sera.

Et l'expression diagonale du problème,

\sum_{diag} \left((\sum_{i \in diag} x_i ) (\sum_{i \in diag} x_i - 1 )\right)

Sera représenté par PyQUBO, mais il peut être divisé en deux parties, "" et "/", en utilisant la conversion de Numpy. (Si vous connaissez un meilleur moyen, faites-le moi savoir)

#Diagonale
#\Qui
diag_const = 0.0
xi = 0.0
xi_1 = 0.0
for k in range(-N+1,N):
    xi += (sum(i for i in np.diag(q_shape,k=k)))
    xi_1 += (sum(i for i in np.diag(q_shape,k=k))) -1 
    diag_const += xi * xi_1

Quand

#Diagonale
# /Remplacer pour ceux qui,\ faire.
diag_const_f = 0.0
xi = 0.0
xi_1 = 0.0
for k in range(-N+1,N):
    xi += (sum(i for i in np.diag(np.fliplr(q_shape),k=k)))
    xi_1 += (sum(i for i in np.diag(np.fliplr(q_shape),k=k))) -1 
    diag_const_f += xi * xi_1

Ce sera.

En ajoutant tout cela, nous pouvons exprimer l'hamiltonien de la fonction énergétique. Utilisez également l'espace réservé de PyQUBO pour ajuster les paramètres et ajouter alpha, bêta et gamma.

#énergie(Hamiltonien)Construire

alpha = Placeholder("alpha")
beta = Placeholder("beta")
gamma = Placeholder("gamma")

#Paramètres
feed_dict = {'alpha': 1.0, 'beta': 1.0, 'gamma': 1.0}

H = alpha * col_const + beta * row_const  + gamma *(diag_const + diag_const_f)

Ensuite, convertissez en QUBO.

#Compiler QUBO
model = H.compile()
qubo, offset = model.to_qubo(feed_dict=feed_dict)

pprint(qubo)

Rien qu'en lui-même, cela fera QUBO.

{('q[0]', 'q[0]'): -11.0, ('q[0]', 'q[10]'): 6.0, ('q[0]', 'q[11]'): 4.0, ('q[0]', 'q[12]'): 2.0, ('q[0]', 'q[13]'): 6.0, ('q[0]', 'q[14]'): 6.0, ('q[0]', 'q[15]'): 6.0, ('q[0]', 'q[1]'): 6.0, ('q[0]', 'q[2]'): 4.0,

・ ・ ・ Parce qu'il est long, il est omis sur le chemin ...

('q[8]', 'q[8]'): -19.0, ('q[8]', 'q[9]'): 14.0, ('q[9]', 'q[9]'): -21.0}

est. Cela peut être calculé tel quel avec SA de PyQUBO.

#Calculé avec SA de PyQUBO
solution = solve_qubo(qubo)

#Décodage du résultat du calcul avec SA de pyQUBO
decoded_solution, broken, energy = model.decode_solution(solution, vartype="BINARY", 
feed_dict=feed_dict)

pprint(solution)

Le résultat est,

{'q[0]': 0, 'q[10]': 0, 'q[11]': 0, 'q[12]': 0, 'q[13]': 0, 'q[14]': 1, 'q[15]': 0, 'q[1]': 1, 'q[2]': 0, 'q[3]': 0, 'q[4]': 0, 'q[5]': 0, 'q[6]': 0, 'q[7]': 1, 'q[8]': 1, 'q[9]': 0}

Screen Shot 2020-01-03 at 21.16.39.png

Cela devient ~~, et les conditions sont réunies pour le moment, mais comme Queen peut être incluse dans 13, j'estime qu'il est nécessaire d'ajuster les paramètres. ~~ Post-scriptum: Il semble que la solution optimale n'a pas pu être obtenue car le coin diagonal manquait. Cette fois, la solution est sortie correctement.

Supplémentaire: Expérimentez avec l'échiquier attaché au calendrier de l'avent Harry Potter de Lego 2019 (rires) IMG_6770.JPG

Pour PyQUBO, reportez-vous au document officiel. https://pyqubo.readthedocs.io/

c'est tout.

Post-scriptum: 2020/1/3 9:20pm Je l'ai édité parce que la condition diagonale était fausse.

Recommended Posts

Essayez de résoudre le problème N Queen avec SA de PyQUBO
Essayez de résoudre le problème du fizzbuzz avec Keras
Essayez de résoudre le problème d'affectation du médecin de formation avec Python
Essayez de résoudre le problème de l'héritage de classe Python
Essayez de résoudre le diagramme homme-machine avec Python
Résolution du problème N Queen avec l'optimisation des combinaisons
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (théorie)
Essayez de résoudre un problème défini de mathématiques au lycée avec Python
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (code Python)
Essayez de résoudre le livre des défis de programmation avec python3
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (résultat de l'exécution)
Essayez de résoudre les problèmes / problèmes du "programmeur matriciel" (Chapitre 1)
Essayez d'obtenir le contenu de Word avec Golang
J'ai essayé de résoudre le problème avec Python Vol.1
Le 15e temps réel hors ligne, j'ai essayé de résoudre le problème de l'écriture avec python
Essayez de résoudre les problèmes / problèmes du "programmeur matriciel" (fonction du chapitre 0)
Essayez d'automatiser le fonctionnement des périphériques réseau avec Python
Essayez d'extraire les caractéristiques des données de capteur avec CNN
J'ai essayé de résoudre le problème de F02 comment écrire en temps réel hors ligne avec Python
Je voulais résoudre le problème ABC164 A ~ D avec Python
Résolution du problème de la valeur initiale des équations différentielles ordinaires avec JModelica
Essayez de résoudre l'itinéraire le plus court avec les données sociales Python + NetworkX +
Essayez de résoudre le problème de minimisation des fonctions en utilisant l'optimisation des groupes de particules
Comment résoudre le problème d'emballage du bac
Résolvez le problème du voyageur de commerce avec OR-Tools
Utilisez Rasppie pour résoudre le problème de connexion Wi-Fi mobile insuffisante
Le 16ème comment écrire un problème de référence en temps réel hors ligne à résoudre avec Python
Essayez d'imaginer les données d'élévation du National Land Research Institute avec Python
Essayez d'utiliser n pour rétrograder la version de Node.js que vous avez installée
Essayez de ne faire réagir que le carbone en bout de chaîne avec SMARTS
Le 19ème comment écrire un problème de référence en temps réel hors ligne à résoudre avec Python
Essayez de séparer l'arrière-plan et l'objet en mouvement de la vidéo avec OpenCV
Je souhaite résoudre le problème de fuite de mémoire lors de la sortie d'un grand nombre d'images avec Matplotlib
[AtCoder] Résoudre un problème de ABC101 ~ 169 avec Python
Comment essayer l'algorithme des amis d'amis avec pyfof
Résolution du problème N Queen avec l'optimisation continue / combinée
[Chez Coder] Résoudre le problème de la dichotomie
Essayez de simuler le mouvement du système solaire
[Vérification] Essayez d'aligner le groupe de points avec la fonction d'optimisation de pytorch Partie 1
[Python] Essayez de lire la bonne réponse au problème FizzBuzz
Ajoutez des informations au bas de la figure avec Matplotlib
Essayez de créer une table d'enregistrement de bataille avec matplotlib à partir des données de "Schedule-kun"
Visualisons la pièce avec tarte aux râpes, partie 1
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé de résoudre le problème d'optimisation du placement de la machine virtuelle (version simple) avec blueqat
Essayez d'estimer le nombre de likes sur Twitter
[Neo4J] ④ Essayez de gérer la structure du graphe avec Cypher
C'est Noël, donc je vais essayer de dessiner la généalogie de Jésus-Christ avec Cabocha
Un mémo sur la façon de surmonter le problème difficile de la capture d'effets avec l'IA
Essayez d'importer dans la base de données en manipulant ShapeFile d'informations numériques sur les terres nationales avec Python
Essayez de visualiser les nutriments des flocons de maïs que le champion de M-1 Milkboy a dit avec Python
Une personne qui veut résoudre le problème D avec ABC d'AtCoder a essayé de gratter
J'ai essayé de trouver l'entropie de l'image avec python
Essayez de gratter les données COVID-19 Tokyo avec Python
Essayez d'obtenir la liste des fonctions du paquet Python> os
Essayez de jouer avec l'uprobe qui prend directement en charge Systemtap
Je voulais résoudre le concours de programmation Panasonic 2020 avec Python
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
Trouver une solution au problème N-Queen avec un algorithme génétique (2)