¿Cómo programar si la función fitness no está directamente relacionada con las partículas a optimizar?
En el ejemplo anterior, podemos ver que hay dos pasos importantes en el proceso de aplicar PSO para resolver problemas de optimización: la codificación de la solución del problema y la función de aptitud no necesitan ser codificación binaria como el algoritmo genético (o usar operaciones genéticas para números reales. Por ejemplo, para resolver el problema f(x)=x1^2 x2^2 x3^2, las partículas se pueden codificar directamente como (x1, x2, x3), y la función de aptitud es f (x). Entonces podemos usar el proceso anterior para optimizar. Este proceso de optimización es un proceso iterativo. La condición de terminación generalmente se establece para alcanzar el número máximo de ciclos o el error mínimo. Los parámetros que deben ajustarse en PSO se enumeran a continuación y establecen empíricamente el número de partículas: generalmente 20-40. De hecho, para la mayoría de los problemas, 10 partículas son suficientes para lograr buenos resultados. Para tipos específicos de problemas, el número de partículas puede ser 100 o 200. Longitud: está determinada por el problema de optimización, que es la longitud de la solución del problema. Rango de partículas: determinado por el problema de optimización. cada dimensión. Vmax: velocidad máxima, que determina la distancia máxima de movimiento de las partículas en un ciclo. Generalmente se define como el ancho de rango de la partícula. x3) pertenece a x1, entonces el tamaño de Vmax es 20. Factor de aprendizaje: c1 y c2 suelen ser iguales a 2. Sin embargo, hay otros valores en la literatura, pero generalmente c1 es igual a c2 y oscila entre 0 y. 4. Condiciones de terminación: número máximo de ciclos y requisitos mínimos de error. Por ejemplo, en el ejemplo de entrenamiento de red neuronal anterior, el error mínimo se puede establecer en 1 clasificación de error y el ciclo máximo se establece en 2000, esta condición de terminación está determinada por. El problema específico es PSO global y PSO local: presentamos dos versiones del algoritmo de optimización del enjambre de partículas: la versión global y la versión local. La primera es rápida pero a veces cae en el óptimo local. La segunda converge. Es difícil caer en el óptimo local. En aplicaciones prácticas, primero puede usar PSO global para encontrar resultados aproximados y luego usar PSO local para buscar. El código proviene de la Pregunta B de la División Noreste de Modelado Matemático en 2008. incluyetdafx.h# include#include#includeusingnamespacestd; intc1=2; // Factor de aceleración intc2=2; // Factor de aceleración doublew=1; // Peso de inercia máximo doubleWmin=0.6; /Peso mínimo de inercia intKmax=110; //Número de iteraciones intGdsCnt; //Número total de materiales intconstDim=10; //Dimensión de partícula intconstPNum=50; //Número de partículas intGBIndex=0; //Índice de partícula óptimo doublea=0.6 ; //Factor de ajuste de aptitud doubleb=0.5; //Factor de ajuste de aptitud intXup[Dim]; //Matriz de límite superior de posición de partículas intXdown[Dim]=; //Matriz de límite inferior de posición de partículas intValue[Dim]; intVmax[Dim ]; //Matriz de velocidad máxima classPARTICLE; //Declarar nodo de partículas voidCheck(PARTICLEamp;, int); //Función de restricción voidInput(ifstreamamp;); //Ingresar variable voidInitial(); PARTICLEamp;) ;//Calcular aptitud voidCalculateFit(); //Calcular aptitud voidBirdsFly(); //Partícula voladora voidRun(ofstreamamp;, int=2000); //Ejecutar función classPARTICLE //Clase de partícula {public: intX[Dim] ; //Matriz de coordenadas de partículas intXBest[Dim] //Partículas
La mejor matriz de posición intV[Dim]; //Matriz de velocidad de partículas doubleFit; //Aptitud de las partículas doubleFitBest; //Mejor posición de las partículas}; //Matriz de partículas intmain()//Función principal {ofstreamoutf(out) .txt); ifstreaminf(data.txt); //Archivo de entrada asociado infgt; gt; gdsCnt; //Ingrese el número total de materiales Input(inf); ; return0; } voidCheck (PARTICLEamp; p, intcount) // Parámetros: p objeto de partícula, contar cantidad de material {srand ((unsigned) time (NULL)); ; elseif(p.XVmax)p.V=Vmax; elseif(p.Vcount){p. )p.V=Vmax; elseif(p.Vgt; Generador de funciones aleatorias para(inti=0; iParr[GBIndex].Fit)GBIndex=i ;}}doubleGetFit(PARTICLEamp;p)//Calcular la aptitud del objeto {doublesum=0; for(inti=0; i=Parr. FitBest){Parr.FitBest=Parr.Fit;for(intj=0;jParr[GBIndex] .FitBestamp;amp;i!=GBIndex)GBIndex=i;}}voidRun(ofstreamamp;outf, intnum)//Deje que las partículas se especifiquen el número de num vuelos {for(inti=0; i