Algoritmia - Algoritmo Genético

 
Vista:
sin imagen de perfil
Val: 1
Ha aumentado su posición en 24 puestos en Algoritmia (en relación al último mes)
Gráfica de Algoritmia

Algoritmo Genético

Publicado por Cristian (1 intervención) el 09/11/2018 18:29:32
Por favor, ayuda.
Necesito hacer un algoritmo genetico que haga lo siguiente:
Se tiene una cantidad de dinero y se tiene que determinar la mejor opción de compra de acciones para tener la mayor ganacia posible.
Las acciones son los genes. Yo uso 3 genes, es decir tres acciones.
Además, el número de acciones que se pueden comprar debe estar limitado.
Aquí está el código que llevo hasta ahora, no sé qué hacer :(

Individuo.java


1
2
3
4
public class Individuo {
    public int[] cromosoma;
    public float peso;
}

Prueba4.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
public class Prueba4 {
 
    static int compeco, compbanco, compebanbo;
    public static void main(String[] args) {
        //Scanner s = new Scanner(System.in);
        int iTamPoblacion = 10;
        int iCantGenes = 3;
        int iValorObjetivo = 200;
 
        Individuo[] poblacion = new Individuo[iTamPoblacion];
 
        GenerarPobliacion(poblacion, iTamPoblacion, iCantGenes);
        MostrarPoblacion(poblacion);
 
        int iPosIndividuoOptimo = EvaluacionPoblacion(poblacion, iValorObjetivo);
        System.out.println("------------------");
 
        MostrarPoblacion(poblacion);
 
        int iGeneraciones = 0;
 
        while (iPosIndividuoOptimo < 0) {
            iGeneraciones++;
            OrdenarPoblacion(poblacion);
            System.out.println("------------------");
            MostrarPoblacion(poblacion);
 
            System.out.println("------------------");
            Individuo[] hijos = CruzarPoblacion(poblacion, 1);
            MostrarPoblacion(hijos);
 
            System.out.println("------------------");
            Mutar(hijos);
            MostrarPoblacion(hijos);
 
            InsertarHijos(poblacion, hijos);
 
            iPosIndividuoOptimo = EvaluacionPoblacion(poblacion, iValorObjetivo);
            System.out.println("------------------");
 
            MostrarPoblacion(poblacion);
 
            //Console.ReadLine();
        }
 
        System.out.println("Tardó : " + iGeneraciones + " generaciones");
 
    }
 
    private static void Mutar(Individuo[] hijos) {
        int iPosGen = (int) Math.floor((Math.random() * 2));
        hijos[0].cromosoma[iPosGen] = hijos[0].cromosoma[iPosGen];
        iPosGen = (int) (Math.random() * 2);
        hijos[1].cromosoma[iPosGen] = hijos[1].cromosoma[iPosGen];
    }
 
    private static void InsertarHijos(Individuo[] poblacion, Individuo[] hijos) {
        poblacion[poblacion.length - 2] = hijos[0];
        poblacion[poblacion.length - 1] = hijos[1];
    }
 
    private static Individuo[] CruzarPoblacion(Individuo[] poblacion, int PuntoCruce) {
        Individuo h1 = new Individuo();
        Individuo h2 = new Individuo();
        h1.cromosoma = new int[poblacion[0].cromosoma.length];
        h2.cromosoma = new int[poblacion[0].cromosoma.length];
 
        for (int i = 0; i < PuntoCruce; i++) {
            h1.cromosoma[i] = poblacion[0].cromosoma[i];
            h2.cromosoma[i] = poblacion[1].cromosoma[i];
 
            h1.cromosoma[i + PuntoCruce] = poblacion[1].cromosoma[i + PuntoCruce];
            h2.cromosoma[i + PuntoCruce] = poblacion[0].cromosoma[i + PuntoCruce];
        }
 
        return new Individuo[]{h1, h2};
    }
 
    private static void OrdenarPoblacion(Individuo[] poblacion) {
        for (int i = 0; i < poblacion.length - 1; i++) {
            Individuo aux;
            for (int j = i + 1; j < poblacion.length; j++) {
                if (poblacion[i].peso < poblacion[j].peso) {
                    aux = poblacion[i];
                    poblacion[i] = poblacion[j];
                    poblacion[j] = aux;
                }
            }
        }
    }
 
    private static int EvaluacionPoblacion(Individuo[] poblacion, int iValorObjetivo) {
        for (int i = 0; i < poblacion.length; i++) { //De 0 hasta la longitud de la población
            int iValor = 0;
            for (int j = 0; j < poblacion[i].cromosoma.length; j++) { // De 0 hasta el individuo n con cromosoma n
                if (poblacion[i].cromosoma[j] == 0) {
                    compeco = 14;
 
                }
                if (poblacion[i].cromosoma[j] == 1) {
                    compbanco = 15;
                }
                if (poblacion[i].cromosoma[j] == 2) {
                    compebanbo = 16;
                }
 
                iValor += (int) Math.pow(2, j);
 
                System.out.println(iValor+compeco);
                System.out.println(compbanco);
                System.out.println(compebanbo);
            }
 
            poblacion[i].peso = (float) iValor / iValorObjetivo;
 
            if (iValor > iValorObjetivo) {
                poblacion[i].peso = (float) iValorObjetivo / iValor;
            }
 
            if (poblacion[i].peso == 1) {
                return i;
            }
        }
 
        return -1;
    }
 
    private static void MostrarPoblacion(Individuo[] poblacion) {
        for (int i = 0; i < poblacion.length; i++) { // Desde 0 hasta la longitud de la población
            String sCromosoma = ""; // Creamos un String vacio para almacenar el gen
            for (int j = 0; j < poblacion[i].cromosoma.length; j++) { // De 0 hasra el individio n con longitud de cromosoma n
                if (poblacion[i].cromosoma[j] == 0) {
                    sCromosoma += "1";
                }
                if (poblacion[i].cromosoma[j] == 1) {
                    sCromosoma += "2";
                }
                if (poblacion[i].cromosoma[j] == 2) {
                    sCromosoma += "3";
                }
            }
            System.out.println(sCromosoma + " con valor: " + poblacion[i].peso);
        }
    }
 
    private static void GenerarPobliacion(Individuo[] poblacion, int iTamPoblacion, int iCantGenes) {
        for (int i = 0; i < iTamPoblacion; i++) { //0 hasta el tamaño de la población
            Individuo ind = new Individuo(); // Se llama la clase Individuo
            ind.cromosoma = new int[iCantGenes]; // Se crea un cromosoma con diferentes genes
            ind.peso = 0; // Se pone el peso en 0 de cada individuo
 
            for (int j = 0; j < iCantGenes; j++) { // Desde 0 hasta la cantidad de genes
                int b = (int)(Math.floor(Math.random() * 3)); // Crear genes aleatoriamente 1 hasta 3
                ind.cromosoma[j] = b; //Asignar los genes a las posiciones
            }
            poblacion[i] = ind; // Al individuo se le van a asignar los genes y el peso
        }
    }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder