diff --git a/src/branch_and_cut.c b/src/branch_and_cut.c index 33890cc..98cf80b 100644 --- a/src/branch_and_cut.c +++ b/src/branch_and_cut.c @@ -127,6 +127,7 @@ static int BNC_solve_node(struct BNC *bnc, int depth) abort_if(rval, "LP_get_obj_val failed"); if(depth == 1) ROOT_VALUE = objval; + abort_if(get_current_time() - INITIAL_TIME >= MAX_TOTAL_TIME, "time limit exceeded"); if (ceil(objval) > *best_val + LP_EPSILON) { diff --git a/src/gtsp-comb.c b/src/gtsp-comb.c index 3d00dfa..104de26 100644 --- a/src/gtsp-comb.c +++ b/src/gtsp-comb.c @@ -89,7 +89,7 @@ int add_comb_cut( // } #if LOG_LEVEL >= LOG_LEVEL_DEBUG - log_debug("Generated cut:\n"); + log_verbose("Generated cut:\n"); if (OPTIMAL_X) { for (int i = 0; i < nz; i++) @@ -99,17 +99,17 @@ int add_comb_cut( if (rmatind[i] >= node_count) { struct Edge *e = &graph->edges[rmatind[i] - node_count]; - log_debug(" %.2lf x%d (%d %d %.4lf)\n", rmatval[i], + log_verbose(" %.2lf x%d (%d %d %.4lf)\n", rmatval[i], rmatind[i], e->from->index, e->to->index, OPTIMAL_X[rmatind[i]]); } else { - log_debug(" %.2lf x%d (%.4lf)\n", rmatval[i], rmatind[i], + log_verbose(" %.2lf x%d (%.4lf)\n", rmatval[i], rmatind[i], OPTIMAL_X[rmatind[i]]); } } - log_debug(" %c %.2lf\n", sense, rhs); + log_verbose(" %c %.2lf\n", sense, rhs); } #endif @@ -118,7 +118,7 @@ int add_comb_cut( double sum = 0; for (int i = 0; i < nz; i++) sum += rmatval[i] * OPTIMAL_X[rmatind[i]]; - log_debug("%.2lf >= %.2lf\n", sum, rhs); + log_verbose("%.2lf >= %.2lf\n", sum, rhs); abort_if(sum <= rhs - LP_EPSILON, "cannot add invalid cut"); } @@ -126,7 +126,7 @@ int add_comb_cut( for (int i = 0; i < nz; i++) lhs += rmatval[i] * x[rmatind[i]]; - log_debug("Violation: %.4lf >= %.4lf\n", lhs, rhs); + log_verbose("Violation: %.4lf >= %.4lf\n", lhs, rhs); if (lhs + LP_EPSILON > rhs) { @@ -426,11 +426,11 @@ int find_comb_cuts(struct LP *lp, struct GTSP *data) &tooth_count); abort_if(rval, "find_teeth failed"); - log_debug("Component %d has %d teeth:\n", i, tooth_count); + log_verbose("Component %d has %d teeth:\n", i, tooth_count); for (int j = 0; j < cluster_count; j++) { if (teeth[j] < 0) continue; - log_debug(" %d %d\n", j, teeth[j]); + log_verbose(" %d %d\n", j, teeth[j]); } if (tooth_count % 2 == 0) diff --git a/src/gtsp.c b/src/gtsp.c index 6594238..89aab0f 100644 --- a/src/gtsp.c +++ b/src/gtsp.c @@ -245,6 +245,7 @@ int GTSP_add_cutting_planes(struct LP *lp, struct GTSP *data) } current_round++; + abort_if(get_current_time() - INITIAL_TIME >= MAX_TOTAL_TIME, "time limit exceeded"); int original_cut_pool_size; int added_cuts_count; @@ -510,8 +511,7 @@ int GTSP_solution_found(struct BNC *bnc, struct GTSP *data, double *x) log_info("Writting solution to file %s\n", filename); rval = GTSP_write_solution(data, filename, x); abort_if(rval, "GTSP_write_solution failed"); - - + rval = build_tour_from_x(data,tour,x); abort_if(rval, "build_tour_from_x failed"); diff --git a/src/main.c b/src/main.c index 06bc73f..b5dafbc 100644 --- a/src/main.c +++ b/src/main.c @@ -30,6 +30,7 @@ int SUBTOUR_NODE_CLUSTER_COUNT = 0; int SUBTOUR_NODE_NODE_COUNT = 0; int COMBS_COUNT = 0; +double INITIAL_TIME = 0; static const struct option options_tab[] = { {"help", no_argument, 0, 'h'}, {"tsp", no_argument, 0, 't'}, diff --git a/src/main.h b/src/main.h index 9430cf0..7a084b9 100644 --- a/src/main.h +++ b/src/main.h @@ -22,6 +22,7 @@ extern long CUT_POOL_MAX_MEMORY; extern int FLOW_MAX_FLOW_COUNT; extern double TOTAL_TIME; +extern double INITIAL_TIME; extern double ROOT_VALUE; extern int SUBTOUR_CLUSTER_CLUSTER_COUNT; diff --git a/src/params.h b/src/params.h index c4b2bc8..3a763bb 100644 --- a/src/params.h +++ b/src/params.h @@ -10,6 +10,8 @@ #define ENABLE_COMB_INEQUALITIES +#define MAX_TOTAL_TIME 3600 + //#define ALLOW_FRACTIONAL_SOLUTIONS #endif //PROJECT_PARAMS_H diff --git a/src/util.c b/src/util.c index fd15596..761ebcf 100644 --- a/src/util.c +++ b/src/util.c @@ -3,6 +3,7 @@ #include #include #include "util.h" +#include "main.h" double get_current_time() { @@ -19,8 +20,6 @@ double get_real_time() return (double) time (0); } -static double INITIAL_TIME = 0; - void time_printf(const char *fmt, ...) { if (INITIAL_TIME == 0)