Programa de generación de árbol principal más corto de gráfico no dirigido java
importar javax.swing.*;
importar java.awt.*;
importar java.awt.event.*;
importar java.util.Random;
la clase pública GAFrame extiende JFrame {
privado estático final largo serialVersionUID = 1L;
estático TopologyPanel tpnl = nuevo TopologyPanel( );
private String[] ipop = new String[10]; // Cromosoma
private int gernation = 0 // Código de cromosoma
public static final int GENE = 9; // Número de genes
public GAFrame(título de cadena) {
super(título);
}
public static void main(String args[]) {
tpnl.setLayout(null);
GAFrame frame = new GAFrame("El algoritmo genético encuentra la ruta óptima");
frame.setContentPane(tpnl);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(370, 330);
JButton botón1 = nuevo JButton();
botón1.setText("Generar parámetros");
botón1.setBounds(5, 245, 90, 25); p >
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tpnl.refreshPanel1();
}
});
JButton botón2 = nuevo JButton();
botón2.setText("Generar ruta");
botón2 setBounds(245, 245, 90, 25);
button2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tpnl .refreshPanel2();
}
});
tpnl.add(botón1);
tpnl.add(botón2 ) ;
frame.setVisible(true);
}
}
clase TopologyPanel extiende JPanel {
estado privado
c int[][] params1 = new int[8][2];
private static int[] params2 = new int[13];
private static Random rnd = nuevo Aleatorio();
pintura vacía pública(Gráficos g) {
super.paint(g);
g.fillOval(30, 120, 10, 10);
g.fillOval(100, 30, 10, 10);
g.fillOval(80, 210, 10, 10);
g.fillOval(140, 130, 10, 10);
g.fillOval(210, 50, 10, 10);
g.fillOval(260, 120, 10, 10);
g.fillOval(160, 230, 10, 10);
g.fillOval(230, 190, 10, 10);
g.drawLine(35, 125, 105, 30);
g.drawLine(105, 35, 215, 55);
g.drawLine(215, 55, 265, 125);
g.drawLine(265, 125, 235, 195);
g.drawLine(235, 195, 165, 235);
g.drawLine(85, 215, 165, 235);
g.drawLine(35, 125, 85, 215);
g.drawLine(35, 125, 145, 135);
g.drawLine(85, 215, 235, 195);
g.drawLine(105, 35, 145, 135);
g.drawLine(215, 55, 145, 135);
g.drawLine(265, 125, 145, 135);
g.drawLine(85, 215, 145, 135);
g.drawString("A", 21, 120);
g.drawString("B", 92, 30);
g.drawString("C", 70, 220);
g.drawString("D", 225, 60);
g.drawString("E", 148, 148);
g.drawString("F", 160, 253);
g.drawString("G", 245, 202);
g.drawString("H", 270, 130);
g.drawString("( " + params1[0][0] + ", " + params1[0][1] + " ) ", 30,
120);// A
g.drawString("( " + params1[1][0] + ", " + params1[1][1 ] + " )", 100,
30);// B
g.
drawString("( " + params1[2][0] + ", " + params1[2][1] + " )", 80,
210);// C
g.drawString("( " + params1[3][0] + ", " + params1[3][1] + " )", 140,
130);// E
g.drawString("( " + parámetros1[4][0] + ", " + parámetros1[4][1] + " )", 210,
50); // D
g.drawString("( " + params1[5][0] + ", " + params1[5][1] + " )", 255,
115);// H
g.drawString("( " + params1[6][0] + ", " + params1[6][1] + " )", 160, p>
230);// F
g.drawString("( " + params1[7][0] + ", " + params1[7][1] + " )", 230,
190);// G
g.drawString("" + params2[0], 70, 77);// A-B
g .drawString("" + params2[1], 160, 45);// BD
g.drawString("" + params2[2], 240, 90);// DH
g.drawString("" + params2[3], 250, 160);// GH
g.drawString("" + params2[4], 200, 215);// FG
g.drawString("" + params2[5], 125, 225);// CF
g.drawString("" + params2[6], 60, 170) ;// AC
g.drawString("" + params2[7], 90, 130);// AE
g.drawString("" + params2[8], 160, 205);// CG
g.drawString("" + params2[9], 125, 85);// BE
g.drawString("" + params2 [10], 180, 95);// DE
g.drawString("" + params2[11], 205, 140);// EH
g.drawString( "" + params2[12], 115, 175);// CE
}
public void refrescoPanel1() {
for (int i = 0 ; i < params1.length; i++) {
params1[i][0] = (rnd.nextInt(21) + 10) * 100;
params1[i][ 1] = rnd.nextInt(41) + 20;
}
para (yo
nt i = 0; i < params2.length; i++)
params2[i] = ((rnd.nextInt(91)) + 10) * 10;
repintar() ;
}
public void actualizarPanel2() {
// TopologyPanel tt = new TopologyPanel();
// p>
// p>
// tt.tenacc();
GAFrame.tpnl.tenacc();
}
String inialPop() { p>
Carácter s[] = nuevo Carácter[9];
String[] a = nuevo String[9];
a[ 0] = "1";
for (int i = 0; i < s.length; i++) {
s[i] = '-';
}
if (Math.random() < 1 / 3.0) {
s[0] = 'B';
} else si (Math.random() > = 1.0 / 3.0 && Math.random() < 2.0 / 3.0) {
s[0] = 'C';
} más p>
s[ 0] = 'E';
cambiar (s[0]) {
caso 'B': {// ss[0] selecciona B
a[1] = "1";
a[2] = a[6] = a[3] = "0";
si (Math.random() < 0.5) {
s[1] = 'D';
} más {
s[1] = 'E ';
}
cambiar (s[1]) {
caso 'D': {
a[4] = "1";
a[5] = "0";
if (Math.random() < 0.5) {
s[4] = 'H';
} else {
s[4] = 'E';
}
cambiar (s[4 ]) {
caso 'H': {
a[7] = a[8] = "0";
}
break;
case 'E': {
a[7] = "1";
if (Math.random() < 0.5) {
s[7] = 'H';
} más {
s[7] = 'C';
}
cambiar (s[7]) {
caso 'H': {
a[8] = "0";
}
romper;
case 'C': {
a[8] = "1";
if (Math.random() < 0.5) {
s[8] = 'G';
} más {
s[8] = 'F';
}
}
}
}
}
}
descanso; p> p>
caso 'E': {
a[4] = a[7] = "0";
a[5] = "1";
p>if (Math.random() < 1 / 3.0) {
s[5] = 'H';
} else if (Math .random() >= 1.0 / 3.0
&& Math.random() < 2.0 / 3.0) {
s[5] = 'C';
} else
s[5] = 'D';
cambiar (s[5]) {
caso 'H':
caso 'D': {
a[8] = "0";
}
descanso;
caso 'C': {
a[8] = "1";
if (Math.random() < 0.5) {
s[8] = 'G' ;
} más {
s[8] = 'F';
}
}
}
}
}
}
descanso;
caso 'E': {// s [0]Seleccione E
a[2] = "1";
a[1] = a[3] = a[4] = a[5 ] = a[ 7] = a[6] = "0";
if (Math.random() < 0.25) {
s[2] = 'B';
} else if (Math.random() >= 0.25 && Math.random() < 0.5) {
s[2] = 'C';
} else if (Math.random() >= 0.5 && Math.random() < 0.75) {
s[2] = 'D';
} else
s[2] = 'H';
cambiar (s[2]) {
caso 'H':
caso 'D':
caso 'B': {
a[8] = "0";
}
descanso;
caso 'C': {
a[8] = "1";
if (Math.random() < 0.5) {
s[8] = 'G';
} más {
s[8] = 'F';
}
}
}
}
descanso;
caso 'C': {// ss[0] seleccione C
a[1] = a[2] = a[4] = a[5] = a[7] = a[8] = "0";
a[3] = "1";
si ( Math.random() < 1 / 3.0) {
s[3] = 'G';
} else if (Math.random() >= 1.0 / 3.0 && Math .random() < 2.0 / 3.0) {
s[3] = 'F';
} else
s[3] = 'E' ;
cambiar (s[3]) {
caso 'G':
caso 'F': {
a[ 6] = "0";
}
descanso;
caso 'E': {
a[6] = " 1";
if (Math.random() < 1 / 3.0) {
s[6] = 'H';
} else if ( Math.random() >= 1.0 / 3.0
&& Math.random() < 2.0 / 3.0) {
s[6] = 'D';
} más
s[6] = 'B';
}
}
}
}
String res = "";
StringBuffer bf = new StringBuffer();
for (int i = 0; i < s.length; i++) {
bf.append(s[i]);
}
res = bf.toString();
return res;
}
String[] inialPops() {
String[] ipop = new String[10];
for (int i = 0; i < 10; i++) {
ipop[i] = inialPop();
System.out.println(ipop[i]);
}
for (int i = 0; i < params1.length; i++) {
System.out.print(params1[i][0] + " ");
}
devolver ipop;
}
doble calcfit() {
int bw = 0;
int retraso = 0;
int len = 0;
String ss = inialPop();
char[] s = ss.toCharArray();
switch (s[0]) {
case 'B ': {// A-B
if (params1[0][0] > params1[1][0]) {
bw = params1[1][0];
} else {
bw = params1[0][0];
}
retraso = params1[0][1] + params1 [1][1];
len += params2[0];
cambiar (s[1]) {
case 'D' : { // ABD
if (params1[4][0] < bw) {
bw = params1[4][0];
} p>
retardo += params1[4][1];
len += params2[1];
interruptor (s[4]) { p>
caso 'H': {// ABDH
if (params1[5][0] < bw) {
bw = params1[5][0] ;
}
retraso += params1[5][1];
len += params2[2];
} p>
break;
case 'E': {// ABDE
if (params1[3][0] < bw) {
bw = params1[3][0];
}
retraso += params1[3][1];
len += params2[ 9] ;
cambiar (s[7]) {
caso 'H': {// ABDEH
if (params1[5][0] < bw ) {
bw = params1[5][0];
}
retraso += params1[5][1];
len += params2[11];
}
break;
caso 'C': {// ABDEC
if (params1[2][0] < bw) {
bw = params1[5][0];
}
retraso += params1[ 2][1];
len += params2[12];
cambiar (s[8]) {
caso 'G': {// ABDECGH
if (params1[7][0] < bw) {
bw = params1[7][0];
}
if (params1[5][0] < bw) {
bw = params1[5][0];
}
retraso = retraso + params1[5][1] + params1[7][1];
len = len + params2[8] + params2[3];
}
descanso;
caso 'F': {// ABDECFGH
if (params1[6][0] < bw) {
bw = params1[6][0];
}
if (params1[7][0] < bw) {
bw = params1[7][0];
}
if (params1[5][0] < bw) {
bw = params1 [5][0];
}
retraso = retraso + parámetros1[5][1] + parámetros1[7][1]
+ parámetros1 [6][1];
len = len + params2[5] + params2[4] + params2[3];
}
}
}
}
}
}
}
descanso; p> p>
caso 'E': {// ABE
if (params1[3][0] < bw) {
bw = params1[3][ 0] ;
}
retraso += params1[3][1];
len += params2[9];
cambiar (s[5]) {
case 'H': {// ABEH
if (params1[5][0] < bw) {
bw = params1[5][0];
}
retraso += params1[5][1];
len += params2[ 11] ;
}
descanso;
caso 'D': {// ABEDH
if (params1[4][ 0] < bw) {
bw = params1[4][0];
}
if (params1[5][0] < bw) {
bw = para
ms1[5][0];
}
retraso += params1[5][1] + params1[4][1];
len += params2[10] + params2[2];
}
descanso;
caso 'C': {// ABEC
if (params1[2][0] < bw) {
bw = params1[2][0];
}
retraso += params1[2][1];
len += params2[12];
cambiar (s[8]) {
case 'G': {// ABECGH
if (params1[7][0] < bw) {
bw = params1[7][0];
}
if (params1[5][0] < bw) {
bw = params1[5][0];
}
retraso += params1[5][1] + params1[7][1];
len += params2[8] + params2[3];
} p>
ruptura;
caso 'F': {
if (params1[6][0] < bw) {
bw = params1 [6][0];
}
if (params1[7][0] < bw) {
bw = params1[7][0 ];
}
if (params1[5][0] < bw) {
bw = params1[5][0];
}
retraso = retraso + params1[5][1] + params1[7][1]
+ params1[6][1];
len = len + params2[5] + params2[4] + params2[3];
}
}
}
}
}
}
}
descanso;
caso 'E': {// AE
if (params1[0][0] < params1[3][0]) {
bw = params1[0][0];
} else {
bw = params1[3][0];
}
retraso = params1[0][1] + params1 [3][1];
len = params2[7];
cambiar (s[2]) {
caso 'H': {// AEH
if (params1[5][0] < bw) {
bw = params1[5][0];
}
retraso += params1[5][1];
len += params2[11];
}
break;
caso 'D': {// AEDH
if (params1[4][0] < bw) {
bw = params1 [4][0];
}
if (params1[5][0] < bw) {
bw = params1[5][0 ];
}
retraso += params1[5][1] + params1[4][1];
len += params2[10] + params2[2];
}
descanso;
caso 'B': {// AEBDH
if (params1[ 1][0] < bw) {
bw = params1[1][0];
}
if (params1[4][0] < bw) {
bw = params1[4][0];
}
if (params1[5][0] < bw) {
bw = params1[5][0];
}
retraso += params1[5][1] + params1[4][1] + params1[1][1];
len += params2[9] + params2[1] + params2[2];
}
break;
caso 'C': {// AEC
if (params1[2][0] < bw) {
bw = params1[5][ 0];
}
retraso += params1[2][1];
len += params2[12];
cambiar (s[8]) {
case 'G': {// AECGH
if (params1[7][0] < bw) {
bw = params1[7][0];
}
if (params1[5][0] < bw) {
bw = params1 [5][0];
}
retraso = retraso + params1[5][1] + params1[7][1];
len = len + params2[8] + params2[3];
}
break;
caso 'F': {// AECFGH
> if (params1[6][0] < bw) {
bw = params1[6][0];
}
if (params1[ 7][0] < bw) {
bw = params1[7][0];
}
if (params1[5][0] < bw) {
bw = params1[5][0];
}
retraso = retraso + params1[5][1] + params1[ 7][1]
+ params1[6][1];
len = len + params2[5] + params2[4] + params2[3];
}
}
}
}
}
descanso;
caso 'C': {// AC
if (params1[0][0] < params1[2][0]) {
bw = params1[0 ][0];
} else {
bw = params1[2][0];
}
retraso = params1 [0][1] + params1[2][1];
len = params2[6];
cambiar (s[3]) {
caso 'G': {// ACGH
if (params1[7][0] < bw) {
bw = params1[7][0];
}
if (params1[5][0] < bw) {
bw = params1[5][0];
}
demora = demora + params1[5][1] + params1[7][1];
len = len + params2[8] + params2[3]; p> p>
}
descanso;
caso 'F': {// ACFGH
if (params1[6][0] < bw) {
bw = params1[6][0];
}
if (params1[7][0] < bw) { p>
bw = params1[7][0];
}
if (params1[5][0] < bw) {
bw = params1[5][0];
}
retraso = retraso + params1[5][1] + params1[7][1] + params1[6][ 1] ;
len = len + params2[5] + params2[4] + params2[3];
}
romper;
caso 'E': {// ACE
if (params1[3][0] < bw) {
bw = params1[3][0];
}
retraso += params1[3][1];
len += params2[12];
cambio (s[6] ) {
caso 'H': {// ACEH
if (params1[5][0] < bw) {
bw = params1[5 ][0];
}
retraso += params1[5][1];
len += params2[11];
}
descanso;
caso 'D': {// ACEDH
if (params1[4][0] < bw) {
bw = params1[4][0];
}
if (params1[5][0] < bw) {
bw = params1[5][0];
}
retraso += params1[5][1] + params1[4][1];
len += params2[10] + params2[2];
}
break;
caso 'B': {// AEBDH p>
if (params1[1][0] < bw) {
bw = params1[1][0];
}
if (params1[4][0] < bw) {
bw = params1[4][0];
}
if (params1[5 ][0] < bw) {
bw = params1[5][0];
}
retraso += params1[5][1] + params1[4][1] + params1[1][1];
len += params2[9] + params2[1] + params2[2];
}
}
}
}
}
}
doble aptitud1 = ((bw - 2000) + (200 - retraso) * 10);
aptitud doble = aptitud1 / len;
aptitud de retorno;
} p>
private void cross() {
String temp1, temp2;
for (int i = 0; i < 10; i++) {
if (Math.random() < 0.25) {
doble r = M
ath.random();
int pos = (int) (Math.round(r * 1000)) % 9;
if (pos == 0) {
pos = 1;
}
Objeto[] ipop = null;
temp1 = ((String) ipop[i]).substring (0, pos)
+ ((String) ipop[(i + 1) % 10]).substring(pos);
temp2 = ((String) ipop[( i + 1) % 10]).substring(0, pos)
+ ((String) ipop[i]).substring(pos);
ipop[i] = temp1;
ipop[(i + 1) / 10] = temp2;
}
}
}
mutación de vacío privado() {
for (int i = 0; i < 4; i++) {
int num = (int) (Math.random() * 9 * 10 + 1);
int númerocromosoma = (int) (num/9) + 1;
int númeromutación = num - (númerocromosoma - 1) * 9; p> p>
if (Nummutación == 0)
Nummutación = 1;
Numcromosoma =Numcromosoma - 1;
if (Numcromosoma >= 10)
numerocromosoma = 9;
Temp de cadena;
Objeto[] ipop = null;
if (((Cadena) ipop[ cromosomaNum]).charAt(mutaciónNum - 1) == '0') {
if (mutaciónNum == 1) {
temp = "1" + ((String ) ipop [numerocromosoma]).subcadena
(numeromutación);
} else {
if (numeromutación!= 9) {
temp = ((String) ipop[chromosomeNum]).substring(0,
mutationNum -
1)
+ "1" + ((String ) ipop
[numerocromosoma]).substring(numeromutación);
} else {
temp = ((String) ipop[numerocromosoma]).substring( 0,
mutación
ionNum - 1)
+ "1";
}
}
} más {
si (Nummutación == 1) {
temp = "0" + ((String) ipop[chromosomeNum]).substring
(mutationNum);
} else {
if (mutationNum != 9) {
temp = ((String) ipop[chromosomeNum]).substring(0,
mutationNum -
1)
+ "0" + ((Cadena) ipop
[numerocromosoma]).substring(numeromutación);
} else {
temp = ((String) ipop[chromosomeNum]).substring(0,
mutationNum - 1)
+ "1"; p>
}
}
}
ipop[chromosomeNum] = temp;
}
}
public String proceso() {
String str = "";
for (int i = 0; i < 10000; i++) {
this.inialPop();
this.cross();
this.mutation();
}
return str;
}
doble acc() {
doble qwe = calcfit();
System.out .println(qwe);
return qwe;
}
private void tenacc() {
double[] ds = nuevo double[10];
String[] ipop = new String[10];
for (int i = 0; i < 10; i++) {
ipop[i] = inialPop();
ds[i] = calcfit();
// System.out.println(ipop[i]);
// System.out.println(ds[i]);
}
for (int i = 1; i < ds.length; i++) {
if (ds[0] > ds[i]) {
ipop[0] = ipop[i];
}
}
Gráficos g = null;
g = getGraphics();
super.paint(g);
// g.clearRect(0, 0, 400, 400);
g.fillOval(30,120,10 ,10);
g.fillOval(100,30,10,10);
g.drawString("E",148,148);
g .drawString("F",160,253);
g.drawString("G",245,202);
g.drawString("H",270,130);
}
}
/*
* private void paintComponent(Gráficos gg) { super.paintComponent(gg);
* Graphics2D g = (Graphics2D)gg; g.setStroke(new BasicStroke(10));
* g.drawOval(100,50,200,200); p> */