Полный тайтл: Реализация кроссовера в генетическом алгоритме при разных типах переменных в генотипе.
Преамбула:
Разрабатываю систему которая обрабатывает тексты.
Есть в ней основная функция F(cls_Parameters). Возвращает она dbl_Result as Double в диапазоне от 0 до 1 включительно (например 0,350098). Предвидя вопрос - функция такая как надо, т.е. она даёт однозначный и точный результат.
Время работы функции 20 секунд ровно (быстрее никак).
cls_Parameters представляет из себя следующиё класс [в квадратных скобках я обозначил мин.\макс. возможные колебания значений переменных внутри класса]:
- Код: Выделить всё
Public Class cls_Parameters
'clustering related:
Dim i_iClusterMinLength_Chars As Integer = 0-20000
Dim i_iClusterMinSeqSimFpsCount As Integer = 0-2000
Dim i_iClusteringDistance As Integer = 0-5000
'cls_Text load\parse related:
Dim b_iSortFPsBeforeHashing As Boolean = True [ture-false]
Dim i_iuFP_Step As Integer = 0 - 200
Dim i_iuFP_Lenght As Integer = 1 - 100
Dim b_iRemovePuncSigns As Boolean = [ture-false]
Dim b_iDoStemming As Boolean = [ture-false]
End Class
Проблема: существует такая комбинация значений этого класса, которая даёт максимальный результат F(cls_Parameters) = Xmax (какое именно не знаю но в пределах от 0 до 1(реально-идеальный вариант - 0,97)).
Очевидное решение: перебор всех возможных комбинаций т.е.:
Количество итераций F = макс_диапазон_параметра * n параметров
Количество итераций F = 20000*2000*5000*2*200*99*2*2 = 3,168e+16
3,168e+16 * 20 секунд на итерацию = *печалька*.
В качестве решения проблемы я смотрю в сторону генетического алгоритма.
[url]http://ru.wikipedia.org/wiki/Генетический_алгоритм[/url]
Опыта нет, но "ехать надо". Насколько мог, настолько я матчасть изучил, но прошу прощения если что-нить накосячу.
Как реализовать кросс-овер (с мутацией всё ясно) по различным типам переменных?
Т.е. я себе переставляю как сделать мутацию по integer-ам, то вот что делать с парой boolean-integer, не очень .
Одна идея это слить всё в один байтовый вектор, и реализовывать всё на на integer. Т.е.:
Вектор особи: 00000-0000-0000-0-000-000-0-0
(5 байт а 1 переменную, 4 байта на 2-ую, 5-на третью и т.д.)
Но чувствую 6-м чувством, что надо по-другому - например не выполнять кросовер для boolean типов с Integer, а только boolean c boolean.
если реализовать кроссовер булевых то это просто:
до кроссовера: 0-1-0 :: 0-1-0
после кроссовера: 0-0-1 :: 1-0-0
как быть integer[0-20000] и boolean[ture-false]?
Есть какие-нибудь идеи?
Огромное спасибо за советы заранее!