
HashLife на питоне
lightln2 2 минуты назад HashLife на питоне 8 мин 23 Алгоритмы * Игра «Жизнь», придуманная Джоном Конвеем в 1970 году, до сих пор не теряет популярности. В 1984 году американский математик Билл Госпер опубликовал статью...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
В сфере искусственного интеллекта произошло заметное событие. lightln2 2 минуты назад HashLife на питоне 8 мин 23 Алгоритмы * Игра «Жизнь», придуманная Джоном Конвеем в 1970 году, до сих пор не теряет популярности. В 1984 году американский математик Билл Госпер опубликовал статью с алгоритмом, позже названным HashLife, ускоряющим симуляцию в триллионы и больше раз. Описание алгоритма и его реализации довольно сложны для понимания и отладки.
Я хочу вам представить его версию, реализация которой на питоне влезает на один экран, а суть умещается в 40 строк кода. Если вам это интересно, а также то, как HashLife связан с динамическим программированием, персистентными структурами и системой контроля версий Git, добро пожаловать под кат. Игра «Жизнь» – клеточный автомат на плоскости, в котором на каждом шаге времени клетка выживает при двух или трёх соседях, мёртвая клетка рождается при трёх соседях, иначе клетка остаётся или становится мёртвой.
Технические детали
Код на Питоне, эмулирующий игруclass SimpleLife: def __init__(self, points): self. field = set(points) def _evolve(self, x, y): own = 1 if (x,y) in self. field else 0 alive = sum((x-1+i, y-1+j) in self.
field for i in range(3) for j in range(3)) - own return alive == 3 or (alive == 2 and own == 1) def step(self): newfield = set() for x,y in self. field: for i in range(3): for j in range(3): if self. _evolve(x-1+i, y-1+j): newfield.
add((x-1+i, y-1+j)) self. field = newfield Код можно ускорить в сотни и тысячи раз, и даже в миллионы раз на GPU, но скорость каждого шага пропорциональна как минимум количеству живых клеток. Алгоритм Билла Госпера позволяет эмулировать миллиарды клеток на миллиарды шагов за секунды, переиспользуя результаты вычислений для повторяющихся частей.
Отраслевые последствия
Про HashLife есть много информации в интернете, в том числе, и на Хабре, но я хочу рассказать немного отличающуюся версию, которую нигде не встречал. Основная идея – рекурсивное разбиение поля не на 4, а на 9 частей. Разбиение поля на деревоПредставим, что наше поле – квадрат размера для некоторого большого n.
Мы можем представить его в виде дерева: разобьём его на 9 квадратов размера , выложенных в решетку 3x3. Далее каждый квадрат рекурсивно разобьём на все меньшие квадраты, пока не дойдем до квадрата размера 1x1, то есть, одной клетки. Так как многие квадраты будут совпадать, мы можем их дедуплицировать: назначить одинаковым квадратам один id, и в узле дерева держать только массив 3x3 из девяти id квадратов нижнего уровня.
Зарезервируем id=0,1 для мертвых и живых клеток поля, тогда узел дерева самого нижнего уровня будет содержать кусок поля 3x3. Например: При этом можем дедуплицировать квадраты снизу вверх, от менших к большим: два узла дерева совпадают, если совпадают все девять id их дочерних узлов. Это первый из двух трюков в HashLife, позводяющий компактно хранить поля размером миллиард на миллиард клеток и больше.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.




