WinLifeSearch версия 0.62r - 7 Августа 2007 года

Содержание

Цель

Это - программа для поиска осцилляторов, космических кораблей и других связанных с ними объектов в игре "Жизнь" Конвея и близких к ней клеточных автоматах. Чтобы извлечь из нее какой-нибудь смысл, нужно иметь представление об игре "Жизнь". Если же Вы с ней не знакомы, начните с посещения какого-нибудь вебсайта по теме, например http://www.pobox.com/~jason1/life/.

Авторы

Оригинальная LIFESRC - Девид Белл

Изначальная Windows-версия - Джейсон Саммерс

Дальнейшее развитие - Карел Сухайда

Требования

Требует Windows 95/98/NT/хоть какой-нибудь

А еще много-много процессорного времени

Оговорка

Эта программа может быть глючной, странной, нелогичной и местами неполной. И она не очень хорошо документирована. Почти все это - вина переносчика под windows (и переводчиков, которые тоже подкрутили несколько винтиков - прим.перев.), но не создателя LIFESRC.

Содержимое окна

Рисунок ниже - не то чтобы типичное окно WLS, но на нем показаны все существующие элементы:

  1. Пустая клетка
  2. Живая клетка
  3. Мертвая клетка
  4. Безразличная клетка
  5. Замороженная клетка
  6. Клетки, у которых жирная граница, не являются одинаковыми во всех поколениях.
  7. Выделенные клетки
  8. Ось симметрии
  9. Иллюстрация движения
  10. Номер поколения

Изображенная в окне матрица представляет собой состояние блока клеток на протяжении нескольких поколений (только одно поколение за раз). Если вы захотите сделать какую-нибудь клетку живой или мертвой - ее можно заставить быть таковой, изменив ее прямо в окне. Все остальные клетки считаются неизвестными, и программа должна определить их состояние в соответствии с определениями. (В версии 0.62r эта матрица склеена в тор, то есть верхний край присоединяется к нижнему, а правый - к левому; чтобы это отключить, достаточно нарисовать ряды мертвых клеток по краям. В английских версиях матрица предполагалась фрагментом пустого поля - прим.перев.).

Живые и мертвые клетки

Это - клетки, которые в данном поколении должны быть живыми или мертвыми.

Пустые клетки

Эти клетки - не живые и не мертвые. Они будут становиться такими в процессе поиска в соответствии с правилами Жизни. Когда все пустые клетки станут либо живыми, либо мертвыми - конфигурация будет объявлена решением.

Замороженные клетки

Замороженная клетка - это такая особая пустая клетка. Она должна быть в одном и том же состоянии во всех поколениях. Это значит, что в процессе поиска программа присваивает ей живое или мертвое состояние во всех поколениях одновременно.

Безразличные клетки

Безразличные клетки - это такие пустые клетки, которые не нужно определять при поиске решения. Программа не делает их живыми или мертвыми в процессе поиска, кроме тех случаев, когда их состояние предопределяется близлежащими клетками и правилами Жизни.

Редактирование

Состояния клеток

Чтобы изменить состояние клеток, наведите на них мышку и нажмите одну из следующих кнопок:

При этом маленькие буквы меняют клетку только в отображаемом в данный момент поколении. Большие буквы (то есть когда держите Shift) устанавливают значение клеток во всех поколениях. Заметьте, что Caps Lock влияет на это поведение. Это не относится к замороженным клеткам, которые всегда устанавливаются во всех поколениях сразу.

У кнопок мыши есть и обратная функция. Например, нажатие левой кнопкой мыши на живую делает ее пустой.

Если выделен целый блок клеток, то все клетки блока меняются соответствующим образом.

Выделение

Блок клеток можно выделить, просто нажав и держа кнопку мышки и двигая мышкой по выделяемой области. Допускаются только прямоугольные выделения.

Операции над блоками клеток

Все такие операции доступны в меню "Правка". Однако использовать горячие клавиши обычно удобнее. Если выделен блок клеток, то операция применяется к нему; в противном случае - ко всему полю.

А эта операция работает только по отношению ко всему полю, игнорируя выделение.

Смена поколений

Эти клавиши меняют отображаемое поколение:

PgDn, стрелка вправо, 'n', '.' - перейти к следующему поколению

PgUp, стрелка влево, 'p', ',' - перейти к предыдущему поколению

Поколения можно также менять при помощи полосы прокрутки внизу окна.

Размер поля

Размеры поля можно изменять, выбрав в меню пункт Опции/Ширина и высота или нажав 'F2':

Изначальный размер - 35 на 15. Наибольший размер - 132 на 80.

Период

Количество поколений периода можно менять, выбрав в меню пункт Опции/Период или нажав 'F3':

Изначально поле имеет 2 поколения 'в глубину'. Максимум - 19 поколений.

Симметрия

Можно настраивать симметрию, выбрав пункт Опции/Симметрия или нажав 'F4':

Диагональная симметрия, инвариантность относительно поворота и восьмикратная симметрия допускаются только на квадратном поле.

Лучше выбирать вид симметрии до того, как начнете заполнять поле известными клетками. При редактировании поля, на котором уже задана симметрия, соответствующие друг другу клетки заполняются одинаково. Заметьте, однако, что операции над блоками клеток (сдвиги, повороты) не учитывают симметрию; возвращение поля в симметричное состояние - это задача пользователя.

Выбранная симметрия изображается на поле линиями.

Движение

Движения используются при поиске кораблей и горящих фитилей, когда конфигурация - одновременно периодическая и движущаяся. Движение можно настраивать в окне Опции/Движение, или нажав 'F5':

Повороты на 90/270 градусов и диагональные отражения бывают только на квадратном поле.

Выбранное движение изображается на рисунке стрелочками - красной и зеленой. Это нужно понимать так, что красная стрелка находится в поколении, следующим за последним, в то время как зеленая стрелка показывает, как та же красная стрелка выглядела в нулевом поколении.

Поиск

Настройка поиска

Основные настройки поиска можно найти в меню Опции/настройка поиска или под кнопкой 'F6':

Правила Жизни - можно указать правила Жизни, в которых будет осуществляться поиск. Изначально тут стоит классическая игра "Жизнь". Правила с B0 не поддерживаются.

Требовать живую клетку в столбце - если здесь не ноль, то будут приниматься только решения, у которых есть хотя бы одна живая клетка в заданном столбце в нулевом поколении.

Требовать живую клетку в строке - то же самое для строк.

Максимум клеток в поколении 0 - если здесь не ноль, то будут приниматься только решения с таким или меньшим количеством живых клеток в нулевом поколении.

Максимум клеток в каждом столбце - максимум столько живых клеток допускается в любом столбце в нулевом поколении (ноль, как всегда, означает "отключить опцию").

Максимальная ширина каждого столбца - каждому столбцу разрешается иметь не более чем такую ширину в нулевом поколении. Ширина столбца - это наибольшее из расстояний между находящимися в нем живыми клетками. Столбец, содержащий лишь одну живую клетку, имеет ширину 1.

Клетки должны быть на этом расстоянии от клеток предыдущих столбцов - для каждой живой клетки в нулевом поколении должна быть другая живая клетка в пределах 'n' столбцов слева и в пределах 'n' строк выше или ниже.

Находить подпериоды - при поиске периодических объектов отбрасываются объекты с меньшими периодами (долями основного), если не отмечена эта галочка. Проверка на подпериодичность осуществляется сравнением нулевого поколения со всеми промежуточными.

Только искать предков - обычно происходит поиск периодических конфигураций, то есть последнее поколение должно переходить в нулевое. Если здесь стоит галочка, то программа не проверяет, что будет происходить после последнего поколения, или перед нулевым. Эта галочка также влияет на порядок исследования поколений - если галочки нет, то нулевое поколение подбирается сначала, а если стоит, то в конце.

Только комбинировать решения - во время поиска, помимо того, что высвечиваются и сохраняются решения, происходит также вычисление так называемой "комбинации решений". Комбинация состоит из клеток, которые совпадают во всех найденных до сих пор решениях. Когда поиск заканчивается естественным путем (а не потому что нажали "остановить"), то эта комбинация высвечивается на экране. Если же выбрана эта опция, то отдельные решения не показываются и не сохраняются, и программа просто пытается найти комбинацию, по возможности отбрасывая неинформативные ветки. Поиск комбинаций никогда не будет медленнее обычного поиска, и обычно он намного быстрее.

Вначале находить все поколения - если тут галочка, то сначала устанавливаются все поколения одной клетки, а потом поиск переходит к следующей клетке. В противном случае сначала находится целиком одно поколение, а потом подбирается следующее.

Стараться искать широкие объекты - обычно внешние клетки перебираются раньше внутренних. Если здесь галочка, то внутренние клетки перебираются раньше. Поскольку поиск сначала устанавливает клетку в мертвое состояние, эта галочка может привести к более быстрому нахождению более широких объектов.

Диагональный порядок поиска - обычно поиск ищет столбец за столбцом, начиная с самого левого столбца. Если здесь галочка, то поиск идет по диагонали из левого верхнего угла.

Косой порядок поиска - клетки сортируются по возрастанию величины (2*строка+столбец).

Начинать со средних столбцов - обычно поиск ищет столбец за столбцом, начиная с самого левого столбца. А так поиск будет начинать со среднего столбца, и двигаться поочередно то вправо, то влево. (Начиная с версии 0.62r, эта опция нетривиально взаимодействует с двумя предыдущими. - прим.перев.)

Начинать с центральных клеток - поиск идет от средней клетки квадратиком.(Эта опция появилась в версии 0.62r. - прим.перев.)

В первую очередь проверять клетки рядом с живыми - если здесь галочка, то порядок обхода клеток немного меняется, но я не совсем понимаю, как именно.

Предпочитать стабильные живые клетки - по умолчанию, всем клеткам в процессе поиска изначально присваивается "мертвое" состояние. Если здесь галочка, то клетка будет сначала предполагаться живой, если живая клетка уже есть в предыдущем или следующем поколении. Эта опция должна отдавать предпочтение решениям с большим числом стабильных клеток.

Сначала перебирать клетки с наибольшим влиянием - 'умная' сортировка клеток. Если тут галочка, то для первых N клеток в очереди на перебор вычисляется количество клеток, которые будут вынуждены принять определенное состояние, если эту клетку сделать живой или мертвой. Затем выбирается клетка с наибольшим влиянием.

Предпочитать живые клетки, если у них большее влияние - применяется с предыдущей опцией. В этом случае клетке выдается "живое" состояние, если при этом она определяет больше других клеток, чем если ее сделать "мертвой". А если тут галочки нет, то в первую очередь присваивается "мертвое" состояние.

Окно оценки влияния - устанавливает, сколько клеток с вершины списка поиска проверяются на влияние. Серое поле справа показывает среднее использование этого "окна" за последние 100.000 шагов (оно обычно меньше из-за наличия порога оценки влияния).

Порог оценки влияния - если нашлась клетка, принуждающая вот столько других клеток к определенному состоянию, то оценка влияния обрывается, и выбирается эта клетка. Серое поле справа - среднее влияние за последние 100.000 шагов (обычно оно меньше, но может быть и больше).

Серые поля показывают, насколько оказались плодотворны установки оценки влияния. Они не обновляются, пока окно настроек открыто, так что нужно закрыть и снова открыть окно, чтобы увидеть, как эти величины меняются со временем. Настройки оценки влияния можно менять прямо во время поиска.

Настройка вывода

Чтобы увидеть это окошко, нужно выбрать в меню пункт Опции/Настройка вывода или нажать кнопку 'F7'.

Останавливаться после каждого вычисления - останавливать поиск и отображать, что получилось, после каждого шага поиска, то есть когда устанавливается значение какой-нибудь одной клетки и вычисляется ее воздействие на другие в соответствии с правилами Жизни. Это полезно для отладки, или просто чтобы посмотреть, что происходит.

Останавливаться, когда объект найден - останавливать поиск и показывать результат, когда найдено решение. Когда включен режим "только комбинировать решения", эта настройка не работает.

Записывать объекты в файл - записывать каждое решение в указанный файл в текстовом формате. Когда включен режим "только комбинировать решения", эта настройка не работает.

Все поколения - в этом случае в файл записываются все поколения решения, а иначе только нулевое.

Перерисовывать экран каждые ___ вычислений - устанавливает, как часто на экране будет высвечиваться текущее состояние поиска.

Сбрасывать в файл ___ каждые ___ вычислений - если введено положительное количество шагов, состояние поиска будет периодически сохраняться в заданный файл.

Сохранять частичные результаты - каждые ___ столбцов - сохраняет частичные результаты в тот же файл, где лежат решения.

Собственно поиск

Как только поле готово, поиск можно начать, выбрав пункт Поиск/подготовка или Поиск/Старт!. Когда начинается поиск, поле сначала проверяется на корректность. При этом все введенные клетки принимаются как данные, и все клетки, вычисляемые через них в соответствии с правилами Жизни, также устанавливаются. То есть все пустые клетки (в том числе безразличные!) проверяются на возможность быть живыми или мертвыми. Если возможно лишь одно из этих состояний, оно и устанавливается. Если же что-то не так, то выводится одно из трех сообщений об ошибке:

Некорректная живая клетка (строка ___, столбец ___, поколение ___)

Некорректная мертвая клетка (строка ___, столбец ___, поколение ___)

Такие сообщения указывают, что эта клетка по правилам Жизни не могла оказаться в таком состоянии.

Некорректная неизвестная клетка (строка ___, столбец ___, поколение ___)

Это сообщение возникает при проверке пустых клеток, и означает, что для этой клетки ни одно состояние недопустимо - оба варианта приводят к противоречию.

Однако, не стоит доверять координатам клетки - истинная проблема может быть за несколько клеток от указанного места, так что если такое случиться - просто еще раз проверьте изначальную конфигурацию.

Поиск/Подготовка просто проделывает начальную проверку, показывает, что получилось, и останавливается. Это полезно, чтобы понять, как на начальную конфигурацию воздействуют правила Жизни.

Поиск/Старт! выполняет проверку и сразу начинает искать.

Во время поиска решения и текущее состояние высвечиваются в соответствии с настройками вывода. Можно пользоваться такими командами:

Поиск/Пауза - тормозит поиск и высвечивает текущее состояние.

Поиск/Продолжить - продолжает поиск, остановленный паузой

Поиск/Назад - отбрасывает поиск на один шаг назад по дереву поиска. Это может привести к пропуску решений.

Поиск/Назад на 20 шагов - делает 20 шагов назад по дереву поиска. Это может привести к пропуску решений.

Поиск/Очистить комбинацию - очищает буфер комбинации решений.

Поиск/Остановить - останавливает поиск и возвращает его на начало.

Поиск/Копировать результат - берет текущее состояние/решение, объявляет его начальным условием, и останавливает поиск. Это позволяет использовать текущее состояние как основу другого поиска.

Поиск/Копировать комбинацию - похоже на 'Копировать результат', но копирует не текущее состояние, а текущую комбинацию.

Сохранение/загрузка

Есть такая возможность - сохранять состояние поиска в файл. Можно сохранять и начальные условия, но они тоже сохраняются как поиск, и поэтому, в частности, не должны содержать некорректностей.

При помощи Файл/Сохранить состояние (Ctrl+S или просто D) можно сбросить текущий поиск в файл. Желательно использовать расширение .wdf. Впрочем, это будет обычный текстовый файл.

При помощи Файл/Загрузить состояние (Ctrl+O или просто L) можно загрузить сохраненный поиск из файла.

Справка по клавиатуре

Ctrl Shift Клавиша Описание
    a Сделать клетку/выделение мертвым
    A Сделать клетку/выделение мертвым во всех поколениях
    B Сделать один шаг назад по дереву поиска
    c Сделать клетку/выделение пустой
    C Сделать клетку/выделение пустой во всех поколениях
Ctrl   C Копировать текущее поколение в буфер обмена
    d Сохранить состояние поиска в файл
Ctrl   E Отразить поле/выделение в этом поколении по вертикали (относительно горизонтальной оси)
Ctrl Shift E Отразить поле/выделение во всех поколениях по вертикали
    f, F Сделать клетку/выделение замороженной во всех поколениях
Ctrl   G Начать поиск
Ctrl   H Отразить поле/выделение в этом поколении по горизонтали (относительно вертикальной оси)
Ctrl Shift H Отразить поле/выделение во всех поколениях по горизонтали
    i Заменить в этой клетке/выделении в этом поколении безразличные клетки на пустые , остальные оставить без изменений
    I Заменить в этой клетке/выделении во всех поколениях безразличные клетки на пустые , остальные оставить без изменений
    l (маленькая 'L') Загрузить поиск из файла
    n Показать следующее поколение
    o Заменить в этой клетке/выделении в этом поколении пустые клетки на безразличные , остальные оставить без изменений
    O Заменить в этой клетке/выделении во всех поколениях пустые клетки на безразличные , остальные оставить без изменений
Ctrl   O Загрузить поиск из файла
    p Показать предыдущее поколение
Ctrl   P Начать поиск и остановиться сразу после начальной проверки
Ctrl   R Закончить поиск
    s Сделать клетку/выделение живой
    S Сделать клетку/выделение живой во всех поколениях
Ctrl   S Сохранить поиск в файл
Ctrl   T Транспонировать поле/выделение в этом поколении
Ctrl Shift T Транспонировать поле/выделение во всех поколениях
    x Сделать клетку/выделение безразличной
    X Сделать клетку/выделение безразличной во всех поколениях
    y Сделать 20 шагов назад по дереву поиска
    , Показать предыдущее поколение
    . Показать следующее поколение
    Стрелка влево Показать предыдущее поколение
  Shift Стрелка влево Сдвинуть поле/выделение в этом поколении на одну клетку влево
Ctrl Shift Стрелка влево Сдвинуть поле/выделение во всех поколениях на одну клетку влево
  Shift Стрелка вверх Сдвинуть поле/выделение в этом поколении на одну клетку вверх
Ctrl Shift Стрелка вверх Сдвинуть поле/выделение во всех поколениях на одну клетку вверх
  Shift Стрелка вниз Сдвинуть поле/выделение в этом поколении на одну клетку вниз
Ctrl Shift Стрелка вниз Сдвинуть поле/выделение во всех поколениях на одну клетку вниз
    Стрелка вправо Сдвинуть следующее поколение
  Shift Стрелка вправо Сдвинуть поле/выделение в этом поколении на одну клетку вправо
Ctrl Shift Стрелка вправо Сдвинуть поле/выделение во всех поколениях на одну клетку вправо
    Backspace Убрать выделение
Ctrl   Delete Сделать все клетки в этом поколении пустыми
Ctrl Shift Delete Сделать все клетки во всех поколениях пустыми
    Escape Приостановить поиск (пауза)
    Page Up Показать предыдущее поколение
Ctrl Shift Page Up Сдвинуть поле/выделение во всех поколениях на одно поколение в прошлое
    Page Down Показать следующее поколение
Ctrl Shift Page Down Сдвинуть поле/выделение во всех поколениях на одно поколение в будущее
    Пробел Продолжить поиск
    F2 Показать окошко Ширина и высота
    F3 Показать окошко Период
    F4 Показать окошко Симметрия
    F5 Показать окошко Движение
    F6 Показать окошко Настройка поиска
    F7 Показать окошко Настройка вывода

Известные глюки

Когда поиску нечего делать (нет пустых клеток), программа выдает "нет решений". То же происходит, когда все пустые клетки заполняются уже на этапе начальной проверки.

Если остановить поиск или нажать паузу во время перерисовки экрана, программа виснет. Если экран обновляется слишком часто, установите галочку Опции/Настройка вывода/Останавливаться после каждого вычисления, чтобы надежно завершить поиск.

Некоторое редактирование возможно и во время поиска (менять размер поля, период, симметрию, и т.д.), но оно может все испортить, поэтому лучше не пробуйте.

Нельзя сделать выделение живым, щелкнув левой кнопкой мышки.

Когда щелкаешь по полю правой кнопкой мышки при наличии выделения, блок устанавливается в состояние, обратное состоянию щелкнутой клетки, даже если клетка была вне выделения.

История версий

0.62r

Изменения в русской версии WLS:

0.61

Мелкие исправления от Карела Сухайды:

0.60

Изменения внесены Карелом Сухайдой:

0.50

Изменения внесены Карелом Сухайдой:

0.40

Первый Windows-вариант от Джейсона Саммерса программы Девида Белла LIFESRC. Взят за "изначальную" версию, потому что более ранние изменения отследить не удалось.

Титры

Джон Конвей - изобретатель игры "Жизнь".

Девид Белл - создатель LIFESRC.

Джейсон Саммерс - создатель первой Windows-версии LIFESRC и хостинг для этой программы.

Габриель Ниваш и Девид Грин - проверили мой ужасный английский.

Карел Сухайда - автор этого текста

Николай Белюченко - нашел много глюков в WLS, большинство еще не исправлены

Артем Дергачев - перевел этот текст и интерфейс

- прим.перев.

Используются технологии uCoz