mikhail_dvorkin icon

Python multiple libraries showcase

mikhail_dvorkin | PRO | 03/26/21 02:09:09 PM UTC | 0 ⭐ | 1256 👁️ | Never ⏰ | []
Python |

1.62 KB

|

None

|

0 👍

/

0 👎

from PIL import Image, ImageDraw
import imageio
import math
import scipy.optimize
import matplotlib.pyplot as plt
 
n = 8
image_size = 400
gif_writer = imageio.get_writer('b.gif', mode='I')
 
def draw_board(y, obstacle=None):
    image = Image.new('RGB', (image_size, image_size), color=(255, 255, 200))
    draw = ImageDraw.Draw(image)
    # 0..7  — удобные координаты → пиксельные
    cell_size = image_size / n
    if obstacle:
        x_obstacle, y_obstacle, r_obstacle = obstacle
        xc_pixel = (x_obstacle + 0.5) * cell_size
        yc_pixel = (y_obstacle + 0.5) * cell_size
        r_pixel = r_obstacle * cell_size
        draw.ellipse((xc_pixel - r_pixel, yc_pixel - r_pixel, xc_pixel + r_pixel, yc_pixel + r_pixel), fill=(255, 0, 0))
    for i in range(n):  # 0 .. n-1
        xc_pixel = (i + 0.5) * cell_size
        yc_pixel = (y[i] + 0.5) * cell_size
        r_pixel = 0.3 * cell_size
        draw.ellipse((xc_pixel - r_pixel, yc_pixel - r_pixel, xc_pixel + r_pixel, yc_pixel + r_pixel), fill=(0, 0, 240))
    image.save('a.png')
    gif_writer.append_data(imageio.imread('a.png'))
 
 
def solve(obstacle):
    def is_forbidden(x, y):
        return math.hypot(x - obstacle[0], y - obstacle[1]) < obstacle[2]
    penalty_matrix = [[is_forbidden(x, y) for y in range(n)] for x in range(n)]
    assignment = list(scipy.optimize.linear_sum_assignment(penalty_matrix)[1])
    draw_board(assignment, obstacle)
    return sum([is_forbidden(x, assignment[x]) for x in range(n)])
 
 
scores = []
for frame in range(50):
    score = solve((2 + frame * 0.1, 1 + frame * 0.05, 2 + frame * 0.05))
    scores.append(score)
 
plt.plot(scores)
plt.title('Lost rooks')
plt.savefig('scores.svg')
 

Comments