/**********************************************************************/ /* */ /* (c) Copyright, 1997 by Professor Gabriel Robins */ /* */ /* Department of Computer Science, University of Virginia */ /* Charlottesville, VA 22903-2442 (804) 982-2207 */ /* robins@cs.virginia.edu http://www.cs.virginia.edu/~robins/ */ /* */ /* This code may be freely used for all non-commercial purposes. */ /* All copies/portions of this code must contain this header. */ /* */ /**********************************************************************/ /**********************************************************************/ /* Steiner4.c */ /**********************************************************************/ #include "geometry.h" /**********************************************************************/ int num_candidates; int generate_steiner4(void) { int original_MST_cost, prior_MST_cost, pre_round_mst_cost; int s, i, j, k, heuristic_num = 4, round = 0, nsp, actual_number_of_points, SPs_this_round; FILE *fd; generate_MST2(); original_MST_cost = mst_cost; prior_MST_cost = mst_cost; actual_number_of_points = number_of_points; number_of_points++; while(YES) { num_candidates = 0; for(i=0;i= Steiner_savings[k]) { number_of_points++; SPs_this_round++; if(GRAPHICS) draw_point(SP_candidates[k].X,SP_candidates[k].Y, size+4); nsp = number_of_points - actual_number_of_points - 1; prior_MST_cost = mst_cost; } } if(SPs_this_round == 0) break; round++; number_of_points--; /* delete_useless_SPs(4, actual_number_of_points); */ number_of_points++; } number_of_points--; generate_MST2(); if(GRAPHICS == YES) draw_edges(); steiner_cost[heuristic_num] = mst_cost; improvement_percent[heuristic_num] = (original_MST_cost - steiner_cost[heuristic_num]) * 100.0 / original_MST_cost; num_steiner_pts[heuristic_num] = number_of_points - actual_number_of_points; num_N_pts[heuristic_num][num_steiner_pts[heuristic_num]] ++; ave_num_steiner_pts[heuristic_num] = ave_num_steiner_pts[heuristic_num] + num_steiner_pts[heuristic_num]; min_num_steiner_pts[heuristic_num] = min(min_num_steiner_pts[heuristic_num], num_steiner_pts[heuristic_num]); max_num_steiner_pts[heuristic_num] = max(max_num_steiner_pts[heuristic_num], num_steiner_pts[heuristic_num]); min_round = min (round, min_round); max_round = max (round, max_round); total_round = total_round + round; generate_MST2(); /* fd = fopen("ST","w"); for(j=0;j= right) return; m = (left + right) / 2; t = Steiner_savings[left]; Steiner_savings[left] = Steiner_savings[m]; Steiner_savings[m] = t; SP = SP_candidates[left]; SP_candidates[left] = SP_candidates[m]; SP_candidates[m] = SP; last = left; for(i=left+1; i <= right; i++) if (Steiner_savings[i] > Steiner_savings[left]) { ++last; t = Steiner_savings[i]; Steiner_savings[i] = Steiner_savings[last]; Steiner_savings [last] = t; SP = SP_candidates[i]; SP_candidates[i] = SP_candidates[last]; SP_candidates[last] = SP; } t = Steiner_savings[left]; Steiner_savings[left] = Steiner_savings[last]; Steiner_savings[last] = t; SP = SP_candidates[left]; SP_candidates[left] = SP_candidates[last]; SP_candidates[last] = SP; qsort_candidates(left, last - 1); qsort_candidates(last + 1, right); } /**********************************************************************/