tl / dr: есть ли стандартный способ сохранить «сбалансированность» нескольких целей в метаэвристических алгоритмах?
Недавно я добился успеха с простым PSO - он эффективно находит достаточно приличныйРешение за небольшое количество вычислительного времени (и было легко получить рабочий код).Однако, как только я попытался расширить его до нескольких целей (чтобы лучше представить реальное решение), он начал приобретать самоссылочный характер и извилистый и чувствовал, что что-то, что, вероятно, уже имеет ответ.
Пример из реальной жизни: я хотел бы превратить длинное скучное видео в интересное замедленное видео.У меня есть входной массив «количество изменений между кадрами».Ортогональные цели включают в себя:
- Выход должен быть где-то в диапазоне 20-40 секунд, лучше всего ближе к 30 с.
- Это "хорошо", чтобы изменить скорость выводасосредоточиться на интересных частях источника.
Что в порядке: я оптимизирую error = c1*percentDistanceFromTargetTime() + c2*lackOfVarianceInOutputVideo()
Что работает!Но эти модификаторы веса c1 и c2 чертовски хитры (и их ручная обработка побеждает цель).Одна цель имеет тенденцию доминировать над результатом (например, быть идеально 30-секундной длиной за счет дисперсии), и я не хочу этого.
Может ли это быть началом, «мы должны идти глубже», решаемым внутри себя?Есть ли метод, который имеет некоторые "веди себя, черт тебя побери!"дополнительная ошибка, которая удерживает решение вне дыр и вдали от границ, а затем включает c1 и c2 в оптимизацию?
fun behaveNicely() = when {
// absolute no-nos.
outputLength !in 20..40 -> BIG_ERROR
// the twisty part
c1 !in 0.0001..100.0 -> BIG_ERROR
c2 !in 0.0001..100.0 -> BIG_ERROR
areWeOnASolutionThatJustComesFromTime() -> BIG_ERROR // c1 is dominating
areWeOnASolutionThatJustComesFromVariance() -> BIG_ERROR // c2 is dominating
// do the usual thing
else -> 0.0
}
error += behaveNicely()
Надеюсь, это известный метод, который я могу использовать повторно.