158 lines
4.0 KiB
Python
158 lines
4.0 KiB
Python
#!/usr/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
__author__ = "Aleksey Lobanov"
|
|
__copyright__ = "Copyright 2016, Aleksey Lobanov"
|
|
__credits__ = ["Aleksey Lobanov"]
|
|
__license__ = "MIT"
|
|
__maintainer__ = "Aleksey Lobanov"
|
|
__email__ = "i@likemath.ru"
|
|
|
|
import sys
|
|
from copy import deepcopy
|
|
|
|
import numpy as np
|
|
|
|
import keras
|
|
from keras.models import Sequential
|
|
from keras.layers import Dense
|
|
|
|
import imageio # for gifs
|
|
|
|
from PIL import Image, ImageDraw
|
|
|
|
from neurallife import nextGen
|
|
|
|
|
|
"""
|
|
# from original article
|
|
start_pos = [
|
|
[0,0,0,0,1,0,1,0,0],
|
|
[0,1,0,0,1,0,0,1,0],
|
|
[0,1,1,0,1,1,0,1,0],
|
|
[1,0,0,1,1,0,0,0,0],
|
|
[0,1,1,1,0,1,0,1,0],
|
|
[0,0,1,0,1,0,0,0,0],
|
|
[0,0,1,1,0,0,1,0,0],
|
|
[0,1,1,0,1,1,0,0,0],
|
|
[0,0,0,0,0,0,0,0,0]
|
|
]
|
|
"""
|
|
|
|
# about 27 original positions
|
|
start_pos = [
|
|
[0, 0, 0, 0, 0, 0, 0, 1, 0],
|
|
[0, 0, 0, 0, 0, 0, 1, 1, 0],
|
|
[0, 0, 1, 0, 0, 1, 1, 1, 0],
|
|
[1, 0, 1, 0, 1, 0, 0, 0, 0],
|
|
[1, 0, 1, 0, 1, 1, 0, 0, 0],
|
|
[0, 1, 0, 0, 0, 0, 0, 0, 0],
|
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
[0, 0, 0, 0, 0, 1, 0, 0, 0],
|
|
[0, 0, 0, 0, 0, 1, 1, 0, 0]
|
|
]
|
|
|
|
|
|
"""
|
|
Code for good, long start positions:
|
|
|
|
def getBest(max_cnt):
|
|
cur_max = 0
|
|
cur_best = None
|
|
for i in range(max_cnt):
|
|
cur_field = np.random.randint(2, size=(9,9)).tolist()
|
|
cur_cnt = getCnt(cur_field)
|
|
if cur_cnt > cur_max:
|
|
cur_max = getCnt(cur_field, 200)
|
|
cur_best = cur_field
|
|
return (cur_best,cur_max)
|
|
|
|
|
|
def getCnt(pos, max_cnt=100):
|
|
cnt = 0
|
|
ker_pred = pos
|
|
cur_pos = pos
|
|
while True:
|
|
cnt += 1
|
|
ker_pred = nn.predict(np.asarray(ker_pred).reshape((1,1,9,9)))
|
|
ker_pred = np.rint(ker_pred).astype("int").reshape((9,9)).tolist()
|
|
|
|
old_cur_pos = deepcopy(cur_pos)
|
|
next_gen(cur_pos, len(cur_pos))
|
|
if np.asarray(old_cur_pos).sum() == np.asarray(cur_pos).sum():
|
|
break
|
|
if ker_pred != cur_pos:
|
|
break
|
|
if cnt > max_cnt:
|
|
return 0
|
|
return cnt
|
|
"""
|
|
|
|
LINE_SIZE = 2
|
|
SQUARE_SIZE = 18
|
|
FRAME_COUNT = 30
|
|
FRAME_DELAY = 0.3 # in seconds
|
|
|
|
|
|
def loadKeras(path):
|
|
model = keras.models.model_from_json(open(path + '.json').read())
|
|
model.load_weights(path + '.h5')
|
|
model.compile(loss='MSE', optimizer='nadam', metrics=[ ])
|
|
return model
|
|
|
|
|
|
def imageFromList(l):
|
|
global LINE_SIZE, SQUARE_SIZE
|
|
height = LINE_SIZE * (len(l) + 1) + SQUARE_SIZE * len(l) # =height
|
|
width = LINE_SIZE * (len(l[0]) + 1) + SQUARE_SIZE * len(l[0])
|
|
tmp_img = Image.new('RGB', (width, height), (0, 0, 0))
|
|
pil_draw = ImageDraw.Draw(tmp_img)
|
|
for y in range(len(l)):
|
|
for x in range(len(l[0])):
|
|
if l[y][x] == 0:
|
|
pil_draw.rectangle((
|
|
x * (LINE_SIZE + SQUARE_SIZE) + LINE_SIZE,
|
|
y * (LINE_SIZE + SQUARE_SIZE) + LINE_SIZE,
|
|
(x + 1) * (LINE_SIZE + SQUARE_SIZE)-1,
|
|
(y + 1) * (LINE_SIZE + SQUARE_SIZE)-1,
|
|
), fill=(255, 255, 255))
|
|
return tmp_img
|
|
|
|
N = 9 # board size
|
|
|
|
if __name__ == '__main__':
|
|
nn = loadKeras(sys.argv[1])
|
|
nn_frames = []
|
|
real_frames = []
|
|
ker_pred = cur_pos = start_pos
|
|
|
|
for i in range(FRAME_COUNT):
|
|
#ker_pred = cur_pos
|
|
|
|
nn_frames.append(imageFromList(ker_pred))
|
|
ker_pred = nn.predict(np.asarray(ker_pred).reshape((1, N**2)))
|
|
ker_pred = np.rint(ker_pred).astype("int").reshape((N, N)).tolist()
|
|
|
|
real_frames.append(imageFromList(cur_pos))
|
|
old_pos = deepcopy(cur_pos)
|
|
nextGen(cur_pos, len(start_pos))
|
|
|
|
# because need some pause at end
|
|
#if cur_pos == old_pos:
|
|
# break
|
|
width, height = nn_frames[0].size
|
|
|
|
imageio.mimsave(
|
|
'gif_neural.gif',
|
|
[np.asarray(img.getdata()).reshape((width, height, 3)) for img in nn_frames],
|
|
fps=1/FRAME_DELAY
|
|
)
|
|
imageio.mimsave(
|
|
'gif_real.gif',
|
|
[np.asarray(img.getdata()).reshape((width, height, 3)) for img in real_frames],
|
|
fps=1/FRAME_DELAY
|
|
)
|
|
|
|
|
|
|