В информатике и машинном обучении популяционное инкрементальное обучение ( PBIL ) — это алгоритм оптимизации и алгоритм оценки распределения . Это тип генетического алгоритма , в котором генотип всей популяции ( вектор вероятности ) эволюционирует, а не отдельных членов. [1] Алгоритм был предложен Шумитом Балуджей в 1994 году. Алгоритм проще стандартного генетического алгоритма и во многих случаях приводит к лучшим результатам, чем стандартный генетический алгоритм. [2] [3] [4]
В PBIL гены представлены как действительные значения в диапазоне [0,1], указывающие вероятность того, что какой-либо конкретный аллель появится в этом гене .
Алгоритм PBIL выглядит следующим образом:
Это часть исходного кода, реализованного на Java . В статье используются learnRate = 0,1, negLearnRate = 0,075, mutProb = 0,02 и mutShift = 0,05. N = 100 и ITER_COUNT = 1000 достаточно для небольшой проблемы.
public void optimize () { final int totalBits = getTotalBits ( ); final double [] probVec = new double [ totalBits ] ; Arrays.fill ( probVec , 0.5 ); bestCost = POSITIVE_INFINITY ; for ( int i = 0 ; i < ITER_COUNT ; i ++ ) { // Создает N генов final boolean [ ][] genes = new [ N ] [ totalBits ] ; for ( boolean [] gene : genes ) { for ( int k = 0 ; k < gene .length ; k ++ ) { if ( rand_nextDouble () < probVec [ k ] ) gene [ k ] = true ; } } // Рассчитать стоимость final double [] costs = new double [ N ] ; for ( int j = 0 ; j < N ; j ++ ) { costs [ j ] = costFunc . cost ( toRealVec ( genes [ j ] , domains )); } // Найти минимальную и максимальную стоимость генов boolean [] minGene = null , maxGene = null ; double minCost = POSITIVE_INFINITY , maxCost = NEGATIVE_INFINITY ; for ( int j = 0 ; j < N ; j ++ ) { double cost = costs [ j ] ; if ( minCost > cost ) { minCost = cost ; minGene = genes [ j ] ; } if ( maxCost < cost ) { maxCost = cost ; maxGene = genes [ j ] ; } } // Сравнить с лучшим геном стоимости if ( bestCost > minCost ) { bestCost = minCost ; bestGene = minGene ; } // Обновляем вектор вероятностей с максимальными и минимальными стоимостными генами for ( int j = 0 ; j < totalBits ; j ++ ) { if ( minGene [ j ] == maxGene [ j ] ) { probVec [ j ] = probVec [ j ] * ( 1d - learnRate ) + ( minGene [ j ] ? 1d : 0d ) * learnRate ; } else { final double learnRate2 = learnRate + negLearnRate ; probVec [ j ] = probVec [ j ] * ( 1d - learnRate2 ) + ( minGene [ j ] ? 1d : 0d ) * learnRate2 ; } } // Мутация for ( int j = 0 ; j < totalBits ; j ++ ) { if ( rand . nextDouble () < mutProb ) { probVec [ j ] = probVec [ j ] * ( 1d - mutShift ) + ( rand . nextBoolean () ? 1d : 0d ) * mutShift ; } } } }