Un programa Java para búsqueda urgente de algoritmos genéticos
Importar javax.jframe;
Importar javax.jlabel; >
Importar javax.swing.jscrollpane;
Importar javax.swing.jtextarea;
Importar javax.swing.jtextfield;
/**
*Escrito por Lai Zhihuan
*Función de solución de algoritmo genético estándar
*Fecha de redacción: 2007-12-2
*/
Mejor clase {
Generación cruzada pública; //Mejor código de aptitud
Cadena pública str //Mejor cromosoma
Doble aptitud pública ; //Mejor valor de fitness
}
Clase pública SGAFrame extiende JFrame {
Private JTextArea textArea
Cadena privada str = p>
Privado Mejor mejor = null//Mejor cromosoma
Cadena privada”);
label_1.setBounds(92, 10, 84, 15);
getContentPane().add(label_1);
botón JButton final = nuevo JButton();
button.addActionListener(nuevo ActionListener() {
Operación pública no válida ejecutada (evento de operación final e) {
Marco SGA s = nuevo marco SGA();
str = str+s proceso()+" \ n ". ;
textarea . settext(str);
}
});
Botón .setText("Encontrar el valor mínimo"
botón.setBounds(323, 27, 99, 23);
getContentPane(); Add(button);
final JLabel label_2 = new JLabel();
Label_2.setText("Utilice el algoritmo genético estándar para resolver la función f(x)=(x-5) *(x-5):");
label_2.setBounds(23, 31, 318, 15);
getContentPane(). add(label_2);
Panel JPanel final = nuevo JPanel();
panel establecer diseño(nuevo BorderLayout());
panel. 23, 65, 399, 164);
getContentPane().
add(panel);
panel de desplazamiento final JScrollPane = new JScrollPane();
panel.add(scrollPane, BorderLayout.
centro);
textArea = new JTextArea();
panel de desplazamiento setviewportview(textArea);
//
}
/**
*Inicializar un cromosoma (representado por una cadena binaria)
* @Devolver un cromosoma
*/ p>
Cadena privada inialPop() {
Cadena res =
for(int I = 0;i<gene;i++) {
if(matemáticas .aleatorio()> 0.5) {
RES+= " 0 "
} En caso contrario {
RES+= " 1 "; p>}
}
Devolver res
}
/**
*Inicializar un conjunto de cromosomas
* @Return genome
*/
Cadena privada[] inialPops() {
Cadena[ ] ipop = nueva cadena [10];
for(int I = 0;i<10;i++) {
ipop[I]= inialPop();
}
Volver a ipop
}
/**
*El cromosoma se convierte al valor de x
* @param str cromosoma
* @return valor de aptitud del cromosoma
*/
privado doble cálculo del valor de aptitud (cadena str) {
int b = Integer.parseInt(str, 2);
//String str 1 = " "+"/n ";
doble x =- 255+b *(255 -(-255))/(math . pow(2, GENE)-1);
//system out . println(" X = "+X);
Doble aptitud=-(x-5)*(x-5);
//system out . /cadena 1 = cadena 1+" X = "+X+"/n "
//+ "f(x)=" +"Fitness"+"/ n ";
//textarea . settext(str 1);
Volver a fitness;
}
/** p>
*Calcular el valor de aptitud de cada individuo en el grupo;
*Seleccione los individuos que ingresarán a la próxima generación de acuerdo con ciertas reglas determinadas por el valor de aptitud individual;
* /
Private void select() {
double evals[]= new double[10] //Todos los valores de aptitud cromosómica
double p[]= new double[10] ; //Probabilidad de selección de cada cromosoma
double q[]= new double[10]; //Probabilidad acumulativa
Double F = 0 // Suma de valores de aptitud acumulados
for(int I = 0;i<10;i++) {
evals[I]= calcularfitnessvalue(ipop[I]);
if (mejor == null) {
Mejor = new Mejor();
mejor aptitud = evals[I.
];
mejor . generaciones = 0;
mejor . str = ipop[I]; evals[I]>Best.fitness) //Mejor récord.
{
mejor . fitness = evals[I];
mejor.generaciones = gernación
mejor str = ipop[I] ];
}
}
F = F+evals[I] //La suma de los valores de aptitud de todos los cromosomas
}
for(int I = 0;i<10;i++) {
p[I]= evals[I]/F;
si ( i == 0)
q[I]= p[I];
En caso contrario {
q[I]= q[I-1] + p[I];
}
}
for(int I = 0;i<10;i++) {
doble r = matemáticas . aleatorio();
if(r & lt; = q[0]) {
ipop[I]= ipop[0];
} En caso contrario {
for(int j = 1; j & lt10;j++) {
if(r & lt; q[j]) {
ipop[I]= ipop[j];
Romper;
}
}
}
}
}
/**
*Operación cruzada
*La tasa de cruce es del 25%, con un promedio de 25 % de cruce de cromosomas.
*/
Intersección vacía privada(){
Cadena temp1, temp2
for(int I = 0; i& lt10; i++) {
if(math. random()& lt; 0.25) {
doble r = math. random()
int pos =( int)(math. round(r * 1000))% GEN;
if (pos == 0) {
pos = 1;
}
temp1 = ipop[i]. subcadena(0, posición)
+ ipop[(i + 1) % 10]. Subcadena (pos);
temp 2 = ipop[(I+1)% 10]. subcadena(0, posición)
+ ipop[i].
Subcadena (pos);
ipop[I]= temp 1;
ipop[(I+1)/10]= temp 2;
}
}
}
/**
*Operación de mutación genética
* 1% mutación genética M * POP _ TAMAÑO * * 180 genes Para que cada gen tenga la misma probabilidad de mutación,
*necesita producir una distribución uniforme en [1-180]
*/.
Mutación de vacío privado(){
for(int I = 0;i<4;i++) {
int num =(int)(matemática. aleatorio( )* GEN * 11);
int cromosomaNum =(int)(num/GENO)+1; //Número de cromosomas
int mutaciónNum = num -(cromosoma Número - 1) *gen; //número de gen
if (número de mutación == 0)
número de mutación = 1;
Número de cromosomas = número de cromosomas - 1;
if (número de cromosoma>= 10)
Número de cromosoma = 9;
//System.out.println("antes de la mutación" +ipop[ cromosomaNum]);
Temperatura de cadena;
if (ipop[cromosomaNum].charAt(mutación num-1)= = ' 0 '){
if (mutaciónNum == 1) {
temp = " 1 "+ipop[cromosomaNum]. Cadena secundaria
(número de mutación);
}de lo contrario{
if (mutationNum!=gene){
temp = ipop[ número de cromosomas]. Subcadena (0, número de mutación-
1) + "1" + ipop
[cromosoma]. subcadena(mutaciónNum);
}else {
temp = ipop[cromosomaNum]. subcadena(0, mutación-
1) + "1";
}
}
}else {
if (mutaciónNum == 1) {
temp = "0" + ipop[cromosomaNum]. Cadena secundaria
(número de mutación);
}de lo contrario{
if (mutationNum!=gene){
temp = ipop[ número de cromosomas]. Subcadena (0, número de mutación-
1) + "0" + ipop
[cromosoma]. subcadena(mutaciónNum);
}else {
temp = ipop[cromosomaNum].
Subcadena(0, variación-
1) + "1";
}
}
}
ipop[número de cromosoma]=temp;
//System.out.println("Después de la mutación"+ipop[número de cromosoma]);
}
}
/**
*Implementación de algoritmo genético
*/
Proceso de cadena pública(){
String str =
for(int I = 0;i<10000;i++) {
this select();
this cross();
esta . mutación();
ger nación = I;
}
Str = "mínimo "+mejor.fitness+" , el cromosoma de "+mejores.generaciones+";
devuelve una cadena;
}
}