Kombinationsoptimierung macht es einfach, auch nur wenige Deutsche zu lösen.
"Sugoku" ist eine eingetragene Marke von Nikori Quelle Nikori http://www.nikoli.co.jp/ja/
$ \ mbox {Variablen} $ td> | $ x_ {ijk} \ in \ {0, 1 \} ~ \ für alle i, j, k $ td> | Ist die Masse i, j die Zahl k + 1? (1) td> tr> |
$ \ mbox {vorbehaltlich} $ td> | $ \ sum_k {x_ {ijk}} = 1 ~ \ forall i, j $ td> | Eine Zahl (2) td> tr> |
td> | $ \ sum_k {x_ {ikj}} = 1 ~ \ forall i, j $ td> | Keine vertikale gleiche Zahl (3) td > tr> |
td> | $ \ sum_k {x_ {kij}} = 1 ~ \ forall i, j $ td> | Daneben steht nicht dieselbe Nummer (4) td > tr> |
td> | $ 3 \ times Gleiches gilt für 3 $ Zellen (5) td> tr> | |
td> | Geben Sie die Nummer (6) td> tr> an |
[Zellstoff](http://qiita.com/Tsutomu-KKE@github/items/bfbf4c185ed7004b5721#%E3%82%BD%E3%83%95%E3%83%88%E3%81%AE%E3%82 Verwenden Sie% A4% E3% 83% B3% E3% 82% B9% E3% 83% 88% E3% 83% BC% E3% 83% AB) und Pandas.
Das Problem ist, dass es in einer Zeichenfolge ist.
python
prob = """\
..6.....1
.7..6..5.
8..1.32..
..5.4.8..
.4.7.2.9.
..8.1.7..
..12.5..3
.6..7..8.
2.....4..
"""
Formulieren und lösen wir es.
python
import pandas as pd, numpy as np
from more_itertools import grouper
from pulp import *
r = range(9)
m = LpProblem() #Mathematisches Modell
a = pd.DataFrame([(i, j, k, LpVariable('x%d%d%d'%(i,j,k), cat=LpBinary))
for i in r for j in r for k in r],
columns=['Vertikal', 'Seite', 'Nummer', 'x']) # (Formulierung 1)
for i in r:
for j in r:
m += lpSum(a[(a.Vertikal== i) & (a.Seite== j)].x) == 1 # (Formulierung 2)
m += lpSum(a[(a.Vertikal== i) & (a.Nummer== j)].x) == 1 # (Formulierung 3)
m += lpSum(a[(a.Seite== i) & (a.Nummer== j)].x) == 1 # (Formulierung 4)
for i in range(0, 9, 3):
for j in range(0, 9, 3):
for k in r:
m += lpSum(a[(a.Vertikal>= i) & (a.Vertikal< i+3) & # (Formulierung 5)
(a.Seite>= j) & (a.Seite< j+3) & (a.Nummer== k)].x) == 1
for i, s in enumerate(prob.split('\n')):
for j, c in enumerate(s):
if c.isdigit():
k = int(c)-1 # (Formulierung 6)
m += lpSum(a[(a.Vertikal== i) & (a.Seite== j) & (a.Nummer== k)].x) == 1
m.solve() #Mit Löser lösen
f = a.x.apply(lambda v: value(v) == 1) #Ausgewählte Nummer
print(np.array(list(grouper(9, a.Nummer[f] + 1))))
>>>
[[5 3 6 8 2 7 9 4 1]
[1 7 2 9 6 4 3 5 8]
[8 9 4 1 5 3 2 6 7]
[7 1 5 3 4 9 8 2 6]
[6 4 3 7 8 2 1 9 5]
[9 2 8 5 1 6 7 3 4]
[4 8 1 2 9 5 6 7 3]
[3 6 9 4 7 1 5 8 2]
[2 5 7 6 3 8 4 1 9]]
Docker Andere Rätsel finden Sie auch unter tsutomu7 / puzzle. Gehen Sie wie folgt vor, um die Hostadresse in Ihrem Browser anzuzeigen.
docker run -d -p 80:8888 tsutomu7/puzzle
das ist alles