Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Algoritmos Genticos
TRABAJOS PRCTICOS
Comisin: E03
Integrantes:
Legajo
38679
38259
38416
Apellido y Nombre
Ferrero Franco
Bertani Ivn
Diez Santiago
Consigna 1
Utilizar un Algoritmo Gentico Cannico para buscar un mximo de la funcin f (x) = x2, definida sobre el
conjunto de enteros entre 0 y 31. El espacio solucin es entonces {x/x pertenece a Z y 0<=x<=31}.
Para re presentar estos elementos como tira, basta considerar a los enteros en su representacin binaria. El
espacio solucin puede verse entonces como {00000, 00001, 00010, 00011,, 11111}. Es decir que el espacio
solucin est formado por cromosomas de longitud 5 y cada gen es un dgito binario 0 o 1.
Tener tambin en cuenta que no habr mutacin en ninguno de los individuos y los padres siempre harn
crossover. La poblacin ser de 4 individuos y se harn 4 ciclos. Se utilizar el mtodo de seleccin de la ruleta.
Resolucin Consigna 1
Poblacin
Poblacin
Poblacin
Poblacin
Individuo
F.Obj
Fitness
01101
11000
01000
10011
13
24
8
19
suma
promedio
mximo
mnimo
x
12
25
27
16
suma
promedio
mximo
mnimo
x
27
17
25
25
suma
promedio
mximo
mnimo
x
27
25
27
25
suma
promedio
mximo
mnimo
169
576
64
361
1170
292,5
576
64
F.Obj
144
625
729
256
1754
438,5
729
144
F.Obj
729
289
625
625
2268
567
729
289
F.Obj
729
625
729
625
2708
677
729
625
0,144444444
0,492307692
0,054700855
0,308547009
1
0,25
0,492307692
0,054700855
Fitness
0,082098062
0,356328392
0,415621437
0,145952109
1
0,25
0,415621437
0,082098062
Fitness
0,321428571
0,127425044
0,275573192
0,275573192
1
0,25
0,321428571
0,127425044
Fitness
0,269202363
0,230797637
0,269202363
0,230797637
1
0,25
0,269202363
0,230797637
Individuo
01100
11001
11000
10011
Individuo
11011
10001
11001
11001
Individuo
11011
11001
11011
11001
Consigna 2
Hacer un programa que utilice un Algoritmo Gentico Cannico para buscar un mximo de la funcin:
2
30
30
f (x) = (x/coef) en el dominio [0 , 2 -1], donde coef = 2 -1 . Teniendo en cuenta los siguientes datos:
Probabilidad de Crossover = 0,75
Probabilidad de Mutacin = 0,05
Poblacin Inicial: 10 individuos
Ciclos del programa: 20
Mtodo de Seleccin: Ruleta
Mtodo de Crossover: 1 Punto
Mtodo de Mutacin: invertida
El programa debe mostrar, finalmente, el Cromosoma correspondiente al valor mximo obtenido, y grficas,
usando EXCEL, de Mximo, Mnimo y Promedio de la funcin objetivo por cada generacin
Resolucin Consigna 2
Tabla de Evolucin de las Poblaciones:
Poblacin
Mximo Fitness
Mnimo Fitness
2,42817025360102
0.24281702536010297
0.7687463210465061
0.002740969849395422
0.3165949009985764
0.0011288211134826743
5,19998744421240
0.5199987444212404
0.7687463226796394
0.06161473839522487
0.14783618824604192
0.011849016763262032
6,67569410724385
0.6675694107243852
0.7687463226796394
0.33075685129809396
0.11515601379120506
0.049546436068601
7,11382373443454
0.7113823734434541
0.7687463226796394
0.6253082811916736
0.10806372934973274
0.08790044630496845
7,37047785997941
0.7370477859979419
0.8822502976370384
0.6253082811916736
0.11970055597446731
0.08483958476925942
7,80011108045528
0.7800111080455283
0.8822502958874897
0.7683182645385193
0.11310740152126063
0.09850093884735722
7,48260860250143
0.7482608602501437
0.7687463226796394
0.5651758728084971
0.1027377434151303
0.07553193048471876
7,48303666087538
0.7483036660875387
0.7687463226796394
0.5651758714081944
0.10273186642248913
0.07552760958170669
7,68703684098475
0.7687036840984751
0.7687479950091156
0.7683182645385193
0.10000576436818986
0.09994986110149741
10
7,06025743283406
0.7060257432834062
0.7687479950091156
0.1419652421994742
0.10888384769569685
0.020107658049302583
11
7,68660878121049
0.7686608781210496
0.7687479933759805
0.7683182645385193
0.10001133337957098
0.09995542721214487
12
7,68617905237303
0.7686179052373034
0.7687463226796394
0.7683182645385193
0.1000167075788192
0.09996101564942185
13
7,68617905237212
0.7686179052372124
0.7687463226796394
0.7683182645385193
0.10001670757883104
0.09996101564943367
14
7,68703516865482
0.768703516865482
0.7687463226796394
0.7683182661711979
0.10000556857269653
0.09994988305818413
15
7,80011108710377
0.7800111087103778
0.8822502976370384
0.7683182661711979
0.11310740164915044
0.09850093897271385
16
7,79882691921158
0.7798826919211586
0.8822502976370384
0.7683182661711979
0.11312602610319612
0.09851715830217068
17
7,91230037332544
0.7912300373325445
0.8822502976370384
0.7683182629058407
0.11150364066199363
0.09710428404564293
18
7,94146138102281
0.7941461381022815
0.9113807910224931
0.7683182629058407
0.11476235258164945
0.09674771758530992
19
7,94151488483337
0.7941514884833378
0.9113807910224931
0.7683182629058407
0.11476157940131027
0.09674706577370608
20
8,16975350699456
0.8169753506994561
0.9113807910224931
0.7683182661711979
0.11155548208917336
0.09404424081012966
MINIMO
941175143
MAXIMO
1025061223
Grficos:
Consigna 3
Repetir consigna 2, utilizando elitismo.
Resolucin Consigna 3
Tabla de Evolucin de las Poblaciones:
Poblacin
Mximo Fitness
Mnimo Fitness
4,24029446667322
0.42402944666732223
0.8762434706689137
0.01826192979819658
0.20664684435380307
0.0043067598115477616
6,45080400359554
0.6450804003595549
0.8762699227600004
0.17660858139912491
0.13583886942954476
0.02737776272549698
7,45282897058622
0.7452828970586223
0.8762700360945831
0.4918294604352148
0.11757549241407825
0.06599231813534137
6,86967522131064
0.6869675221310648
0.8762700360945831
0.491829485254599
0.12755625380604263
0.07159428494215832
7,99944655436136
0.7999446554361369
0.8762701128133815
0.6320977016866963
0.10954134224893737
0.0790176792095787
7,94091753327028
0.7940917533270289
0.876393681515152
0.6319926947948346
0.11036428445998846
0.07958686035297015
7,90973976068430
0.7909739760684309
0.876393759983095
0.6321133118241198
0.11079931660195026
0.0799158165690944
8,18122396066043
0.8181223960660435
0.875498073343868
0.6321133118241198
0.10701309211845518
0.07726390511537737
8,48260009563532
0.8482600095635322
0.875498073343868
0.6321133118241198
0.10321105126650389
0.07451881553975065
10
8,50768972191165
0.8507689721911657
0.875498073343868
0.6572029381004538
0.10290667642580009
0.07724810842687643
11
8,72598485715507
0.8725984857155071
0.875498073343868
0.846502197060258
0.10033229345177963
0.09700935893398316
12
8,75498074041004
0.8754980740410044
0.8754980803152314
0.875498073343868
0.10000000071664657
0.09999999992037259
13
8,75498074738140
0.8754980747381407
0.8754980803152314
0.875498073343868
0.10000000063701919
0.0999999998407452
14
8,75500928837552
0.8755009288375524
0.8755266282807114
0.875498073343868
0.10000293539873145
0.09999967384458538
15
8,75498073343868
0.875498073343868
0.875498073343868
0.875498073343868
0.09999999999999999
0.09999999999999999
16
8,75503784377802
0.8755037843778029
0.875555183683216
0.875498073343868
0.10000587082618377
0.09999934768597957
17
8,75515184137311
0.8755151841373113
0.875555183683216
0.8754978502602572
0.10000456868671491
0.09999802015117862
18
8,75503762069441
0.8755037620694417
0.875555183683216
0.8754978502602572
0.10000587337439337
0.09999932475342305
19
8,75503739761080
0.8755037397610806
0.875555183683216
0.8754978502602572
0.10000587592260309
0.09999932730146589
20
8,75503735578308
0.8755037355783084
0.8755551976263974
0.8754978502602572
0.1000058779929768
0.09999932777921874
MINIMO
1004679201
MAXIMO
1004712105
Grficos:
Nota: El mximo sufre variaciones, pero son demasiado pequeas para la escala del grfico. Ver tabla de datos.
11
Conclusin consignas 2 y 3
El algoritmo sin elitismo tiene mayor aleatoriedad y esto es observable en las grficas, aunque finalmente
ambas alcanzan un cierto equilibrio cuando las poblaciones tienen menor margen de mejora, siendo el
elitista el primero en hacerlo y por lo tanto el ms eficaz.
Otro punto interesante es el mximo y mnimo fitness, podemos ver que se juntan una vez que la
poblacin es suficientemente fuerte. La diferencia entre el mejor ejemplar y el peor ejemplar de la
poblacin es casi inexistente, significando esto que todos los individuos de la poblacin tienen
prcticamente el mismo peso dentro de la misma. Esto tambin se ve ms pronunciado en el algoritmo
elitista.
12
Consigna 6
A partir del siguiente grfico:
10
55
45
20
40
35
25
30
5
50
15
13
Resolucin Consigna 6
Todas las combinaciones posibles son:
123451
123541
124351
124531
125341
125431
132451
132541
134251
134521
135241
135421
142351
142531
143251
143521
145231
145321
152341
152431
153241
153421
154231
154321
213452
213542
214352
214532
215342
215432
231452
231542
234152
234512
235142
235412
241352
241532
243152
243512
245132
245312
251342
251432
253142
253412
254132
254312
312453
312543
314253
314523
315243
315423
321453
321543
324153
324513
325143
325413
341253
341523
342153
342513
345123
345213
351243
351423
352143
352413
354123
354213
412354
412534
413254
413524
415234
415324
421254
421524
423154
423514
425134
425314
431254
431524
432154
432514
435124
435214
451234
451324
452134
452314
453124
453214
512345
512435
513245
513425
514235
514325
521345
521435
523145
523415
524135
524315
531245
531425
532145
532415
534125
534215
541235
541325
542135
542315
543125
543215
412354
412534
413254
413524
415234
415324
421254
421524
423154
425134
431254
432154
512345
512435
513245
513425
514235
514325
521345
521435
523145
524135
531245
532145
213452
213542
214352
214532
215342
215432
231452
231542
234152
235142
241352
243152
312453
312543
314253
314523
315243
315423
321453
321543
324153
325143
341253
342153
14
Por ltimo, tomando en consideracin las combinaciones que indican el mismo camino pero de diferente punto de
partida llegamos a:
123451
123541
140
145
124351
125
124531
125341
125431
132451
132541
134251
135241
142351
143251
170
130
170
195
200
180
185
155
155
15
Consigna 7
Hallar la ruta de distancia mnima que logre unir todas las capitales de Provincias de la Repblica Argentina,
utilizando la siguiente heurstica:
Desde cada ciudad ir a la ciudad ms cercana no visitada.
La ruta de distancia mnima en lnea recta, utilizando la heurstica propuesta, es:
Comenzar la ruta en Crdoba, siguiendo por San Luis, Mendoza, San Juan, La Rioja, San Fernando del Valle de
Catamarca, Santiago del Estero, San Miguel de Tucumn, Salta, San Salvador de Jujuy, Resistencia, Corrientes,
Formosa, Posadas, Paran, Santa Fe, La Plata, Santa Rosa, Neuqun, Viedma, Rawson, Rio Gallegos, Ushuaia y
finalmente volviendo al punto de partida(Crdoba).
La distancia total es de 9779 kilmetros.
1
2
3
4
5
6
7
8
9
10
11
12
Crdoba
Corrientes
Formosa
La Plata
La Rioja
Mendoza
Neuqun
Paran
Posadas
Rawson
Resistencia
Rio Gallegos
13
14
15
16
17
18
19
20
21
22
23
16
Resolucin Consigna 7
Secuencia
2-11-3-9-8-19-1-18-6-17-5-13-21-14-16-15-20-7-23-10-12-22-4-2
3-2-11-9-8-19-1-18-6-17-5-13-21-14-16-15-20-7-23-10-12-22-4-3
4-8-19-1-18-6-17-5-13-21-14-16-15-11-2-3-9-20-7-23-10-12-22-4
5-13-21-14-16-15-11-2-3-9-8-19-1-18-6-17-20-7-23-10-12-22-4-5
6-17-5-13-21-14-16-15-11-2-1-18-20-7-23-10-12-22-4-8-19-3-9-6
7-20-18-6-17-5-13-21-14-16-15-11-2-1-19-8-4-9-3-23-10-12-22-7
8-19-1-18-6-17-5-13-21-14-16-15-11-2-3-9-4-20-7-23-10-12-22-8
9-3-2-11-19-8-1-18-6-17-5-13-21-14-16-15-20-7-23-10-12-22-4-9
10-23-20-18-6-17-5-13-21-14-16-15-11-2-1-19-8-4-9-3-7-12-22-10
11-2-3-9-8-19-1-18-6-17-5-13-21-14-16-15-20-7-23-10-12-22-4-11
12-22-10-23-20-18-6-17-5-13-21-14-16-15-11-2-1-19-8-4-9-3-7-12
13-5-17-6-18-1-19-8-4-20-7-23-10-12-22-21-14-16-15-11-2-3-9-13
14-21-13-5-17-6-18-1-19-8-4-20-7-23-10-12-22-11-2-3-9-16-15-14
15-16-14-21-13-5-17-6-18-1-19-8-4-20-7-23-10-12-22-11-2-3-9-15
16-15-14-21-13-5-17-6-18-1-19-8-4-20-7-23-10-12-22-11-2-3-9-16
17-6-18-1-19-8-4-20-7-23-10-12-22-5-13-21-14-16-15-11-2-3-9-17
18-6-17-5-13-21-14-16-15-11-2-1-19-8-4-20-7-23-10-12-22-9-3-18
19-8-1-18-6-17-5-13-21-14-16-15-11-2-3-9-4-20-7-23-10-12-22-19
20-18-6-17-5-13-21-14-16-15-11-2-1-19-8-4-23-10-7-12-22-9-3-20
21-14-13-5-17-6-18-1-19-8-4-20-7-23-10-12-22-11-2-3-9-16-15-21
22-12-10-23-20-18-6-17-5-13-21-14-16-15-11-2-1-19-8-4-9-3-7-22
23-10-7-20-18-6-17-5-13-21-14-16-15-11-2-1-19-8-4-9-3-12-22-23
17
18
Conclusin consigna 7
Al enfrentar problemticas de este tipo es necesario evaluar la situacin desde el principio para saber
que metodologa tomar para su resolucin. Cuando la cantidad de elementos es pequea (de tal forma
que su resolucin tome solo unos das), es preferible resolver de manera exhaustiva, buscando la mejor
opcin posible.
Sin embargo, cuando solo unos pocos elementos se agregan a la situacin, puede que el tiempo
requerido para encontrar la opcin posible pase de unos das a aos (y hasta incluso siglos). En estos
debera solicitarse la ayuda de mtodos heursticos para alcanzar un resultado en menor tiempo. No
encontraramos el mejor, pero, por lo menos, un resultado en s.
19
Consigna 8
Repetir consigna 7, utilizando un algoritmo gentico.
20
Conclusin consigna 8
Si bien aunque la cantidad de poblaciones con las que se trabaja puede ser bastante grande, y se
obtienen resultados en poco tiempo, el mtodo es demasiado aleatorio como para presentar una
respuesta satisfactoria.
Debido a esto, al igual que en la conclusin de la consigna 7, creemos preferible utilizar heurstica para
este tipo de problemas cuando la cantidad de elementos comienza a presentar problemas al modo
exhaustivo.
21
22
23
24
25
}
};
System.out.println();
System.out.println("(Ultima Poblacin)");
System.out.println("Maximo :"+ max);
System.out.println("Minimo :"+ (int)min);
}
//Crea la nueva poblacin a partir de la anterior
public void popularManhattan(int i){
pares= girarRuleta(((i-1)*4)+1);
for(int k=0; k<10; k+=2){
cross= consultarProbabilidad();
if(cross){
hijos= cruzar(pares[k], pares[k+1]);
} else {
hijos[0]= escribir(pares[k]);
hijos[1]= escribir(pares[k+1]);
}
poblaciones[i][k]=hijos[0];
poblaciones[i][k+1]= hijos[1];
tabla[k][(i*4)+1] = leer(hijos[0]);
tabla[k+1][(i*4)+1] =leer(hijos[1]);
tabla[k][(i*4)]= tabla[k][(i*4)+1];
tabla[k+1][(i*4)]= tabla[k+1][(i*4)+1];
}
calcularTabla(i);
}
}
class manhattanDemo {
public static void main(String[] args) {
int poblaciones;
Scanner input = new Scanner( System.in );
System.out.print("Numero de poblaciones: ");
poblaciones = input.nextInt();
Manhattan projManhattan= new Manhattan(poblaciones);
projManhattan.cargarValores();
projManhattan.generarTablaInicial();
projManhattan.calcularTabla(0);
for(int i=1; i< poblaciones; i++){
projManhattan.popularManhattan(i);
}
projManhattan.imprimirDatos(poblaciones);
}
}
26
27
28
}
/* Genera un nmero aleatoriamente entre 1 y 100,si el nro. esta entre el 1 y la
prob de crossover
* entonces retorna positivo */
public boolean consultarProbabilidad(){
Random generator= new Random();
int x;
x= generator.nextInt(100);
if(PROB_CROSS>=x){
return true;
} else{
return false;
}
}
/* Hace la cruza de padres para obtener los hijos.
* el corte de genes se hace aleatoriamente */
public int[][] cruzar(int mother, int father){
Random generator= new Random();
int[] madre;
int[] padre;
int x,m;
int[] hijo;
int[] hija;
int[][]retorno;
madre= new int[30];
padre= new int[30];
hijo= new int[30];
hija= new int[30];
retorno= new int[2][30];
padre= escribir(father);
madre= escribir(mother);
x= generator.nextInt(30);
for(int i=0; i<=x; i++){
hijo[i]=padre[i];
hija[i]=madre[i];
};
for(int i=(x+1); i<30; i++){
hijo[i]=madre[i];
hija[i]=padre[i];
};
if (consultarMutacion()){
m= generator.nextInt(30);
if(hijo[m]==1){
hijo[m]=0;
} else{
hijo[m]=1;
}
}
retorno[0]=hijo;
if (consultarMutacion()){
m= generator.nextInt(30);
if(hija[m]==1){
hija[m]=0;
} else{
hija[m]=1;
}
}
retorno[1]=hija;
return retorno;
}
//Pasa un numero (ej 14) a binario (1110)
29
30
};
System.out.println();
System.out.println("(Ultima Poblacin)");
System.out.println("Maximo :"+ max);
System.out.println("Minimo :"+ (int)min);
}
//Crea la nueva poblacin a partir de la anterior
public void popularManhattan(int i){
pares= girarRuleta(((i-1)*4)+1);
cross= consultarProbabilidad();
if(cross){
hijos= cruzar(pares[0], pares[1]);
if (leer(hijos[0]) < leer(hijos[1])){
hijos[0]= escribir((int)sumPromMaxMin[i-1][2][0]);
} else{
hijos[1]= escribir((int)sumPromMaxMin[i-1][2][0]);
}
} else {
hijos[0]= escribir((int)sumPromMaxMin[i-1][2][0]);
if (pares[0]< pares[1]){
hijos[1]= escribir(pares[1]);
} else{
hijos[1]= escribir(pares[0]);
}
}
poblaciones[i][0]=hijos[0];
poblaciones[i][1]= hijos[1];
tabla[0][(i*4)+1] = leer(hijos[0]);
tabla[1][(i*4)+1] =leer(hijos[1]);
tabla[0][(i*4)]= tabla[0][(i*4)+1];
tabla[1][(i*4)]= tabla[1][(i*4)+1];
for(int k=2; k<10; k+=2){
cross= consultarProbabilidad();
if(cross){
hijos= cruzar(pares[k], pares[k+1]);
} else {
hijos[0]= escribir(pares[k]);
hijos[1]= escribir(pares[k+1]);
}
poblaciones[i][k]=hijos[0];
poblaciones[i][k+1]= hijos[1];
tabla[k][(i*4)+1] = leer(hijos[0]);
tabla[k+1][(i*4)+1] =leer(hijos[1]);
tabla[k][(i*4)]= tabla[k][(i*4)+1];
tabla[k+1][(i*4)]= tabla[k+1][(i*4)+1];
}
calcularTabla(i);
}
}
class manhattanEliteDemo {
public static void main(String[] args) {
int poblaciones;
Scanner input = new Scanner( System.in );
System.out.print("Numero de poblaciones: ");
poblaciones = input.nextInt();
ManhattanElite projManhattanElite= new ManhattanElite(poblaciones);
projManhattanElite.cargarValores();
projManhattanElite.generarTablaInicial();
projManhattanElite.calcularTabla(0);
for(int i=1; i< poblaciones; i++){
projManhattanElite.popularManhattan(i);
31
}
projManhattanElite.imprimirDatos(poblaciones);
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Viajante
{
class Exhaustivo
{
/* Parmetros de clase
* @contador se utilizar para contar la cantidad de permutaciones hechas
32
33
34
*
*/
#endregion
Console.Read();
}
/* Se encarga de descomponer los das de ejecucin
* en aos, meses, das, horas, minutos y segundos
*/
public void tiempo(double totalEjecucionEnDias)
{
double aux;
double aos;
double meses;
double dias;
double horas;
double minutos;
double segundos;
// Toma los decimales restantes y los convierte en una unidad inferior
aux = totalEjecucionEnDias / 365;
aos = Math.Truncate(aux);
aux = (aux - aos) * 12;
meses = Math.Truncate(aux);
aux = (aux - meses) * 30.4;
dias = Math.Truncate(aux);
aux = (aux - dias) * 24;
horas = Math.Truncate(aux);
aux = (aux - horas) * 60;
minutos = Math.Truncate(aux);
aux = (aux - minutos) * 60;
segundos = Math.Truncate(aux);
Console.WriteLine("La ejecucion de este algoritmo para 23 ciudades en la presente maquina tomara:");
Console.WriteLine();
Console.WriteLine("{0} aos, {1} mes(es), {2} da(s), {3} hora(s), {4} minuto(s) y {5} segundo(s).", aos, meses, dias, horas,
minutos, segundos);
Console.WriteLine();
Console.WriteLine();
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Viajante
{
35
class Eurstico
{
int[,] distancia = new int[24, 24];
36
37
38
39
40
41
total = b;
secuencia = new int[24];
for (int i = 0; i <= 23; i++)
{
secuencia[i] = a[i];
}
}
};
public retorno hacerRecorrido(int numCiudad)
{
/*
* masCorto[0] contrendr la secuencia de ciudades a recorrer
* masCorto[1] contrendr la cadena que indica el total del recorrido
*/
int[] masCorto = new int[24];
masCorto[0] = numCiudad;
int total = 0;
int ultima;
ultima = numCiudad;
for (int b = 1; b < 23; b++)
{
int menor = 20000;
int aux = 0;
for (int i = 1; i <= 23; i++)
{
bool continuar = true;
foreach (int ciudad in masCorto)
{
if (ciudad == i)
{
continuar = false;
}
}
if (continuar)
{
if (distancia[ultima, i] < menor)
{
menor = distancia[ultima, i];
aux = i;
}
}
}
ultima = aux;
total += menor;
masCorto[b] = ultima;
}
masCorto[23] = numCiudad;
retorno camino = new retorno(masCorto, total);
return camino;
}
42
Anexo 3 (Consigna 6)
Lenguaje: C#
using System;
using System.Collections.Generic;
using System.Text;
namespace Mochila
{
class Program
{
static void Main(string[] args)
{
Program prog = new Program();
Console.WriteLine("EXHAUSTIVO.");
prog.realizarExhaustivo();
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("---------------------------------------------------------");
Console.WriteLine();
43
Console.WriteLine("GREEDY.");
prog.realizarGreedy();
Console.Read();
}
public void realizarGreedy()
{
Greedy grd = new Greedy();
Console.WriteLine("1.Utilizar elementos existentes.");
Console.WriteLine("2.Ingresar elementos por teclado.");
Console.Write("Opcin elejida: ");
int op;
op = int.Parse(Console.ReadLine());
int cant = 10;
if (op == 1)
{
grd.cargarElementosConocidos();
}
else
{
cant = grd.cargarDatos();
grd.cargarElementos(cant);
}
grd.cargarElementosConocidos();
grd.hacer();
grd.mostrar();
}
public void realizarExhaustivo()
{
Exhaustivo comb = new Exhaustivo();
Console.WriteLine("1.Utilizar elementos existentes.");
Console.WriteLine("2.Ingresar elementos por teclado.");
Console.Write("Opcin elejida: ");
int op;
op = int.Parse(Console.ReadLine());
int cant=10;
if (op == 1)
{
comb.cargarElementosConocidos();
}
else
{
cant = comb.cargarDatos();
comb.cargarElementos(cant);
}
for (int i = 0; i < cant; i++)
{
comb.inicializar(0, i, 0);
comb.combinar(i, cant, i);
}
44
comb.mostrar();
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Mochila
{
class Mochila
{
public int[] C;
public double[] Precio;
public double[] Kilaje;
public double PrecioMaximo=0;
public double PesoMaximo;
public int[] ElementosOptimos;
public int[] E;
public int cant;
public int cargarDatos()
{
Console.Write("Ingrese cantidad de elementos: ");
cant = int.Parse(Console.ReadLine());
Precio = new double[cant];
Kilaje = new double[cant];
C = new int[cant];
E = new int[cant];
Console.Write("Ingrese peso maximo de mochila: ");
PesoMaximo = double.Parse(Console.ReadLine());
return cant;
}
public void cargarElementos(int cant) //precios y pesos de elementos por teclado. Param @cant cantidad de elementos a
ingresar
{
for (int i = 0; i < cant; i++)
{
Console.Write("Ingrese precio de elemento {0}: ",i+1);
Precio[i] = double.Parse(Console.ReadLine());
Console.Write("Ingrese peso de elemento {0}: ", i+1);
Kilaje[i] = double.Parse(Console.ReadLine());
E[i] = i;
}
}
/*
* Inicializa Precio y Kilaje con los elementos que se encuentran
45
46
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Mochila
{
class Exhaustivo : Mochila
{
public void combinar(int pos, int cantEl, int posFija)
{
evaluar(posFija);
if (C[pos] == E[cantEl - 1])
{
if (pos != 0)
{
combinar(pos - 1, cantEl - 1, posFija);
}
}
else
{
C[pos] = C[pos] + 1;
if (pos == posFija)
{
combinar(pos, cantEl, posFija);
}
else
{
inicializar(pos + 1, posFija, C[pos] + 1);
combinar(posFija, E.Length, posFija);
}
}
}
/*
* Inicializa el arreglo @C desde el ndice @ini hasta el ndice @pos,
* en una secuencia numerica ascendente desde el numero @algo hasta @algo + (@pos - @ini)
*/
public void inicializar(int ini, int pos, int algo)
{
int a = algo;
47
48
int[] elementos;
public void densi()
{
densidad = new double[cant];
elementos = new int[cant];
for (int i = 0; i < cant;i++ )
{
densidad[i] = Precio[i] / Kilaje[i];
}
double aux;
int aux1;
for (int i = 0; i < cant; i++)
{
for (int j = i + 1; j < cant; j++)
{
if(densidad[i]>densidad[j])
{
aux = densidad[i];
densidad[i] = densidad[j];
densidad[j] = aux;
aux1 = elementos[i];
elementos[i] = elementos[j];
elementos[j] = aux1;
}
}
}
}
public void inicializarElementos()
{
elementos = new int[cant];
for (int i = 0; i < cant; i++)
{
elementos[i]=i;
}
}
public void agregarElementos()
{
double pesoMochila=0;
double pesoActual;
ElementosOptimos = new int[cant];
int a=0;
for (int i = 0; i < cant;i++ )
{
pesoActual=pesoMochila+Kilaje[elementos[i]];
if (pesoActual <= PesoMaximo)
{
pesoMochila = pesoActual;
PrecioMaximo = Precio[elementos[i]] + PrecioMaximo;
49
ElementosOptimos[a] = elementos[i];
a = a + 1;
}
}
}
public void hacer()
{
this.densi();
this.inicializarElementos();
this.agregarElementos();
}
}
}
50
Anexo 4(Consigna 8)
class Program
{
static void Main(string[] args)
{
Genetico vg = new Genetico();
vg.pobInicial();
for (int i = 0; i < 200; i++)
{
vg.calcularRecorridos();
vg.calcularFitness();
vg.ordenarFitness();
vg.cargarRuleta();
vg.girarRuleta();
vg.nuevaPoblacion();
}
vg.calcularRecorridos();
vg.buscarMejorRecorrido();
}
}
class Genetico
{
private const int PROB_CROSS = 75;
private const int PROB_MUT = 5;
private int[,] distancia = new int[24,24];
private int[,] hijos, poblacion;
private int[] recorrido;
private int[,] padres;
private double[] fitness;
private Random genRand;
int[] ruleta;
List<int> listaCiudades = new List<int>();
/* Inicializamos el arreglo que tendra las distancia entre las 23 ciudades,
* y tambin las dems variables de instancia.
*
* Siendo la lista de ciudades:
* 1-Crdoba, 2-Corrientes, 3-Formosa, 4-La Plata, 5-La Rioja,
* 6-Mendoza, 7-Neuqun, 8-Paran, 9-Posadas, 10-Rawson,
* 11-Resistencia, 12-Ro Gallegos, 13-S.F.d.V.d. Catamarca,
* 14-S.M. de Tucumn, 15-S.S. de Jujuy, 16-Salta, 17-San Juan,
* 18-San Luis, 19-Santa Fe, 20-Santa Rosa, 21-Sgo. Del Estero,
* 22-Ushuaia, 23-Viedma.
*
* Ejemplo: distancia[1,2]=667 (Distancia que hay entre Crdoba y Corrientes es
de 667 kilmetros)
*/
public Genetico()
{
poblacion = new int[50,23];
hijos = new int[50, 23];
genRand = new Random();
recorrido = new int[50];
fitness = new double[50];
padres = new int[25, 2];
ruleta = new int[100];
#region cargar arreglo de distancias
distancia[1, 2] = 667;
distancia[1, 3] = 824;
distancia[1, 4] = 968;
51
distancia[1,
distancia[1,
distancia[1,
distancia[1,
distancia[1,
distancia[1,
distancia[1,
distancia[1,
distancia[1,
distancia[1,
distancia[1,
distancia[1,
distancia[1,
distancia[1,
distancia[1,
distancia[1,
distancia[1,
distancia[1,
distancia[1,
5] = 340;
6] = 466;
7] = 907;
8] = 348;
9] = 919;
10] = 1321;
11] = 669;
12] = 2281;
13] = 362;
14] = 517;
15] = 809;
16] = 745;
17] = 412;
18] = 293;
19] = 330;
20] = 577;
21] = 401;
22] = 2618;
23] = 1047;
distancia[2,
distancia[2,
distancia[2,
distancia[2,
distancia[2,
distancia[2,
distancia[2,
distancia[2,
distancia[2,
distancia[2,
distancia[2,
distancia[2,
distancia[2,
distancia[2,
distancia[2,
distancia[2,
distancia[2,
distancia[2,
distancia[2,
distancia[2,
distancia[2,
3] = 157;
4] = 830;
5] = 814;
6] = 1131;
7] = 1534;
8] = 500;
9] = 291;
10] = 1845;
11] = 13;
12] = 2819;
13] = 691;
14] = 633;
15] = 742;
16] = 719;
17] = 1039;
18] = 969;
19] = 498;
20] = 1136;
21] = 535;
22] = 3131;
23] = 1527;
distancia[3,
distancia[3,
distancia[3,
distancia[3,
distancia[3,
distancia[3,
distancia[3,
distancia[3,
distancia[3,
distancia[3,
distancia[3,
distancia[3,
distancia[3,
distancia[3,
distancia[3,
distancia[3,
distancia[3,
distancia[3,
distancia[3,
distancia[3,
4] = 968;
5] = 927;
6] = 1269;
7] = 1690;
8] = 656;
9] = 263;
10] = 1999;
11] = 161;
12] = 2974;
13] = 793;
14] = 703;
15] = 750;
16] = 741;
17] = 1169;
18] = 1117;
19] = 654;
20] = 1293;
21] = 629;
22] = 3284;
23] = 1681;
distancia[4, 5] = 1038;
52
distancia[4,
distancia[4,
distancia[4,
distancia[4,
distancia[4,
distancia[4,
distancia[4,
distancia[4,
distancia[4,
distancia[4,
distancia[4,
distancia[4,
distancia[4,
distancia[4,
distancia[4,
distancia[4,
distancia[4,
distancia[4,
6] = 1029;
7] = 1005;
8] = 427;
9] = 857;
10] = 1116;
11] = 833;
12] = 2064;
13] = 1030;
14] = 1132;
15] = 1385;
16] = 1333;
17] = 1053;
18] = 795;
19] = 444;
20] = 602;
21] = 991;
22] = 2350;
23] = 789;
distancia[5,
distancia[5,
distancia[5,
distancia[5,
distancia[5,
distancia[5,
distancia[5,
distancia[5,
distancia[5,
distancia[5,
distancia[5,
distancia[5,
distancia[5,
distancia[5,
distancia[5,
distancia[5,
distancia[5,
distancia[5,
6] = 427;
7] = 1063;
8] = 659;
9] = 1098;
10] = 1548;
11] = 802;
12] = 2473;
13] = 149;
14] = 330;
15] = 600;
16] = 533;
17] = 283;
18] = 435;
19] = 640;
20] = 834;
21] = 311;
22] = 2821;
23] = 1311;
distancia[6,
distancia[6,
distancia[6,
distancia[6,
distancia[6,
distancia[6,
distancia[6,
distancia[6,
distancia[6,
distancia[6,
distancia[6,
distancia[6,
distancia[6,
distancia[6,
distancia[6,
distancia[6,
distancia[6,
7] = 676;
8] = 790;
9] = 1384;
10] = 1201;
11] = 1121;
12] = 2081;
13] = 569;
14] = 756;
15] = 1023;
16] = 957;
17] = 152;
18] = 235;
19] = 775;
20] = 586;
21] = 713;
22] = 2435;
23] = 1019;
distancia[7,
distancia[7,
distancia[7,
distancia[7,
distancia[7,
distancia[7,
distancia[7,
distancia[7,
8] = 1053;
9] = 1709;
10] = 543;
11] = 1529;
12] = 1410;
13] = 1182;
14] = 1370;
15] = 1658;
53
distancia[7,
distancia[7,
distancia[7,
distancia[7,
distancia[7,
distancia[7,
distancia[7,
distancia[7,
16]
17]
18]
19]
20]
21]
22]
23]
=
=
=
=
=
=
=
=
1591;
824;
643;
1049;
422;
1286;
1762;
479;
distancia[8,
distancia[8,
distancia[8,
distancia[8,
distancia[8,
distancia[8,
distancia[8,
distancia[8,
distancia[8,
distancia[8,
distancia[8,
distancia[8,
distancia[8,
distancia[8,
distancia[8,
9] = 658;
10] = 1345;
11] = 498;
12] = 2320;
13] = 622;
14] = 707;
15] = 959;
16] = 906;
17] = 757;
18] = 574;
19] = 19;
20] = 642;
21] = 566;
22] = 2635;
23] = 1030;
distancia[9,
distancia[9,
distancia[9,
distancia[9,
distancia[9,
distancia[9,
distancia[9,
distancia[9,
distancia[9,
distancia[9,
distancia[9,
distancia[9,
distancia[9,
distancia[9,
10]
11]
12]
13]
14]
15]
16]
17]
18]
19]
20]
21]
22]
23]
=
=
=
=
=
=
=
=
=
=
=
=
=
=
1951;
305;
2914;
980;
924;
1007;
992;
1306;
1200;
664;
1293;
827;
3207;
1624;
distancia[10,
distancia[10,
distancia[10,
distancia[10,
distancia[10,
distancia[10,
distancia[10,
distancia[10,
distancia[10,
distancia[10,
distancia[10,
distancia[10,
distancia[10,
11]
12]
13]
14]
15]
16]
17]
18]
19]
20]
21]
22]
23]
=
=
=
=
=
=
=
=
=
=
=
=
=
1843;
975;
1647;
1827;
2120;
2054;
1340;
1113;
1349;
745;
1721;
1300;
327;
distancia[11,
distancia[11,
distancia[11,
distancia[11,
distancia[11,
distancia[11,
distancia[11,
distancia[11,
distancia[11,
distancia[11,
12]
13]
14]
15]
16]
17]
18]
19]
20]
21]
=
=
=
=
=
=
=
=
=
=
2818;
678;
620;
729;
706;
1029;
961;
495;
1132;
523;
54
13]
14]
15]
16]
17]
18]
19]
20]
21]
22]
23]
=
=
=
=
=
=
=
=
=
=
=
2587;
2773;
3063;
2997;
2231;
2046;
2325;
1712;
2677;
359;
1294;
distancia[13,
distancia[13,
distancia[13,
distancia[13,
distancia[13,
distancia[13,
distancia[13,
distancia[13,
distancia[13,
distancia[13,
14]
15]
16]
17]
18]
19]
20]
21]
22]
23]
=
=
=
=
=
=
=
=
=
=
189;
477;
410;
430;
540;
602;
915;
166;
2931;
1391;
distancia[14,
distancia[14,
distancia[14,
distancia[14,
distancia[14,
distancia[14,
distancia[14,
distancia[14,
distancia[14,
15]
16]
17]
18]
19]
20]
21]
22]
23]
=
=
=
=
=
=
=
=
=
293;
228;
612;
727;
689;
1088;
141;
3116;
1562;
distancia[15,
distancia[15,
distancia[15,
distancia[15,
distancia[15,
distancia[15,
distancia[15,
distancia[15,
16]
17]
18]
19]
20]
21]
22]
23]
=
=
=
=
=
=
=
=
67;
874;
1017;
942;
1382;
414;
3408;
1855;
distancia[16,
distancia[16,
distancia[16,
distancia[16,
distancia[16,
distancia[16,
distancia[16,
17]
18]
19]
20]
21]
22]
23]
=
=
=
=
=
=
=
808;
950;
889;
1316;
353;
3341;
1790;
distancia[17,
distancia[17,
distancia[17,
distancia[17,
distancia[17,
distancia[17,
18]
19]
20]
21]
22]
23]
=
=
=
=
=
=
284;
740;
686;
583;
2585;
1141;
distancia[18,
distancia[18,
distancia[18,
distancia[18,
19]
20]
21]
22]
=
=
=
=
560;
412;
643;
2392;
55
20]
21]
22]
23]
=
=
=
=
641;
547;
2641;
1035;
56
57
{
hijos[i * 2 , w] = poblacion[padres[i, 0], w];
hijos[(i * 2) +1, w] = poblacion[padres[i, 1], w];
}
}
else
{
bool[] usados1 = new bool[23];
bool[] usados2 = new bool[23];
for (int k = 0; k < 23; k++)
{
usados1[k] = false;
usados2[k] = false;
}
usados1[0] = true;
usados2[0] = true;
int aBuscar1, aBuscar2;
hijos[i * 2, 0] = poblacion[padres[i, 0], 0];
hijos[(i * 2) +1, 0] = poblacion[padres[i, 1], 0];
aBuscar1 = poblacion[padres[i, 1], 0];
aBuscar2 = poblacion[padres[i, 0], 0];
int b1, b2;
bool continuar = true;
do
{
b1 = 1;
bool encontrado = false;
do
{
if (aBuscar1 == poblacion[padres[i, 0], b1])
{
encontrado = true;
}
b1++;
} while (!encontrado);
if (!usados1[b1])
{
hijos[i * 2, b1] = aBuscar1;
usados1[b1] = true;
aBuscar1 = poblacion[padres[i, 1], b1];
}
else continuar = false;
} while (continuar);
continuar = true;
do
{
b2 = 1;
bool encontrado = false;
do
{
if (aBuscar2 == poblacion[padres[i, 1], b2])
{
encontrado = true;
}
b2++;
} while (!encontrado);
if (!usados2[b2])
{
hijos[(i * 2) +1, b2] = aBuscar2;
usados2[b2] = true;
aBuscar2 = poblacion[padres[i, 0], b2];
}
else continuar = false;
} while (continuar);
58
59
60