⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 acotsp.c

📁 蚁群算法的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/* AAAA    CCCC   OOOO   TTTTTT   SSSSS  PPPPP AA  AA  CC     OO  OO    TT    SS      PP  PP AAAAAA  CC     OO  OO    TT     SSSS   PPPPP AA  AA  CC     OO  OO    TT        SS  PP AA  AA   CCCC   OOOO     TT    SSSSS   PP   ######################################################  ##########    ACO algorithms for the TSP    ##########  ######################################################     Version: 1.0   File:    main.c   Author:  Thomas Stuetzle   Purpose: main routines and control for the ACO algorithms   Check:   README and gpl.txt   Copyright (C) 2002  Thomas Stuetzle*//*************************************************************************** Program's name: acotsp   Ant Colony Optimization algorithms (AS, ACS, EAS, RAS, MMAS, BWAS) for the   symmetric TSP      Copyright (C) 2004  Thomas Stuetzle       This program is free software; you can redistribute it and/or modify    it under the terms of the GNU General Public License as published by    the Free Software Foundation; either version 2 of the License, or    (at your option) any later version.		 This program is distributed in the hope that it will be useful,	 but WITHOUT ANY WARRANTY; without even the implied warranty of	 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the	 GNU General Public License for more details.	 	  You should have received a copy of the GNU General Public License	  along with this program; if not, write to the Free Software	  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA	  	   email: stuetzle no@spam informatik.tu-darmstadt.de	   mail address: Universitaet Darmstadt	   Fachbereich Informatik	   Hochschulstr. 10	   D-64283 Darmstadt	   Germany	   ***************************************************************************/#include <stdio.h>#include <math.h>#include <limits.h>#include <assert.h>#include <string.h>#include <stdlib.h>#include <time.h>#include "ants.h"#include "utilities.h"#include "InOut.h"#include "TSP.h"#include "timer.h"#include "ls.h"long int termination_condition( void )/*    FUNCTION:       checks whether termination condition is met INPUT:          noneOUTPUT:         0 if condition is not met, number neq 0 otherwise(SIDE)EFFECTS:  none*/{	return ( ((n_tours >= max_tours) && (elapsed_time( VIRTUAL ) >= max_time)) || 		((*best_so_far_ant).tour_length <= optimal)); }void construct_solutions( void )/*    FUNCTION:       manage the solution construction phaseINPUT:          noneOUTPUT:         none(SIDE)EFFECTS:  when finished, all ants of the colony have constructed a solution  */{    long int k;        /* counter variable */    long int step;    /* counter of the number of construction steps */	    TRACE ( printf("construct solutions for all ants\n"); );	    /* Mark all cities as unvisited */    for ( k = 0 ; k < n_ants ; k++) {		ant_empty_memory( &ant[k] );    }        step = 0;     /* Place the ants on same initial city */    for ( k = 0 ; k < n_ants ; k++ )		place_ant( &ant[k], step);	    while ( step < n-1 ) {		step++;		for ( k = 0 ; k < n_ants ; k++ ) {			neighbour_choose_and_move_to_next( &ant[k], step);			if ( acs_flag )				local_acs_pheromone_update( &ant[k], step );		}    }	    step = n;    for ( k = 0 ; k < n_ants ; k++ ) {		ant[k].tour[n] = ant[k].tour[0];		ant[k].tour_length = compute_tour_length( ant[k].tour );		if ( acs_flag )			local_acs_pheromone_update( &ant[k], step );    }    n_tours += n_ants;}void init_try( long int ntry ) /*    FUNCTION: initilialize variables appropriately when starting a trialINPUT:    trial numberOUTPUT:   noneCOMMENTS: none*/{	    TRACE ( printf("INITIALIZE TRIAL\n"); );	    start_timers();    time_used = elapsed_time( VIRTUAL );    time_passed = time_used;	    fprintf(comp_report,"seed %ld\n",seed);    fflush(comp_report);    /* Initialize variables concerning statistics etc. */	    n_tours      = 1;    iteration    = 1;    restart_iteration = 1;    lambda       = 0.05;                (*best_so_far_ant).tour_length = INFTY;    found_best   = 0;	    /* Initialize the Pheromone trails, only if ACS is used, pheromones	have to be initialized differently */    if ( !(acs_flag || mmas_flag || bwas_flag) ) {		trail_0 = 1. / ( (rho) * nn_tour() );		/* in the original papers on Ant System, Elitist Ant System, and		Rank-based Ant System it is not exactly defined what the		initial value of the pheromones is. Here we set it to some		small constant, analogously as done in MAX-MIN Ant System.  		*/		init_pheromone_trails( trail_0 );    }     if ( bwas_flag ) {		trail_0 = 1. / ( (double) n * (double) nn_tour()) ;		init_pheromone_trails( trail_0 );    }     if ( mmas_flag ) {		trail_max = 1. / ( (rho) * nn_tour() );		trail_min = trail_max / ( 2. * n );		init_pheromone_trails( trail_max );       }    if ( acs_flag ) {		trail_0 = 1. / ( (double) n * (double) nn_tour( ) ) ;		init_pheromone_trails( trail_0 );    }	    /* Calculate combined information pheromone times heuristic information */    compute_total_information();        fprintf(comp_report,"begin try %li \n",ntry);    fprintf(stat_report,"begin try %li \n",ntry);}void local_search( void )/*    FUNCTION:       manage the local search phase; apply local search to ALL ants; in dependence of ls_flag one of 2-opt, 2.5-opt, and 3-opt local searchis chosen.INPUT:          noneOUTPUT:         none(SIDE)EFFECTS:  all ants of the colony have locally optimal toursCOMMENTS:       typically, best performance is obtained by applying local search to all ants. It is known that some improvements (e.g. convergence speed towards high quality solutions) may be obtained for some ACO algorithms by applying local search to only some of the ants.Overall best performance is typcially obtained by using 3-opt.*/{    long int k;	    TRACE ( printf("apply local search to all ants\n"); );	    for ( k = 0 ; k < n_ants ; k++ ) {		if ( ls_flag == 1 )			two_opt_first( ant[k].tour );    /* 2-opt local search */		else if ( ls_flag == 2 )			two_h_opt_first( ant[k].tour );  /* 2.5-opt local search */		else if ( ls_flag == 3 )			three_opt_first( ant[k].tour );  /* 3-opt local search */		else {			fprintf(stderr,"type of local search procedure not correctly specified\n");			exit(1);		}		ant[k].tour_length = compute_tour_length( ant[k].tour );    }}void update_statistics( void )/*    FUNCTION:       manage some statistical information about the trial, especiallyif a new best solution (best-so-far or restart-best) is found andadjust some parameters if a new best solution is foundINPUT:          noneOUTPUT:         none(SIDE)EFFECTS:  restart-best and best-so-far ant may be updated; trail_min and trail_max used by MMAS may be updated*/{	    long int iteration_best_ant;    double p_x; /* only used by MMAS */	    iteration_best_ant = find_best(); /* iteration_best_ant is a global variable */	    if ( ant[iteration_best_ant].tour_length < (*best_so_far_ant).tour_length ) {				time_used = elapsed_time( VIRTUAL ); /* best sol found after time_used */		copy_from_to( &ant[iteration_best_ant], best_so_far_ant );		copy_from_to( &ant[iteration_best_ant], restart_best_ant );				found_best = iteration;		restart_found_best = iteration;		found_branching = node_branching(lambda);		branching_factor = found_branching;		if ( mmas_flag ) {			if ( !ls_flag ) {				p_x = exp(log(0.05)/n); 				trail_min = 1. * (1. - p_x) / (p_x * (double)((nn_ants + 1) / 2));				trail_max = 1. / ( (rho) * (*best_so_far_ant).tour_length );				trail_0 = trail_max;				trail_min = trail_max * trail_min; 			} else {				trail_max = 1. / ( (rho) * (*best_so_far_ant).tour_length );				trail_min = trail_max / ( 2. * n );				trail_0 = trail_max;			}		}		write_report();    }    if ( ant[iteration_best_ant].tour_length < (*restart_best_ant).tour_length ) {		copy_from_to( &ant[iteration_best_ant], restart_best_ant );		restart_found_best = iteration;		printf("restart best: %ld, restart_found_best %ld, time %.2f\n",(*restart_best_ant).tour_length, restart_found_best, elapsed_time ( VIRTUAL ));     }}void search_control_and_statistics( void )/*    FUNCTION:       occasionally compute some statistics and check whether algorithm is converged INPUT:          noneOUTPUT:         none(SIDE)EFFECTS:  restart-best and best-so-far ant may be updated; trail_min and trail_max used by MMAS may be updated*/{    TRACE ( printf("SEARCH CONTROL AND STATISTICS\n"); );	    if (!(iteration % 100)) {		population_statistics();		branching_factor = node_branching(lambda);		printf("\nbest so far %ld, iteration: %ld, time %.2f, b_fac %.5f\n",(*best_so_far_ant).tour_length,iteration,elapsed_time( VIRTUAL),branching_factor);				if ( mmas_flag && (branching_factor < branch_fac) && (iteration - restart_found_best > 250) ) {		/* MAX-MIN Ant System was the first ACO algorithm to use	       pheromone trail re-initialisation as implemented		   here. Other ACO algorithms may also profit from this mechanism.			*/			printf("INIT TRAILS!!!\n"); (*restart_best_ant).tour_length = INFTY; 			init_pheromone_trails( trail_max );			compute_total_information();			restart_iteration = iteration;			restart_time = elapsed_time( VIRTUAL );		}		printf("try %li, iteration %li, b-fac %f \n\n", n_try,iteration,branching_factor);    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -