--Il a fallu beaucoup de temps pour chercher comment placer Domino lorsque N = 7 et Qualité = 3. -Lors de l'implémentation de la recherche de $ 2 ^ {49} \ Fallingdotseq 10 ^ {15} $, vous devez bien élaguer les branches --Python est plus de 20 fois plus lent que C ++ dans certaines conditions
Placez Domino de (0,0) et essayez-le. L'ordre d'essayer
Il a fallu ** environ 740 [s] ** pour trouver un emplacement approprié.
findPattern.py
import sys
import numpy as np
import datetime
sys.setrecursionlimit(10 ** 7)
def cntQuality(N, grids, num, axis):
    q = 0
    if axis == 0:
        g = grids[num, :]
    else:
        g = grids[:, num]
    last = -1
    for i in range(N):
        d = g[i]
        if last == d or d == 0:
            continue
        q += 1
        last = d
    return q
def dfs(N, grids, pos, num, q):
    x = pos // N
    y = pos % N
    if y == 0 and x != 0:
        qx = cntQuality(N, grids, x-1, 0)
        if qx != q:
            return False
    # end grids
    if x == N and y == 0:
        # valid
        for i in range(N):
            qy = cntQuality(N, grids, i, 1)
            if qy != q:
                return False
        return grids
    # not yet
    pos += 1
    # put vertical
    if y < N-1 and grids[x][y] == 0 and grids[x][y+1] == 0:
        v_num = num + 1
        # v_grids = copy.copy(grids)
        grids[x][y] = v_num
        grids[x][y+1] = v_num
        g = dfs(N, grids, pos, v_num, q)
        if g is not False:
            return g
        grids[x][y] = 0
        grids[x][y+1] = 0
    # put horizontal
    if x < N-1 and grids[x][y] == 0 and grids[x+1][y] == 0:
        h_num = num + 1
        # h_grids = copy.copy(grids)
        grids[x][y] = h_num
        grids[x+1][y] = h_num
        g = dfs(N, grids, pos, h_num, q)
        if g is not False:
            return g
        grids[x][y] = 0
        grids[x+1][y] = 0
    # dont put domino
    g = dfs(N, grids, pos, num, q)
    if g is not False:
        return g
    return False
start = datetime.datetime.now()
print("start", start)
N = 7
q = 3
grids = np.zeros((N, N))
g = dfs(N, grids, 0, 0, q)
end = datetime.datetime.now()
print("end", end)
print(g)
Résultat d'exécution.txt
start 2020-01-07 18:13:18.477510
end 2020-01-07 18:22:35.768316
[[  1.   1.   2.   2.   3.   3.   0.]
 [  4.   4.   5.   5.   6.   0.   0.]
 [  7.   7.   0.   0.   6.   8.   8.]
 [  0.   0.   9.  10.   0.   0.  11.]
 [  0.   0.   9.  10.   0.   0.  11.]
 [  0.   0.   0.   0.  12.  13.  14.]
 [  0.   0.   0.   0.  12.  13.  14.]]
Il semble que l'ordre de recherche était mauvais.
Lors de la recherche avec, l'arrangement a été trouvé dans un délai de 1 [s]. Peut-être que dans cet ordre de recherche, il y a des branches correspondantes à proximité.
| Ordre de recherche | Python | C++ | 
|---|---|---|
| côté->Verticale->Aucun | 100[ms] | 5[ms] | 
| Verticale->côté->Aucun | 740[s] | 17[s] | 
| Aucun->côté->Verticale | 430[ms] | 10[ms] | 
――Si vous ne pouvez pas bien tailler, il y aura un décalage horaire considérable en fonction de l'ordre de recherche. ――Il semble préférable d'utiliser C ++ que Python pour cette commande.
Recommended Posts