[PYTHON] Lösen von "Würfeln in Würfeln" mit Kombinationsoptimierung

Würfel in Würfel

Lösen wir die Puzzlesammlung Nr. 12 "Würfel im Würfel".

Die folgenden 54 Holzteile sind dicht in einem kubischen Raum von 6 x 6 x 6 verpackt. image

Löse mit Python

Kandidatenliste

Insgesamt gibt es 6 * 4 * 5 * 12 = 1440 Kandidaten.

python3


import numpy as np
from itertools import cycle, product
from more_itertools import take
def rotx(a):
    n, b = a.shape[0], np.zeros(a.shape)
    for i,j,k in product(range(n),range(n),range(n)):
        b[i,j,k] = a[i,n-1-k,j]
    return b
def roty(a):
    n, b = a.shape[0], np.zeros(a.shape)
    for i,j,k in product(range(n),range(n),range(n)):
        b[i,j,k] = a[n-1-k,j,i]
    return b
def rotz(a):
    n, b = a.shape[0], np.zeros(a.shape)
    for i,j,k in product(range(n),range(n),range(n)):
        b[i,j,k] = a[n-1-j,i,k]
    return b
def cands():
    cc = []
    for i,j,k in product(range(6),range(4),range(5)):
        a = np.zeros((6,6,6))
        a[i,j,k]=a[i,j+1,k]=a[i,j+1,k+1]=a[i,j+2,k]=1
        for f in take(12, cycle([rotx, roty, rotz])):
            cc.append(a.flatten())
            a = f(a)
    return np.array(cc, dtype=int)

Formulieren und lösen Sie in Teilungsproblem festlegen.

python3


from pulp import *
from ortoolpy import addbinvars
cc = cands() #Alle Kandidaten
m = LpProblem() #Mathematisches Modell
v = addbinvars(len(cc)) #Welchen Kandidaten soll ich wählen?
for i,c in enumerate(cc.T):
    m += lpDot(c.tolist(), v) == 1
m.solve()

Anzeige der Lösung

python3


%matplotlib inline
import matplotlib.pyplot as plt
from matplotlib.colors import hex2color, CSS4_COLORS
plt.rcParams['figure.figsize'] = 12, 8
cols = list(CSS4_COLORS.values())
def show(v, n=6):
    r = np.zeros((6,6,6), dtype=int)
    j = 0
    for i, x in enumerate(v):
        if value(x):
            j += 1
            r += cc[i].reshape((6,6,6))*j
    for k in range(n):
        plt.subplot((n+2)//3,3,k+1)
        plt.imshow([[hex2color(cols[i]) for i in j] for j in r[k]])
show(v)

image

Eine andere Lösung

Wenn ich es nachgeschlagen habe, scheint es, dass ich es in zwei Schritten tun kann. Machen wir das.

python3


m = LpProblem()
v = addbinvars(len(cc))
for i,c in enumerate(cc.T):
    m += lpDot(c.tolist(), v) == (1 if i < 72 else 0)
m.solve()
show(v, 2)

image

das ist alles

Recommended Posts

Lösen von "Würfeln in Würfeln" mit Kombinationsoptimierung
Gruppierung nach Kombinationsoptimierung
○○ Probleme im Fachbereich Mathematik mit Optimierung lösen
Lösen Sie ein 4-Farben-Problem mit Kombinationsoptimierung
Bestimmen Sie das aufgezeichnete Programm durch Kombinationsoptimierung
Spieltheorie mit Kombinationsoptimierung lösen
Kombinationsoptimierungstechniken in Rätseln
Teilen Sie sich durch Kombinationsoptimierung in Teams auf
Über Menüs durch Kombinationsoptimierung nachdenken
Lösen von Planungsproblemen für Krankenschwestern mit Kombinationsoptimierung
Siegermethode für Pferderennen durch Kombinationsoptimierung
Python in der Optimierung
Verwenden Sie die Kombinationsoptimierung
Lassen Sie uns den Datumsverlauf durch Kombinationsoptimierung festlegen
Lösen von Problemen bei der Organisation von Schulbezirken durch Kombinationsoptimierung
Lösen des N Queen-Problems mit kontinuierlicher / kombinierter Optimierung
Lösen des N Queen-Problems mit Kombinationsoptimierung
Minimieren Sie die Anzahl der Polierungen, indem Sie die Kombination optimieren
Beurteilung des Endes von Mahjong durch Kombinationsoptimierung
Durch Kombinationsoptimierung in Teams aufteilen (durchschnittliche Abweichung minimieren)
Durch Kombinationsoptimierung (Backmethode) in Teams aufteilen
Lassen Sie uns die Vorlesung der PyCon JP 2016 durch Kombinationsoptimierung entscheiden
Lassen Sie uns die Position der Feuerwehr durch Kombinationsoptimierung bestimmen
Leistungsoptimierung in Django 3.xx.
Preisunterschiede nach Präfektur (2019)
Sternumfrage mit Kombinationsoptimierung
Gruppieren von Spielen mit Kombinationsoptimierung
Kombinationsoptimierung mit Quantenglühen
Lösen Sie Optimierungsprobleme mit Python
Generieren Sie 8 * 8 (64) Cubes mit Blender Python
Sortieren nach Datum in Python
Lösen von Rucksackproblemen mit den OP-Tools von Google - Üben der Grundlagen von Kombinationsoptimierungsproblemen