Как-то раз я испытывал программу с генетическим алгоритмом для распознавания функций. Генетический алгоритм знает только функцию, оценивающую ошибку предсказанного значения функции по отношению к целевому при данном значении аргумента. При малом количестве операций и аргументов (использовались +,-,*,/ и три аргумента) алгоритм неизменно сходился к точному виду «искомой» функции. При большем количестве операций/операндов на первый взгляд, нет никаких шансов на успех. Известно, что генетический алгоритм лучше всего реализует себя в непрерывном пространстве поиска, когда результат также непрерывно сходится к цели. Вместе с тем, задание функциональной зависимости в виде формулы предельно радикально: либо формула верна, либо нет. Решающим фактором в данной задаче является поиск «непрерывного» представления функций. В идеале, это представление должно позволять переходить непрерывно от любой функции к любой. Возможно ли это? Подобного рода проблем можно перечислить тысячи. Ветвления в программах ¬– одно из главных препятствий для генетических алгоритмов. Нельзя ли обойтись без ветвлений? Мы пишем программу в виде жестко заданного кода. Ошибка завышения индекса/адреса на 1 при обращении к памяти приводит к прочтению совершенно другой информации/выполнению другой команды. Проблема последнего столба и необходимость следить за деталями занимают подавляющую часть времени выполнения проекта. Детали – также враг генетических алгоритмов. Что возможно сделать для избавления от деталей? В идеале, программа не должна иметь кода. Нечеткая программа, выполняющаяся на нечеткой ВМ… В природе (не будем рассматривать микроуровень) процессы выполняются непрерывно. Можете ли вы привести примеры жестко заданных программ в природе? Можно ли использовать некоторые природные явления как вычислительные процессы (во всяком случае, рассматривать природные явления как вычисления можно всегда). Под действием ветра/дождей изменяется рельеф земли. Разве это не вычисления? Форма рельефа через некоторое время не является результатом работы алгоритма? Дана система муравейников, в каждом из них в начале некоторое количество муравьев, некоторым образом распределена система точек, представляющих крошки. Муравьи начинают уносить крошки в свои муравейники, какова будет картина распределения крошек через n итераций? Каким образом можно интерпретировать распределение крошек на плоскости? Если поставить в соответствие плотности крошек высоту, получим 3-мерную поверхность. Если найти область с наибольшей плотностью, получим точку. Соединим между собой все крошки, до которых расстояние не превосходит d. Получим несколько компонент связности. Как можно интерпретировать края этих компонент? Можете вы запрограммировать муравейник, как бы вы это сделали? Можно ли, ограничивая поведение муравья, задавая начальное распределение крошек/муравейников, добиться данной картины через n итераций? Если убрать из муравейника 1 муравья или сдвинуть муравейник на 1 см, сильно ли изменится картина?
Обычно поступают так. Выбирается изучаемое явление природы, строится его математическая модель. Далее, конечно, нужны численные методы и ВМ. Решая уравнения численно, получаем поведение модели. Но это же самое явление может рассматриваться как процесс вычислений, эквивалентных решению уравнений на ВМ. Смоделировав явление на более низком уровне, чем на уровне, требующем ДУ, получим ту же картину, но на этот раз это будет решение ДУ. Решение ДУ- алгоритмическая задача. Каким алгоритмам можно поставить в соответствие модель природного явления (выполненную на «низком» уровне традиционным жестким кодированием)? Вы можете привести примеры явлений, в которых явно использовались бы ветвления? Может многие (все) программы можно написать без ветвлений? Вы можете написать процедуру сортировки массива без ветвлений? Допустим, у нас есть массив чисел. Поставим в соответствие каждому числу шарик с плотностью, равной числу (размеры одинаковые). Насыплем шарики в пробирку и потрясем ее (размеры шариком, качество шлифовки их поверхностей, их число не рассматриваем). Они взвесятся в соответствии со своей массой. Эта ли не сортировка? Да, возможно некоторые близкие по массе шарики будут расположены не по порядку, но они будут близко! Где здесь сравнения и ветвления? Нет, код
if (соседний шарик тяжелее данного)
{
опустить соседний на один уровень
}
не принимается. Модель должна быть на НИЗКОМ уровне (для каждого шарика найти равнодействующую, придать ускорение, найти новую координату, перейти к следующему кванту времени ). В каких формах явлений/зависимостей можно спрятать ветвления, математические операции над числами, представление чисел. Матрица весов графа- это числа? А матрица скоростей течения воды в дельте реки/связей между нейронами/кривизны траекторий элементарных частиц/высот рельефа? Нужны ли числа как таковые для выполнения вычислений? Они нужны для расчета модели на низком уровне, но необходимы ли они на уровне модели? В природе есть результат взаимодействия частиц, мы вводим для его описания скорость частиц, их направления, импульсы, хотя достаточно знать лишь результат взаимодействия частиц. Мы не знаем как происходит это взаимодействие и не можем смоделировать его на низком уровне, поэтому пытаемся описать результат, но знать как записывается ДУ и метод Рунге-Кутта не обязательно, чтобы видеть результат работы законов. Возможна ли программа, записанная не в виде кода, а в виде начальных распределений частиц/плотностей/скоростей/весов соединений/формы поверхностей? Какой бы вы хотели видеть интегрированную среду для «нечетко-непрерывного» программирования, как ее пользователь создает программу? Самое главное - нужны примеры явлений, моделированием которых можно заменить, по крайней мере, ограниченные классы программ. Заранее спасибо.
|