En informática y aprendizaje automático , el aprendizaje incremental basado en la población ( PBIL ) es un algoritmo de optimización y un algoritmo de estimación de distribución . Se trata de un tipo de algoritmo genético en el que se desarrolla el genotipo de una población completa ( vector de probabilidad ) en lugar de los miembros individuales. [1] El algoritmo fue propuesto por Shumeet Baluja en 1994. El algoritmo es más simple que un algoritmo genético estándar y, en muchos casos, conduce a mejores resultados que un algoritmo genético estándar. [2] [3] [4]
En PBIL, los genes se representan como valores reales en el rango [0,1], lo que indica la probabilidad de que cualquier alelo particular aparezca en ese gen .
El algoritmo PBIL es el siguiente:
Esta es una parte del código fuente implementado en Java . En el artículo, se utilizan learnRate = 0,1, negLearnRate = 0,075, mutProb = 0,02 y mutShift = 0,05. N = 100 e ITER_COUNT = 1000 son suficientes para un problema pequeño.
public void optimizar () { 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 ++ ) { // Crea N genes final boolean [][] genes = new [ N ] [ totalBits ] ; for ( boolean [] gen : genes ) { for ( int k = 0 ; k < gen.length ; k ++ ) { if ( rand_nextDouble ( ) < probVec [ k ] ) gen [ k ] = true ; } } // Calcular costos final double [] costs = new double [ N ] ; for ( int j = 0 ; j < N ; j ++ ) { costs [ j ] = costFunc . cost ( toRealVec ( genes [ j ] , dominios )); } // Encuentra los genes de costo mínimo y máximo 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 ] ; } } // Comparar con el gen de mejor costo si ( bestCost > minCost ) { bestCost = minCost ; bestGene = minGene ; } // Actualizar el vector de probabilidad con genes de costo máximo y mínimo para ( 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 ; } } // Mutación para ( int j = 0 ; j < totalBits ; j ++ ) { if ( rand . nextDouble () < mutProb ) { probVec [ j ] = probVec [ j ] * ( 1d - mutShift ) + ( rand . nextBoolean ( ) 1d : 0d ) * cambiomutativo ; } } } }