Exemple #1
0
void compute_tactus_level(void) {
  int first_time, best_min=0, best_max=0;
  double tmin, tmax, val, best_val=0.0;

  if (verbosity > 1) {
    printf("Computing tactus level.\n");
  }

  tmin = tactus_min;
  tmax = tactus_min * tactus_width;
  for (first_time = TRUE; 
       tmax <= tactus_max; 
       tmax *= tactus_step, tmin *= tactus_step, first_time = FALSE) {

    min_pip = dquantize(tmin, 0);
    max_pip = dquantize(tmax, 0);

    create_pip_score_arrays(min_pip, max_pip);
    compute_tactus_scores();
    val = evaluate_solution(TACTUS_LEVEL, FALSE);

    if (verbosity > 1) {
	    printf("Trying tactus level range [%5d, %5d].  Score = %8.3f\n", 
             pip_time * min_pip, pip_time * max_pip, val);
    }

    if (first_time || val > best_val) {
	    best_val = val;
	    best_min = min_pip;
	    best_max = max_pip;
    }
	
    /* now print out the last row of scores */
    /*
      printf("The last row of the table:\n");
      for (i = min_pip; i<= max_pip; i++) {
	    printf("    ms = %5d    score = %7.5f\n", i*pip_time, pip_array[N_pips-1].score[nscore(i)]);
      }
    */
	
    free_pip_score_arrays();
  }

  if (first_time) {
    fprintf(stderr, 
            "%s: Can't compute tactus level, cause tactus_max is too small.\n", 
            this_program);
    exit(1);
  }

  min_pip = best_min;
  max_pip = best_max;
  create_pip_score_arrays(min_pip, max_pip);
  compute_tactus_scores();
  evaluate_solution(TACTUS_LEVEL, TRUE);
  if (verbosity > 1) print_beats(TACTUS_LEVEL);
  free_pip_score_arrays();
}
unsigned int run_adaptive_search(rectangle stock, rectangle *pieces_cut, int num_pieces_cut, int *track_solution, unsigned int local_function) {
  
  register unsigned int counter, num_solution, index_item_solution;
  unsigned int size_track_solution, pivot_index, neighbor_index, neighbor_function;
  int **neighborhood;
  int mem_solution;
  
  // Dimensão da solução
  size_track_solution = 0;
  for (counter = 0; counter < num_pieces_cut; ++counter)
    if (track_solution[counter] != -1) size_track_solution++; 
  
  // Alocando vizinhança da solução  
  neighborhood = malloc((size_track_solution - 1) * sizeof(int*));
  for (counter = 0; counter < size_track_solution - 1; ++counter)
    neighborhood[counter] = malloc(size_track_solution * sizeof(int));
  
  // Selecionando pivô para gerar vizinhança de solução
  pivot_index = rand() % size_track_solution;
  
  // Gerando vizinhança e verificando melhor solução local
  for (num_solution = 0; num_solution < size_track_solution - 1; ++num_solution) {
    
    for (index_item_solution = 0; index_item_solution < size_track_solution; ++index_item_solution) {
	neighborhood[num_solution][index_item_solution] = track_solution[index_item_solution];
    }
    
    // Executando permuta com o pivot_index
    neighbor_index = num_solution < pivot_index ? num_solution : num_solution + 1;
    mem_solution = neighborhood[num_solution][neighbor_index];
    neighborhood[num_solution][neighbor_index] = track_solution[pivot_index];
    neighborhood[num_solution][pivot_index] = mem_solution;
    
    neighbor_function = evaluate_solution(stock, pieces_cut, num_pieces_cut, neighborhood[num_solution], size_track_solution);
    
    if (neighbor_function > local_function) {
      
      local_function = neighbor_function;
      
      for (counter = 0; counter < size_track_solution; ++counter)
	track_solution[counter] = neighborhood[num_solution][counter];
      
      for (; counter < num_pieces_cut; ++counter) 
	track_solution[counter] = - 1;
    }
  }
  
  // Destruindo vizinhança da solução
  for (counter = 0; counter < size_track_solution - 1; ++counter) free(neighborhood[counter]);
  free(neighborhood);
  
  return local_function;
}
unsigned int run_grasp_metaheuristic(rectangle *pieces_cut, rectangle *stock, int num_pieces_cut) {
  
  unsigned int lcr_size, objective_function, local_solution;
  register unsigned int c_grasp_iter, c_item_solution;
  
  srand(time(NULL));
  
  // Ordenação decrescente [value/(width * length)] das peças 
  rectangle_selection_sort(pieces_cut, num_pieces_cut);
  
  lcr_size = num_pieces_cut * GRASP_LRC_PARAM;
  objective_function = local_solution = 0;
  int track_solution[num_pieces_cut], solution[num_pieces_cut];
  
  for (c_grasp_iter = 0; c_grasp_iter < GRASP_LOOP; ++c_grasp_iter) {
    
    local_solution = build_greedy_randomized_solution(pieces_cut, num_pieces_cut, *stock, lcr_size, track_solution);
    
    clean_rectangle(stock);
    reset_status_rectangles(pieces_cut, num_pieces_cut);
    
    local_solution = run_adaptive_search(*stock, pieces_cut, num_pieces_cut, track_solution, local_solution);
    
    if (local_solution > objective_function) { 
      
      objective_function = local_solution;
      
      for (c_item_solution = 0; c_item_solution < num_pieces_cut; ++c_item_solution) 
	solution[c_item_solution] = track_solution[c_item_solution];
    }
  }
  
  evaluate_solution(*stock, pieces_cut, num_pieces_cut, solution, num_pieces_cut);
  
  return objective_function;
}