Я написал эту функцию выбора рулетки для генетического алгоритма, над которым я работаю, и который основан на примерах, которые я нашел в сообщениях на форуме:
private fun stringMatcherSelection(members: Collection<StringMatcherGenome>,
target: String) : StringMatcherGenome {
val totalFitness = members.sumBy { it.fitness(target) }
val slicePoint = totalFitness * Randomness.value.nextDouble()
var accumulator = 0
members.forEach {
accumulator += it.fitness(target)
if (accumulator >= slicePoint)
return StringMatcherGenome(it.genes)
}
return StringMatcherGenome(members.last().genes)
}
То, что он делает, суммирует значения пригодности всех участников, чтобы получить общую пригодность населения. Затем он выбирает случайную точку на этой общей пригодности путем умножения общей пригодности на случайную двойную. После этого он проходит по всем элементам совокупности и увеличивает переменную-накопитель по заданной пригодности членов. Когда накопленное значение превышает или равно случайно выбранной точке среза пригодности, я возвращаю оцененный в данный момент элемент в качестве выбранного элемента.
Однако, я только что посмотрел на это сегодня, это больше не имеет смысла для меня. Как эта функция выбирает члена, пропорционального его пригодности? Даже если я отсортирую участников по наименьшему и наиболее подходящему (поместив участников с более высоким уровнем пригодности в конец списка), тот факт, что я случайно выбрал значение пригодности из общего уровня пригодности, будет означать, что случайный член будет выбран с не имеет значения их пропорциональная пригодность?
Или, другими словами; Я думаю, что случайный дубль, который я генерирую, имеет равномерное распределение, поэтому выбранная точка среза пригодности также будет иметь равномерное распределение, только сопоставленное по общей пригодности, а не 0,0-1,0. Это означает, что, если я сначала отсортирую список, результатом всегда будет равномерный выбор (не пропорциональный пригодности). Если только я полностью не пропустил сюжет.
Вот посты, где я нашел, что является довольно стандартной реализацией этой функции:
https://en.wikipedia.org/wiki/Fitness_proportionate_selection (тот, который я в значительной степени расшифровал для Котлина)
Пропорциональный выбор фитнеса (выбор колеса рулетки) в Python
Эффективная реализация фитнес-пропорционального выбора "рулетка"
Выбор рулетки в генетических алгоритмах
РЕДАКТИРОВАТЬ:
Читая эту статью (Раздел 5, стр. 4), выясняется, что сортировка списка перед циклом называется Ранговым отбором, тогда как их сортировка не является выбором рулетки:
http://www.cs.ucc.ie/~dgb/courses/tai/notes/handout12.pdf
Но я до сих пор не понимаю, как какая-либо функция выбирает пропорционально физической форме, это выглядит как нормальное распределение в моей голове (мне кажется, я изо всех сил пытаюсь визуализировать алгоритм в моей голове ...)