Esempio n. 1
0
void main(){

  FILE *fichero;
  int N, S, X; 
  int distancia[PLACES+1][PLACES+1]; 
  int RnU [PLACES+1][COL]; 
  solution_step sol[PLACES+2];
  int visited[PLACES+2];

  int variante, estrategia;
  int i, j; 


  fichero = fopen(INPUTFILE, "r");
    
  /*Lectura de datos */
  fscanf(fichero, "N\t%d\n", &N); 
  fscanf(fichero, "S\t%d\n", &S); 
  fscanf(fichero, "X\t%d\n", &X); 
  
  /*Lectura del array de distancias*/
  for(i=0; i<=PLACES; i++){
    for(j=0; j<PLACES; j++)
      fscanf(fichero, "%d\t", &distancia[i][j]); 
    fscanf(fichero, "%d\n", &distancia[i][j]); 
  }

  /*Lectura de Resources 'n Units*/

  /* Cuadramos una fila extra para que se ajusten los mismos 
   * índices en todas las tablas */
  RnU[0][0]=0; 
  RnU[0][1]=0; 
  RnU[0][2]=0; 

  for(i=1; i<=PLACES; i++)
    fscanf(fichero, "RU%d\t%d\t%d\n", &RnU[i][0], &RnU[i][1], &RnU[i][2]); 

  fclose(fichero); 
  printf("Datos:\n"); 
  /*Mostramos datos */
  printf("N: %d\n", N); 
  printf("S: %d\n", S); 
  printf("X: %d\n", X); 
  printf("Distancias:\n"); 
  /*Distancias */  
  for(i=0; i<=PLACES; i++){
    for(j=0; j<PLACES; j++)
      printf("%d\t", distancia[i][j]); 
    printf("%d\n", distancia[i][j]); 
  }
  printf("Recursos y Unidades:\n"); 
  /*Recursos y Unidades */
  for(i=1; i<=PLACES; i++){
    for(j=0; j<(COL -1); j++)
      printf("%d\t", RnU[i][j]); 
    printf("%d\n", RnU[i][j]); 
  }

  /*Inicializamos la estructura */
  sol[CAMP].S = S; 
  /* - Día */
  sol[CAMP].day=0; 

  /* - Posición */
  sol[CAMP].position = CAMP; 

  /* - Unidades */
  sol[CAMP].units = 0; 

  /* - Oro obtenido */
  sol[CAMP].g_obtained = 0; 

  /* - Oro gastado */
  sol[CAMP].g_spent = 0; 

  /* - Balance (oro total) */
  sol[CAMP].balance = X; 

  /* - Visitados */

  visited[0]=TRUE; 

  for(i=1; i<PLACES+1; i++)
    visited[i]=FALSE; 

  /*Fin estructura */

  do{
    printf("\n==========="); 
    printf("\nSeleccione:"); 
    printf("\n==========="); 
    printf("\n1. Variante 1\n2. Variante 2\n3. Variante 3\n=>"); 
    scanf("%d", &variante); 
    if((variante<=0) || (variante >3))
      printf("Error: Introduzca un valor [1, 3]\n"); 
  }while((variante<=0) || (variante >3));

  do{
    printf("\n==========="); 
    printf("\nSeleccione:"); 
    printf("\n==========="); 
    printf("\n1. Algoritmo voraz \n2. Backtracking \n3. Prog. Dinamica \n=>"); 
    scanf("%d", &estrategia); 
    if((estrategia<=0) || (estrategia >3))
      printf("Error: Introduzca un valor [1, 3]\n"); 
  }while((estrategia<=0) || (estrategia >3));

  if(estrategia == 1)
    voraz(distancia, RnU, visited, variante, sol); 
  else if(estrategia == 2)
    back(distancia, RnU, visited, variante, sol, INITIAL_STEP); 
  else if (estrategia == 3)
    progdin(distancia, RnU, visited, variante, sol); 

}
Esempio n. 2
0
int main(int argc, char ** argv) 
{
     int ** tablero;
     int dimension;
     char * fichero;
     int filini;
     int colini;
     int algoritmo;
     int tipo_salida;
     par * s;
     int peso;
     int aux; 
     crono c; 

     /* argumentos, alguna primera idea!!!!
      *
      * camino [opciones] fichero
      * -f fila
      * -c columna
      * -[vdb] voraz dinamica backtraking
      * -n N
      * -[am] all info, o minima informacion por pantalla
      *  fichero
      *  
      *  Todos obligatorios! luego tenemos 8 argumentos más el nombre del
      *  programa, tambien damos la opcion a la particula --help
      *  */
     
     if (argc != 10) {
	  return pinta_ayuda();
     }
     
     for (aux = 1; aux < 10; aux++) {
	  if (strcmp(argv[aux], "-f") == 0) {
	       aux++;
	       filini = atoi(argv[aux]);
	  }
	  else if (strcmp(argv[aux], "-c") == 0) {
	       aux++;
	       colini = atoi(argv[aux]);
	  }
	  else if (strcmp(argv[aux], "-n") == 0) {
	       aux++;
	       dimension = atoi(argv[aux]);
	  }
	  else if (strcmp(argv[aux], "-v") == 0) {
	       algoritmo = VORAZ;
	  }
	  else if (strcmp(argv[aux], "-vm") == 0) {
	       algoritmo = VORAZMEJORADO;
	  }
	  else if (strcmp(argv[aux], "-d") == 0) {
	       algoritmo = DINAMICA;
	  }
	  else if (strcmp(argv[aux], "-b") == 0) {
	       algoritmo = BT;
	  }	  
	  else if (strcmp(argv[aux], "-a") == 0) {
	       tipo_salida = ALLINFO;
	  }	  
	  else if (strcmp(argv[aux], "-m") == 0) {
	       tipo_salida = MINIMO;
	  }
	  else {
	       fichero = argv[aux];
	  }
     }
     
     /* aunque no tratemos todas las situaciones, por lo menos hacemos una
      * pequeña comprobacion*/
     if ((filini > dimension) || (colini > dimension)) {
	  fprintf(stderr, "Fila o columna erroneas: fuera del rango\n");
	  return -1;
     }

     tablero = leer_tablero(fichero, dimension);

     if (tablero == NULL) {
	  fprintf(stderr, "ERROR obteniendo el tablero.\n");
	  return -1;
     }
     
     /* reservamos la memoria para s! */
     s = (par *)malloc(MAXNIVEL*sizeof(par));
   
    /* y aplicamos el algoritmo segun la entrada */ 
    switch (algoritmo) {
	  
	 case VORAZ:
	       start_crono(&c);
	       if (voraz(tablero, dimension, filini, colini,&peso, s) == -1) {
		    printf("%d No hay solucion\n", dimension);
		    stop_crono(&c);
		    return -1;
	       }
	       stop_crono(&c);
	       break;
	   
	 case VORAZMEJORADO:
	       start_crono(&c);
	       if (voraz_mejorado(tablero, dimension, filini,
						  colini, &peso, s) == -1) {
		    printf("%d No hay solucion\n", dimension);
		    stop_crono(&c);
		    return -1;
	       }
	       stop_crono(&c);
	       break;
	  
	  case DINAMICA:
	       start_crono(&c);
	       dinamica(tablero, dimension, filini, colini, &peso, s);
	       stop_crono(&c);
	       break;

	  case BT:
	       start_crono(&c);
	       bt(tablero, dimension, filini, colini, &peso, s);
	       stop_crono(&c);
	       break;
	
	  default:
	       ;
     }
    
     if (tipo_salida == ALLINFO) { 
	  pinta_solucion(s, peso, algoritmo, dimension, c);
     }
     else {
	  pinta_solucion_minima(dimension, algoritmo, c);
     }
     
     return 0;
}