Implement time limit

master
Alinson S. Xavier 11 years ago
parent f5e15f1385
commit 1711695e19

@ -127,6 +127,7 @@ static int BNC_solve_node(struct BNC *bnc, int depth)
abort_if(rval, "LP_get_obj_val failed"); abort_if(rval, "LP_get_obj_val failed");
if(depth == 1) ROOT_VALUE = objval; 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) if (ceil(objval) > *best_val + LP_EPSILON)
{ {

@ -89,7 +89,7 @@ int add_comb_cut(
// } // }
#if LOG_LEVEL >= LOG_LEVEL_DEBUG #if LOG_LEVEL >= LOG_LEVEL_DEBUG
log_debug("Generated cut:\n"); log_verbose("Generated cut:\n");
if (OPTIMAL_X) if (OPTIMAL_X)
{ {
for (int i = 0; i < nz; i++) for (int i = 0; i < nz; i++)
@ -99,17 +99,17 @@ int add_comb_cut(
if (rmatind[i] >= node_count) if (rmatind[i] >= node_count)
{ {
struct Edge *e = &graph->edges[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, rmatind[i], e->from->index, e->to->index,
OPTIMAL_X[rmatind[i]]); OPTIMAL_X[rmatind[i]]);
} }
else 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]]); OPTIMAL_X[rmatind[i]]);
} }
} }
log_debug(" %c %.2lf\n", sense, rhs); log_verbose(" %c %.2lf\n", sense, rhs);
} }
#endif #endif
@ -118,7 +118,7 @@ int add_comb_cut(
double sum = 0; double sum = 0;
for (int i = 0; i < nz; i++) for (int i = 0; i < nz; i++)
sum += rmatval[i] * OPTIMAL_X[rmatind[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"); 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++) for (int i = 0; i < nz; i++)
lhs += rmatval[i] * x[rmatind[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) if (lhs + LP_EPSILON > rhs)
{ {
@ -426,11 +426,11 @@ int find_comb_cuts(struct LP *lp, struct GTSP *data)
&tooth_count); &tooth_count);
abort_if(rval, "find_teeth failed"); 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++) for (int j = 0; j < cluster_count; j++)
{ {
if (teeth[j] < 0) continue; 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) if (tooth_count % 2 == 0)

@ -245,6 +245,7 @@ int GTSP_add_cutting_planes(struct LP *lp, struct GTSP *data)
} }
current_round++; current_round++;
abort_if(get_current_time() - INITIAL_TIME >= MAX_TOTAL_TIME, "time limit exceeded");
int original_cut_pool_size; int original_cut_pool_size;
int added_cuts_count; 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); log_info("Writting solution to file %s\n", filename);
rval = GTSP_write_solution(data, filename, x); rval = GTSP_write_solution(data, filename, x);
abort_if(rval, "GTSP_write_solution failed"); abort_if(rval, "GTSP_write_solution failed");
rval = build_tour_from_x(data,tour,x); rval = build_tour_from_x(data,tour,x);
abort_if(rval, "build_tour_from_x failed"); abort_if(rval, "build_tour_from_x failed");

@ -30,6 +30,7 @@ int SUBTOUR_NODE_CLUSTER_COUNT = 0;
int SUBTOUR_NODE_NODE_COUNT = 0; int SUBTOUR_NODE_NODE_COUNT = 0;
int COMBS_COUNT = 0; int COMBS_COUNT = 0;
double INITIAL_TIME = 0;
static const struct option options_tab[] = { static const struct option options_tab[] = {
{"help", no_argument, 0, 'h'}, {"tsp", no_argument, 0, 't'}, {"help", no_argument, 0, 'h'}, {"tsp", no_argument, 0, 't'},

@ -22,6 +22,7 @@ extern long CUT_POOL_MAX_MEMORY;
extern int FLOW_MAX_FLOW_COUNT; extern int FLOW_MAX_FLOW_COUNT;
extern double TOTAL_TIME; extern double TOTAL_TIME;
extern double INITIAL_TIME;
extern double ROOT_VALUE; extern double ROOT_VALUE;
extern int SUBTOUR_CLUSTER_CLUSTER_COUNT; extern int SUBTOUR_CLUSTER_CLUSTER_COUNT;

@ -10,6 +10,8 @@
#define ENABLE_COMB_INEQUALITIES #define ENABLE_COMB_INEQUALITIES
#define MAX_TOTAL_TIME 3600
//#define ALLOW_FRACTIONAL_SOLUTIONS //#define ALLOW_FRACTIONAL_SOLUTIONS
#endif //PROJECT_PARAMS_H #endif //PROJECT_PARAMS_H

@ -3,6 +3,7 @@
#include <stdarg.h> #include <stdarg.h>
#include <time.h> #include <time.h>
#include "util.h" #include "util.h"
#include "main.h"
double get_current_time() double get_current_time()
{ {
@ -19,8 +20,6 @@ double get_real_time()
return (double) time (0); return (double) time (0);
} }
static double INITIAL_TIME = 0;
void time_printf(const char *fmt, ...) void time_printf(const char *fmt, ...)
{ {
if (INITIAL_TIME == 0) if (INITIAL_TIME == 0)