示例#1
0
void nextPopulation(Individual **population, int populationSize)
{
	int i;	
	int nullCount = 0;
	int indA, indB;
	int mutationCount = 0;
	int* nullIndexes = (int*) malloc(sizeof(int) * populationSize);
	
	if (!nullIndexes)
	{
		printf("Memory allocation failed.\n");
		return;
	}

	// Selecting the individuals that will be moved to the next population.
	// This will be done based only in probability.
	for (i = 0; i < populationSize; ++i)
	{		
		// Individuals with good fitness have more probability to be selected.
		if (rand() % WORST_FITNESS < -(population[i]->fitness))
		{
			free(population[i]->solution);
			free(population[i]);
			population[i] = NULL;
			nullIndexes[nullCount++] = i;
		}
	}
	
	for (i = 0; i < nullCount; ++i)
	{
		do
		{
			indA = rand() % populationSize;			
		} while(population[indA] == NULL);
		
		do
		{
			indB = rand() % populationSize;			
		} while(population[indB] == NULL || indA == indB);
		
		population[nullIndexes[i]] = crossover(population[indA], population[indB]);
	}
	
	for (i = 0; i < populationSize; ++i)
	{
		if (rand() % 1000 < 5)
		{
			mutation(population[i]);
			++mutationCount;
		}
	}
	
	if (verboseMode)
	{
		printf("copied: %d born: %d mutation: %.2f%% best: ", populationSize - nullCount, nullCount, (double) mutationCount / populationSize * 100);
		printIndividual(population[0]);
	}

	free(nullIndexes);
}
示例#2
0
int main(int argc, char * argv[]){
    Population * pop, * selected;
    Individual * best_solution;
    int generation_num;
    
    initParameters(argc, argv);
    pop = genSeededPopulation(POP_SIZE);
    
#if (defined DIVERSITY)
    printGeneComposition(pop);
#endif

    determineFitness(pop);
    sortByFitness(pop);

    generation_num = 0;
    while(generation_num < MAX_NUM_GENERATIONS){
        
    #if  (defined VERBOSE || defined DIVERSITY)
        fprintf(stdout, "\n-----------------   GENERATION %d   -----------------\n", generation_num + 1);
        printPopulation(pop);
    #endif
        
        // FIX - use function pointers instead of flags + if statement
        if(selection_type == 1)
            selected = tournamentSelection(pop);
        else 
            selected = randomSelection(pop);
            
        // FIX - use function pointers instead of flags + if statement
        evolvePopulation(selected, crossover_type, mutation_type);
        determineFitness(selected);
        
        // FIX - use function pointers instead of flags + if statement
        if(replacement_type == 1)
            pop = replaceAll(pop, selected);
        else  
            pop = retainBest(pop, selected);

        generation_num++;
    }
    
    fprintf(stdout, "\nFINAL RESULT:\n");
    printPopulation(pop);
    
    fprintf(stdout, "\nBEST SOLUTION:\n");
    best_solution = findBest(pop);
    printIndividual(best_solution);
    
    freePopulation(pop);
    freeParameters();
    return EXIT_SUCCESS;
} 
示例#3
0
int main (int argc, char *argv[])
{
    int len;
    EIBConnection *eibcon;
    eibaddr_t eibdest;
    eibaddr_t eibsrc;
    uchar eibbuf[200];
    int tmpeibval;
    int sw_verbose = -1;

    FILE *fh_cfg_file = NULL; // Файл с соответствиями KNX телеграммы <-> IPкоманды
    listGroupAddr myListGA[LENGTH_OF_LIST_OF_GADDR];
    eibaddr_t testga;
    int index_gaddr;  // index for group address array
    char *parsed_cfg_str; // Будет равна LENGTH_OF_CMD_STR
    char mcom[] = "next\n";
    int size_of_list_gaddr;	// real length of list of group address - counting due to read

    if (argc < 3)
        die ("usage: %s Url(ip:localhost:6720) file(with list of cmd)", argv[0]);
//Prepare KNX connection
    if (argc > 3)
        sw_verbose = strncmp(argv[3], "--v", 3); // Выводить сообщения в stdout если присутствует ключ --v
    else
        sw_verbose = 1;
    eibcon = EIBSocketURL (argv[1]);
    if (!eibcon)
        die ("Open failed");
    if (EIBOpen_GroupSocket (eibcon, 0) == -1)
        die ("Connect failed");

//Fill array from file
    if((fh_cfg_file = fopen(argv[2], "r")) == NULL)
        die ("Error Open file with list of group address");
// Читаем командные строки из конфигурационного файла и заполняем массив структур myListGA
    index_gaddr = 0;
    parsed_cfg_str = (char*)malloc(LENGTH_OF_CMD_STR * sizeof(char));
    while(fgets(parsed_cfg_str, LENGTH_OF_CMD_STR, fh_cfg_file) != NULL) {
        // Здесь парсим строку
        convert_str_to_myListGA(parsed_cfg_str, myListGA, index_gaddr);
        index_gaddr++;
        if(index_gaddr == LENGTH_OF_LIST_OF_GADDR)
            break;
    }
    free(parsed_cfg_str);

    size_of_list_gaddr=index_gaddr;	// real number of monitoring group address
    if(sw_verbose == 0) {
        for(index_gaddr=0; index_gaddr != size_of_list_gaddr; index_gaddr++)
            printf("Result N:%d -> %s - %d - %s - %d - %s - %X\n", index_gaddr, myListGA[index_gaddr].group_addr,\
                   myListGA[index_gaddr].value, myListGA[index_gaddr].send_to_ip, myListGA[index_gaddr].send_to_port,\
                   myListGA[index_gaddr].cmd_string, myListGA[index_gaddr].group_addr_in_hex);
    }
    fclose(fh_cfg_file);

    while (1) {
        len = EIBGetGroup_Src (eibcon, sizeof (eibbuf), eibbuf, &eibsrc, &eibdest);
        if (len == -1)
            die ("Read failed");
        if (len < 2)
            die ("Invalid Packet");
        if ((eibbuf[0] & 0x3) || (eibbuf[1] & 0xC0) == 0xC0) {
            if(sw_verbose == 0) {
                printf ("Unknown APDU from ");
                printIndividual (eibsrc);
                printf (" to ");
                printGroup (eibdest);
                printf (": ");
                printHex (len, eibbuf);
                printf ("\n");
            }
        }
        else {
            if(sw_verbose == 0) {
                switch (eibbuf[1] & 0xC0) {
                case 0x00:
                    printf ("Read");
                    break;
                case 0x40:
                    printf ("Response");
                    break;
                case 0x80:
                    printf ("Write");
                    break;
                }
                printf (" from ");
                printIndividual (eibsrc);
                printf (" to ");
                printGroup (eibdest);
                if (eibbuf[1] & 0xC0) {
                    printf (": ");
                    if (len == 2) {
                        printf ("%02X", eibbuf[1] & 0x3F);
                    }
                    else
                        printHex (len - 2, eibbuf + 2);
                }
                printf(" Destination in HEX is ->  %X ", eibdest);
            }

            tmpeibval = eibbuf[1] & 0x3F;
            for(index_gaddr=0; index_gaddr != size_of_list_gaddr; index_gaddr++) {
                if((myListGA[index_gaddr].group_addr_in_hex == eibdest) && (myListGA[index_gaddr].value == tmpeibval)) {
                    if(sw_verbose == 0) {
                        printf("\n Caught command => %s \n", myListGA[index_gaddr].cmd_string);
                    }
                    mpdControl(myListGA[index_gaddr].cmd_string, myListGA[index_gaddr].send_to_ip, myListGA[index_gaddr].send_to_port, sw_verbose);
                }
            }
            fflush (stdout);
        }
    }
    EIBClose (eibcon);
    return 0;
}
示例#4
0
文件: p1_main.c 项目: syzhou/p1
int main() {
	struct Ordered_container* people;
	struct Ordered_container* rooms;
	people = OC_create_container((OC_comp_fp_t)comparePeople);
	rooms = OC_create_container((OC_comp_fp_t)compareRooms);
	while (1) {
		char cmd1;
		char cmd2;
		printf("\nEnter command: ");
		scanf(" %c", &cmd1);
		scanf("%c", &cmd2);
		switch (cmd1) {
		case 'p':
			switch (cmd2) {
			case 'i':
				printIndividual(people);
				break;
			case 'r':
				printRoom(rooms);
				break;
			case 'm':
				printMeeting(rooms);
				break;
			case 's':
				printSchedule(rooms);
				break;
			case 'g':
				printGroup(people);
				break;
			default:
				printErrUnrecCmd();
				break;
			}
			break;
		case 'a':
			switch (cmd2) {
			case 'i':
				addIndividual(people);
				break;
			case 'r':
				addRoom(rooms);
				break;
			case 'm':
				addMeeting(rooms);
				break;
			case 'p':
				addParticipant(rooms, people);
				break;
			default:
				printErrUnrecCmd();
				break;
			}
			break;
		case 'r':
			switch (cmd2) {
			case 'm':
				rescheduleMeeting(rooms);
				break;
			default:
				printErrUnrecCmd();
				break;
			}
			break;
		case 'd':
			switch (cmd2) {
			case 'i':
				deleteIndividual(people, rooms);
				break;
			case 'r':
				deleteRoom(rooms);
				break;
			case 'm':
				deleteMeeting(rooms);
				break;
			case 'p':
				deleteParticipant(rooms, people);
				break;
			case 's':
				deleteSchedule(rooms);
				break;
			case 'g':
				deleteGroup(rooms, people);
				break;
			case 'a':
				deleteAll(rooms, people);
				break;
			default:
				printErrUnrecCmd();
				break;
			}
			break;
		case 's':
			break;
		case 'l':
			break;
		case 'q':
			switch (cmd2) {
			case 'q' :
				printf("All meetings deleted\n");
				printf("All rooms deleted\n");
				printf("All persons deleted\n");
				printf("Done\n");
				return 0;
				break;
			default:
				printErrUnrecCmd();
				break;
			}
			break;
		default:
			printErrUnrecCmd();
			break;
		}
	}
	return 0;
}
示例#5
0
int main(int argc, char** argv)
{
	int i, j;
	Individual **population;
	int individualCount;
	int numSteps;	
	int maxSolutions = 1;
	
	srand(time(NULL));
	
	if (argc < 4)
	{
		printf("\n\nInvalid parameters. Use: %s N_QUEENS POPULATION_SIZE STEPS MAX_SOLUTIONS\n\n", argv[0]);
		return 0;
	}
		
	nQueens			= atoi(argv[1]);
	individualCount = atoi(argv[2]);
	numSteps		= atoi(argv[3]);
	
	if (argc > 4)
	{
		maxSolutions = atoi(argv[4]);
	}

	if (argc > 5)
	{
		if (!strcmp("-v", argv[5]))
			verboseMode = 1;
	}
	
	if (nQueens % 2)
	{
		printf("\nNUM_QUEENS must be an even number.\n");
		return 0;
	}
	
	printf("-----------------------------------------------\n");
	printf("Solving %d queens problem.\n", nQueens);
	printf("Population size: %d\n", individualCount);
	printf("Max number of generation(s): %d\n", numSteps);
	printf("Will stop after finding %d solution(s)\n", maxSolutions);
	printf("-----------------------------------------------\n");
		
	population = (Individual**) malloc (sizeof(Individual*) * individualCount);
	
	for (i = 0; i < individualCount; ++i)
	{
		population[i] = createIndividual();		
	}
	
	for (i = 0; i < numSteps; ++i)
	{		
		qsort(population, individualCount, sizeof(Individual*), compareIndividuals);						
		
		j = 0;
		while (population[j]->fitness == 0)
			++j;
		
		if (j >= maxSolutions)
		{		
			printf("Population #%d.\n", i + 1);
			j = 0;
			while (population[j]->fitness == 0 && j < maxSolutions)
			{
				printf("Solution %d: ", j + 1);
				printIndividual(population[j++]);
			}				
			break;
		}
		if (verboseMode)
		{
			printf("Building population %d: ", i);
		}
		nextPopulation(population, individualCount);		
	}
	
	printf("\n");
	
	for (i = 0; i < individualCount; ++i)
	{
		free(population[i]->solution);
		free(population[i]);
	}
	
	free(population);
	return 0;
}
示例#6
0
文件: tspgen.c 项目: helderm/tspgen
int main(int argc, char **argv){
	tspsMap_t map;
    tspsConfig_t config;
    tspsPopulation_t population;

    unsigned long int numGenerations = 0;
    int mpiNumProcs = 0;
    double start, end;

    //starting MPI directives
    MPI_Init(NULL,NULL);
    MPI_Comm_size(MPI_COMM_WORLD,&mpiNumProcs);
    MPI_Comm_rank(MPI_COMM_WORLD,&mpiId);

    logg("* Starting tspgen...\n");

    // parse the command line args
    if(readConfig(&config, argc, argv) != TSPS_RC_SUCCESS){
        return TSPS_RC_FAILURE;
    }

    // parse the map
    logg("* Parsing map...\n");
    if(parseMap(&map) != TSPS_RC_SUCCESS){
        logg("Error! Unable to read map 'maps/brazil58.tsp'!\n");
        return TSPS_RC_FAILURE;
    }

    // initialize random seed:
    srand ( time(NULL)*mpiId );

    logg("* Generating population...\n");
    if(generatePopulation(&population, &config) != TSPS_RC_SUCCESS){
        logg("Error! Failed to create a new random population!");
        return TSPS_RC_FAILURE;
    }

    // start a timer (mpi_barrier + mpi_wtime)
    MPI_Barrier(MPI_COMM_WORLD);
    start = MPI_Wtime();

    logg("* Initializing reproduction loop...\n");
    while(1){

        numGenerations++;

        calculateFitnessPopulation(&population, &map);

        if(numGenerations % 500 == 0){
            logg("- Generation %d...\n", numGenerations);
            printIndividual(&population.individuals[0], "Current Top Individual");
        }

        sortPopulation(&population);

        if(config.numGenerations > 0 && numGenerations == config.numGenerations){
            logg("* Max number of generations [%d] reached!\n", config.numGenerations);
            break;
        }

        crossoverPopulation(&population,  &config);

        mutatePopulation(&population, &config);

        // migrate population at every n generation
        if(numGenerations % config.migrationRate == 0){
            migrateIndividuals(&population, mpiId, mpiNumProcs, &config);
        }
    }

    // join all the populations
    joinPopulations(&population, mpiId, mpiNumProcs);
    sortPopulation(&population);

    // get the best inidividual and print it
    printIndividual(&population.individuals[0], "Top Individual");
    printIndividual(&population.individuals[config.populationSize-1], "Worst (of the top ones) Individual");

    // stop the timer
    MPI_Barrier(MPI_COMM_WORLD); /* IMPORTANT */
    end = MPI_Wtime();

    if(mpiId == 0) { /* use time on master node */
        printf("* Runtime = %f\n", end-start);
    }

    logg("* tspgen finished!\n");
    free(population.individuals);
    free(map.nodes);
    MPI_Finalize();

    return TSPS_RC_SUCCESS;
}