X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=matchsticks-search.git;a=blobdiff_plain;f=main.c;h=93dc7ebe5325269db8fda05f5fe954a081489ed3;hp=b248631b7b819329ffb8b186cad2030e086f1189;hb=a7a2c255e61d14619fce2e4af2eeee1d2ed6d870;hpb=8953c0d75a973d1d0b011890904246f687a8b1e5 diff --git a/main.c b/main.c index b248631..93dc7eb 100644 --- a/main.c +++ b/main.c @@ -58,7 +58,8 @@ * * We search all possible adjacency matrices, and for each one we run * GLPK's simplex solver. We represent the adjacency matrix as an - * array of bitmaps. + * array of bitmaps: one word per input stick, with one bit per output + * stick. * * However, there are a couple of wrinkles: * @@ -76,7 +77,7 @@ * nondecreasing in array order. * * Once we have a solution, we also avoid considering any candidate - * which involves dividing one of the output sticks into so many + * which involves dividing one of the input sticks into so many * fragment that the smallest fragment would necessarily be no bigger * than our best solution. That is, we reject candidates where any of * the hamming weights of the adjacency bitmap words are too large. @@ -101,7 +102,7 @@ static double best; static glp_prob *best_prob; static AdjWord *best_adjmatrix; -static int n_over_best; +static int n_max_frags, m_max_frags; static int *weight; static unsigned printcounter; @@ -119,7 +120,18 @@ static void progress_eol(void) { static void set_best(double new_best) { best = new_best; - n_over_best = floor(n / best); + /* + * When computing n_max_frags, we want to set a value that will skip + * anything that won't provide strictly better solutions. So we + * want + * frags < n / best + * _ _ + * <=> frags < | n / best | + * _ _ + * <=> frags <= | n / best | - 1 + */ + n_max_frags = ceil(n / best) - 1; + m_max_frags = ceil(m / best) - 1; } /*----- multicore support -----*/ @@ -355,7 +367,8 @@ static void prep(void) { glp_term_out(GLP_OFF); setlinebuf(stderr); weight = calloc(sizeof(*weight), m); assert(weight); - n_over_best = INT_MAX; + n_max_frags = INT_MAX; + m_max_frags = INT_MAX; } #if 0 @@ -377,8 +390,7 @@ static int count_set_adj_bits(AdjWord w) { static int totalfrags; static bool maxhamweight_ok(void) { - double maxminsize = (double)m / maxhamweight; - return maxminsize > best; + return maxhamweight <= m_max_frags; } static bool preconsider_ok(int nwords, bool doprint) { @@ -390,8 +402,7 @@ static bool preconsider_ok(int nwords, bool doprint) { for (i=0, totalfrags=0; i m_max_frags) { PRINTF(" too fine"); goto out; } @@ -502,7 +513,7 @@ static void optimise(bool doprint) { glp_set_obj_coef(prob, X_minimum, 1); for (i=0; i= n_over_best) + if (weight[j] >= n_max_frags) goto takeout; iterate_recurse(i+1, adjmatrix[i]);