示例#1
0
void calculaTeta()
{
	defineRange(0,105); //trabalha apenas com ~60% dos casos de teste
	int count = 0;
	double ultimo_erro = 1.0, primeiro_erro = 0.0;

	printf("Modelo:\nteta0 + teta1*x1 + teta2*x2 + ... + teta13*x13\n\nResultados esperados para h(x):\n1, 2 ou 3\n\n");

	//pega valor do erro inicial
	gradiente();
	count++;
	confereErro(&ultimo_erro, count);
	primeiro_erro = ultimo_erro;
	printf("Erro inicial = %f\n", primeiro_erro);
	gradiente();
	count++;

	printf("Calculando, por favor aguarde!\n\n");

	//loop para achar os tetas
	while(confereErro(&ultimo_erro, count) == 1)
	{
		gradiente();
		count++;
	}

	//adiciona valores de teta a teta.txt
	guardaTeta(ultimo_erro, count);

	//caso erro = 0.03 nao seja possivel, imprime erro inicial e menor erro encontrado
	if(confereErro(&ultimo_erro, count) == 2)
		printf("Erro inicial = %f\tErro minimo encontrado = %f\n",primeiro_erro, ultimo_erro);

	//valores finais de teta e numero de passos
	printf("teta0 = %f\tteta1 = %f\tteta2 = %f\tteta3 = %f\nteta4 = %f\tteta5 = %f\tteta6 = %f\nteta7 = %f\tteta8 = %f\tteta9 = %f\nteta10 = %f\tteta11 = %f\tteta12 = %f\nteta13 = %f\n", teta[0], teta[1], teta[2], teta[3], teta[4], teta[5], teta[6], teta[7], teta[8], teta[9], teta[10], teta[11], teta[12], teta[13]);
	printf("numero de passos: %d\n", count);

	system("pause");
}
示例#2
0
文件: main.cpp 项目: Marian0/ICFich
int main() {
    //inicializacion de semilla
    srand( (unsigned) std::time(NULL));

    //Leemos los valores de configuracion
    float           probabilidad_cruza      = utils::strToFloat(config.getValue("cruza"));
    float           probabilidad_mutacion   = utils::strToFloat(config.getValue("mutacion"));
    unsigned int    tamanio_poblacion       = utils::strToInt(config.getValue("tamanio_poblacion"));
    unsigned int    variables_fenotipo      = utils::strToInt(config.getValue("variables_fenotipo"));
    unsigned int    cantidad_generaciones   = utils::strToInt(config.getValue("cantidad_generaciones"));
    unsigned int    cantidad_genes          = utils::strToInt(config.getValue("cantidad_genes"));
    float           escala                  = utils::strToFloat(config.getValue("escala"));
    unsigned int    elitismo                = utils::strToInt(config.getValue("elitismo"));
    unsigned int    id_funcion_fitness      = utils::strToInt(config.getValue("id_funcion_fitness"));
    std::string     forma_seleccion         = config.getValue("forma_seleccion");
    float           error                   = utils::strToFloat(config.getValue("error"));
    unsigned int    brecha_generacional     = utils::strToInt(config.getValue("brecha_generacional"));
    unsigned int    k_competencia           = utils::strToInt(config.getValue("k_competencia"));
    float           fitness_deseado         = utils::strToFloat(config.getValue("fitness_deseado"));

    std::cout<<"Bienvenidos al Ejercicio 1\n";
    std::cout<<"Tamanio de poblacion = "<<tamanio_poblacion<<'\n';
    std::cout<<"Metodo de seleccion = "<<forma_seleccion<<'\n';
    std::cout<<"Probabilidad Cruza = "<<probabilidad_cruza<<'\n';
    std::cout<<"Probabilidad Mutacion = "<<probabilidad_mutacion<<'\n';
    std::cout<<"Elitismo = "<<elitismo<<'\n';

    unsigned int metodo_seleccion;
    if(forma_seleccion.compare("ruleta") == 0)
        metodo_seleccion = AlgoritmoGenetico::SELECCION_RULETA;
    else if(forma_seleccion.compare("ventanas") == 0)
        metodo_seleccion = AlgoritmoGenetico::SELECCION_VENTANAS;
    else if(forma_seleccion.compare("competencia") == 0)
        metodo_seleccion = AlgoritmoGenetico::SELECCION_COMPETENCIA;
    else
        std::cout<<"Metodo de seleccion no definido\n";




    //Instanciamos el algoritmo genetico
    AlgoritmoGenetico AG (tamanio_poblacion, cantidad_genes, escala, variables_fenotipo, cantidad_generaciones,
                          probabilidad_cruza, probabilidad_mutacion, elitismo, brecha_generacional,
                          id_funcion_fitness, metodo_seleccion, k_competencia);

    //Definimos vectores para graficación
    std::vector<float> mejor_fitness, prom_fitness, peor_fitness;

    //Guardo el mejor fitness de la poblacion
    mejor_fitness.push_back(AG.getMejorFitness());

    //Calculo y guardo el fitness promedio de la poblacion
    std::vector<float> vector_tmp_fitness;
    AG.getFitness(vector_tmp_fitness);
    prom_fitness.push_back(utils::promedio(vector_tmp_fitness));

    //Guardo el Peor fitness de la poblacion
    peor_fitness.push_back(AG.getPeorFitness());
    float mejor_fitness_actual = 10.0;
    unsigned int w;
    for (w = 0; w < cantidad_generaciones; w++) {
        AG.reproduccion();

        mejor_fitness_actual = AG.evaluar();
        std::cout<<"Mejor fitness a iteracion "<<w<<" = "<<mejor_fitness_actual<<'\n';

        //Guardo el mejor fitness de la poblacion
        mejor_fitness.push_back(AG.getMejorFitness());
        //Calculo y guardo el fitness promedio de la poblacion
        std::vector<float> vector_tmp_fitness;
        AG.getFitness(vector_tmp_fitness);
        prom_fitness.push_back(utils::promedio(vector_tmp_fitness));
        //Guardo el Peor fitness de la poblacion
        peor_fitness.push_back(AG.getPeorFitness());


        //Criterio de finalización
        if (mejor_fitness_actual > fitness_deseado) {
            break;
        }
    }

    std::cout<<"Se termino luego de "<<w<<" generaciones.\nEl fitness logrado es de "<<mejor_fitness.back()<<'\n';

    AG.imprimirResumen();
    std::vector<bool> respuesta;

    AG.getMejorGenotipo(respuesta);

    if(id_funcion_fitness == 1 or id_funcion_fitness == 2)
        std::cout<<"\nSolucion = "<<utils::binary2int(respuesta)/escala;
    if(id_funcion_fitness == 3) {
        std::vector<int> soluciones;
        utils::vectorBinary2Int(respuesta,soluciones, 18);
        std::cout<<"\nSoluciones = ";
        for (unsigned int i = 0; i < soluciones.size(); i++)
            std::cout<<soluciones[i]/escala<<' ';

    }
    std::cout<<" con fitness = "<<mejor_fitness_actual<<'\n';

    //Vector de vector para graficacion
    std::vector<std::vector<float> > grafica;
    grafica.push_back(mejor_fitness);
    grafica.push_back(prom_fitness);
    grafica.push_back(peor_fitness);
    GNUPlot plotter;

    utils::drawHistory(grafica, plotter, id_funcion_fitness);

    std::cout<<"\nFin del Algoritmo Genetico. Ahora se realizara el metodo de gradiente desciendiente\n";

    getwchar();

    //Gradiente
    std::vector<float> x_ini;
    switch(id_funcion_fitness){
    case 1: { //ejercicio 1a
        x_ini.push_back(359.0);
        break;
    }
    case 2: { //ejercicio 1b
        x_ini.push_back(2.0);
        break;
    }
    case 3: { //ejercicio 1c
        x_ini.push_back(0.1);
        x_ini.push_back(0.1);
        break;
    }
    }
    std::cout<<"Gradiente inicializado en "; utils::printVector((x_ini));
    //float tasa_inicial = 0.1; //tasa para 1a
    //float tasa_inicial = 0.01; //tasa para 1b
    float tasa_inicial = 0.01; //tasa para 1c

    float criterio_error = 0.0001;
    unsigned int maxit = 300;

    Gradiente gradiente(tasa_inicial, x_ini, id_funcion_fitness, criterio_error, maxit);

    unsigned int iteraciones;
    iteraciones = gradiente.descender();
    std::vector<float> solucion_segun_gradiente = gradiente.getSolucion();

    std::cout<<"\nGradiente descendiente:\nIteraciones = "<<iteraciones;
    std::cout<<"\nSolucion del gradiente = "; utils::printVector(solucion_segun_gradiente);



    getwchar();
    return 0;
}