Index: find_line_indep.c =================================================================== --- find_line_indep.c (revision 7402) +++ find_line_indep.c (revision 7403) @@ -12,10 +12,16 @@ #define DUMPDIR "/tmp/gpstroke/" + +/* +#define OPTIMIZE_FROM 5000 +#define COOL_PERIOD 2000 +*/ + +#define ITERATIONS 21000 #define STROKE_PENALTY 1000 -#define OPTIMIZE_FROM 2000 -#define MAX_TH 5 -#define MIN_TH 1 +#define MAX_TH 1 +#define MIN_TH 5 #define MAX_STROKES 64 int max_strokes = 16; @@ -148,12 +154,12 @@ static inline void pcb_mutate_chg(pcb_t *p) { int idx = myrand(0, p->len-1); - int fld = myrand(0, 3); + int fld = myrand(0, 5); int dirx = (rand() % 3) - 1; int diry = (rand() % 3) - 1; int dir = (rand() % 2) ? 1 : -1; + int tmp; - switch(fld) { case 0: tune(p->str[idx].x1, 0, ref->sx, dirx); @@ -165,6 +171,16 @@ break; case 2: tune(p->str[idx].th, MIN_TH, MAX_TH, dir); break; case 3: rand_stroke(&p->str[idx]); break; + case 4: + tmp = p->str[idx].x1; + p->str[idx].x1 = p->str[idx].x2; + p->str[idx].x2 = tmp; + break; + case 5: + tmp = p->str[idx].y1; + p->str[idx].y1 = p->str[idx].y2; + p->str[idx].y2 = tmp; + break; } } @@ -183,7 +199,6 @@ return; /* merge the closest points */ - dst[0] = dist2(p->str[idx1], 1, p->str[idx2], 1); dst[1] = dist2(p->str[idx1], 1, p->str[idx2], 2); dst[2] = dist2(p->str[idx1], 2, p->str[idx2], 1); @@ -206,11 +221,11 @@ p->str[idx1].x2 = p->str[idx2].x2; p->str[idx1].y2 = p->str[idx2].y2; break; - case 3: + case 2: p->str[idx1].x1 = p->str[idx2].x1; p->str[idx1].y1 = p->str[idx2].y1; break; - case 4: + case 3: p->str[idx1].x1 = p->str[idx2].x2; p->str[idx1].y1 = p->str[idx2].y2; break; @@ -249,10 +264,12 @@ gp_setup(&pop); - for(n = 0; n < 10000; n++) { - if ((n >= OPTIMIZE_FROM) && ((n % 1000) == 0)) { - stroke_penalty /= 2; + for(n = 0; n < ITERATIONS; n++) { +#ifdef OPTIMIZE_FROM + if ((n >= OPTIMIZE_FROM) && ((n % COOL_PERIOD) == 0)) { + stroke_penalty *= 1.1; } +#endif gp_iterate(&pop); if ((pop.pop_cnt % 20) == 0) gp_dump(stdout, &pop, 1);