Résolvez les problèmes d'optimisation avec le recuit quantique aussi facilement que possible basé sur Python

Quoi?

Je ne suis pas doué pour les ordinateurs quantiques ou Yokuwakaranai, je ne suis pas sûr du modèle qui monte, je ne suis pas doué pour les formules mathématiques comme Σ, mais je peux le lire avec Python.

Le code source est plus intuitif que les formules mathématiques et peut être compris en le déplaçant, j'ai donc pensé que ce serait une bonne idée d'étudier le "recuit quantique", qui est une méthode de "l'ordinateur quantique", en Python. Je l'ai résumé comme suit.

Ordinateur quantique et recuit quantique

Le terme «ordinateur quantique» fait référence à une grande variété de mots.

L'un des soi-disant "ordinateurs quantiques" est la méthode appelée "recuit quantique".

En gros, le "recuit quantique" résout le "problème de combinaison". Il ne remplace pas les ordinateurs personnels d'aujourd'hui, mais résout simplement les problèmes de combinaison.

Cela peut ne pas sembler être un problème de combinaison, mais c'est un type de problème où vous choisissez une meilleure combinaison parmi beaucoup de choses. Il y a beaucoup de problèmes de ce type dans le monde de manière inattendue, et c'est un type de problème étonnamment courant, comme le choix des vêtements, le choix de l'itinéraire de transport optimal et le choix des bonbons pour 300 yens.

Les ordinateurs d'aujourd'hui sont assez rapides, mais il faut du temps pour résoudre de nombreuses combinaisons de problèmes. Le «recuit quantique» est une technologie qui a le potentiel de résoudre le problème de combinaison plus efficacement.

... Cela a donc été une longue préface, mais je vais commencer par le code source.

Préparation environnementale

Tout d'abord, préparez un environnement dans lequel Python peut s'exécuter. Installez les bibliothèques requises avec pip.

pip install pyqubo

Faisons un échantillon rapide et simple.

from pyqubo import Binary, solve_qubo

#Temps de pause actuel
sukima_jikan = 45

a = Binary("Anime")          #Une demi-heure
b = Binary("Vidéo drôle A")   #5 minutes
c = Binary("Vidéo drôle B")   #4 minutes
d = Binary("Vidéo drôle C")   #3 minutes
e = Binary("Drame")          #60 minutes

H = (sukima_jikan - a*30 - b*5 - c*4 - d*3 - e*60)**2

qubo, offset = H.compile().to_qubo()
solution = solve_qubo(qubo)
print(solution)

#Résultat de l'exécution:
# {'Vidéo drôle A': 1, 'Vidéo drôle B': 1, 'Vidéo drôle C': 1, 'Anime': 1, 'Drame': 0}

Dans cet exemple, disons que vous avez "** 5 vidéos comme un tableau " et que vous avez maintenant un intervalle de " 45 minutes **". Quel type de combinaison de vidéos puis-je passer à ce moment-là? C'est le problème.

variable Vidéo temps
a Anime Une demi-heure
b Vidéo drôle A 5 minutes
c Vidéo drôle B 4 minutes
d Vidéo drôle C 3 minutes
e Drame 60 minutes

Expliquons le code dans l'ordre.

Tout d'abord, préparez les variables qui représentent chaque vidéo. «Binary» est un type qui peut être «0» ou «1».

a = Binary("Anime")
b = Binary("Vidéo drôle A")
c = Binary("Vidéo drôle B")
d = Binary("Vidéo drôle C")
e = Binary("Drame")

Et puis, créez quelque chose comme une fonction dite d'évaluation.

H = (sukima_jikan - a*30 - b*5 - c*4 - d*3 - e*60)**2

Je voudrais réfléchir à la combinaison de ʻa b` `c d ʻe pour que la valeur de cette fonction d'évaluation H soit ** minimum **.

Explique la signification de l'expression «H».

Voyons un exemple réel.

Par exemple, si vous ne regardez que "l'animation de la variable a" avec "temps de dédouanement 45 minutes", la variable ʻa` devient "1" et les autres deviennent "0", donc "H = 225".

H = (sukima_jikan - a*30 - b*5 - c*4 - d*3 - e*60)**2
  ↓
H = ( 45 - 1*30 - 0*5 - 0*4 - 0*3 - 0*60 )**2
  = ( 45 - 30 - 0 - 0 - 0 - 0 )**2
  = ( 15 )**2
  = 225

Si vous regardez "Funny video of variable b" et "Funny video of variable c" dans un autre modèle, la variable "b" c "devient" 1 "et les autres deviennent" 0 ", donc" H = 1296 Cela devient ".

H = (sukima_jikan - a*30 - b*5 - c*4 - d*3 - e*60)**2
  ↓
H = ( 45 - 0*30 - 1*5 - 1*4 - 0*3 - 0*60 )**2
  = ( 45 - 0 - 5 - 4 - 0 - 0)**2
  = ( 36 )**2
  = 1296

En d'autres termes, «H = 225» de «animation de la variable a» a un «H» plus petit que «H = 1296» de «vidéo amusante de la variable b + vidéo amusante de la variable c», donc il a été hautement évalué = le temps a été tué. On peut le dire.

Donc, si vous regardez la combinaison de ʻa b` `c d ʻe et la valeur de H, cela ressemble à ceci.

a b c d e H
0 0 0 0 0 2025
1 0 0 0 0 225
0 1 0 0 0 1600
0 0 1 0 0 1681
0 0 0 1 0 1764
0 0 0 0 1 225
1 1 0 0 0 100
1 0 1 0 0 121
1 0 0 1 0 144
: : : : : :
1 1 1 1 0 9
: : : : : :
1 1 1 1 1 3249
: : : : : :

Avec ce sentiment, je voudrais sélectionner la combinaison avec le plus petit H, mais normalement je dois le résoudre un par un.

H = (sukima_jikan - a*30 - b*5 - c*4 - d*3 - e*60)**2
qubo, offset = H.compile().to_qubo()
solution = solve_qubo(qubo)
print(solution)
{'': 1, '': 1, '': 1, 'En créant une formule d'évaluation `H` (en fait appelée hamiltonien au lieu d'une formule d'évaluation), en créant un QUBO basé sur elle (` to_qubo () `), et en la résolvant (` résoudre_qubo () `) J'ai une solution. Le «recuit quantique» consiste à sélectionner la combinaison qui sera la solution à partir de cet hamiltonien (≒ formule d'évaluation) en empruntant les caractéristiques de «quantum». Donc, si vous l'exécutez et le voyez, vous obtiendrez la réponse suivante. Funny Video A Funny Video B Funny Video C Anime': 1, 'Drame': 0}

En d'autres termes, si vous avez un écart de 45 minutes,

variable Vidéo temps Visualisation
a Anime Une demi-heure à voir
b Vidéo drôle A 5 minutes à voir
c Vidéo drôle B 4 minutes à voir
d Vidéo drôle C 3 minutes à voir
e Drame 60 minutes Ne regarde pas

** 30 minutes + 5 minutes + 4 minutes + 3 minutes ** ** Total 42 minutes ** Vous obtiendrez une bonne combinaison.

Toutes nos félicitations

En résumé, il est important de pouvoir créer une formule «H» pour le problème que vous souhaitez résoudre sans les détails.

Que faire après cela

Par exemple, il est intéressant d'essayer diverses choses telles que changer le temps de pause et augmenter le nombre de vidéos. De plus, il est également recommandé d'ajouter le nombre de ★ à la vidéo afin de pouvoir regarder autant de vidéos avec ★ élevé que possible (créer une telle formule d'évaluation pour H).

Résumé

cette? Mon ordinateur personnel est-il un "ordinateur quantique"? Pourquoi ce code a-t-il fonctionné? Vous avez peut-être pensé, mais le PyQUBO que j'ai utilisé cette fois a un simulateur, donc il fonctionne sur un PC normal (merci!). Si vous pouvez utiliser une véritable machine de recuit quantique comme D-WAVE ou en quelque sorte un recuit (ou une machine de recuit rapide qui n'est pas quantique), vous pouvez également effectuer un recuit quantique réel en remplaçant la partie résoudre_qubo du code ci-dessus. ..

A l'origine, je devais expliquer correctement le modèle Zing, QUBO, Hamilton, etc., mais comme point de départ pour un programmeur / ingénieur comme moi, il est plus rapide à comprendre avec un "programme", donc je l'ai résumé basé sur Python.

Nous souhaitons la bienvenue aux tsukkomi d'experts, alors n'hésitez pas à commenter.

Recommended Posts

Résolvez les problèmes d'optimisation avec le recuit quantique aussi facilement que possible basé sur Python
Optimisation combinée avec recuit quantique
Résoudre les problèmes d'optimisation avec Python
Créer une interface graphique aussi facilement que possible avec python [édition tkinter]
Recommandation de résolution des problèmes d'AtCoder avec python (20200517-0523)
Résolvez les problèmes d'optimisation des combinaisons avec les outils OR de Google (5) Décidez d'un cours de date
Le problème que Windows python est appelé dans pipenv sur WSL
Résolvez AtCoder 167 avec python
Résoudre des maths avec Python
Faites facilement un bip avec python
Résolvez POJ 2386 avec python
Paramètres d'environnement d'apprentissage automatique basés sur Python3 sur Mac (coexistence avec Python2)
Résoudre les problèmes d'AtCoder Boot camp pour les débutants (moyen 100) avec python
Résolvez AtCoder ABC166 avec python
Facilement sans serveur avec Python en utilisant Calice
Comment résoudre les problèmes de planification linéaire avec PuLP
Essayez de créer un logiciel de capture aussi précis que possible avec python (1)
Comment écrire hors ligne en temps réel Résolution des problèmes F01 avec Python