Red de conocimiento informático - Aprendizaje de código fuente - Programa de generación de árbol principal más corto de gráfico no dirigido java

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);

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,

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>

// tt.tenacc();

GAFrame.tpnl.tenacc();

}

String inialPop() {

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

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>

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];

}

retardo += params1[4][1];

len += params2[1];

interruptor (s[4]) {

caso 'H': {// ABDH

if (params1[5][0] < bw) {

bw = params1[5][0] ;

}

retraso += params1[5][1];

len += params2[2];

}

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>

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];

}

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>

}

descanso;

caso 'F': {// ACFGH

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];

}

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

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;

}

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>

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";

}

}

}

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> */