static void surrelax(allinfo *a) { register item *i, *j, *m; item *f, *l, *b; ntype n, card1, card2, b1; stype u, minsur, maxsur, wsum; itype minw, maxp, maxw; long t1, t2; /* copy table */ give_time(&t1); relaxations++; n = DIFF(a->fitem, a->litem); f = palloc(n, sizeof(item)); l = f + n - 1; minw = a->fitem->w; maxp = maxw = wsum = 0; for (j = f, i = a->fitem, m = l+1; j != m; i++, j++) { *j = *i; wsum += i->w; if (i->w < minw) minw = i->w; if (i->w > maxw) maxw = i->w; if (i->p > maxp) maxp = i->p; } /* find cardinality */ b = a->b; b1 = DIFF(a->fitem, b-1); card1 = minweights(f, l, a->c) - f; /* sum_{j=1}^{n} x_{j} \leq card1 */ card2 = maxprofits(f, l, a->z) - f+1; /* sum_{j=1}^{n} x_{j} \geq card2 */ /* delimiters on sur.multipliers */ maxsur = maxw; /* should ideally be: maxp*maxp, but may cause overflow */ minsur = -maxw; /* should ideally be: -maxp*maxw, but may cause overflow */ /* choose strategy */ u = 0; for (;;) { if (card2 == b1+1) { solvesur(a, f, l, minsur, 0, b1+1, &u); /* min card constr */ if (u < a->z) u = a->z; /* since bound for IMPROVED solution */ break; } if (card1 == b1 ) { solvesur(a, f, l, 0, maxsur, b1, &u); /* max card constr */ break; } if (card1 == b1+1) { /* dichothomy: card <= b1 or card >= b1+1 */ solvesur(a, f, l, minsur, 0, b1+1, &u); solvesur(a, f, l, 0, maxsur, b1, &u); break; } if (card2 == b1 ) { /* dichothomy: card <= b1 or card >= b1+1 */ solvesur(a, f, l, 0, maxsur, b1, &u); solvesur(a, f, l, minsur, 0, b1+1, &u); break; } u = a->dantzig; break; } if (u < a->ub) a->ub = u; pfree(f); give_time(&t2); reltime = t2 - t1; }
double test(Probleme<Alignement> &pb) { double debut = give_time(); for (int i = 0; i < nbReplicCoutClient; ++i) pb.getCoutAffectationClient(Hasard::generateurUniforme(0, nbClients - 1, getNextValue), Hasard::generateurUniforme(0, nbUsines - 1, getNextValue)); for (int i = 0; i < nbReplicCoutUsine; ++i) pb.getCoutConstructionUsine(Hasard::generateurUniforme(0, nbUsines - 1, getNextValue)); double fin = give_time(); return (fin - debut) * 1000; }
void RT_secondOrder(Pnum* m,Pnum* velocity,unsigned nb_row, unsigned nb_col, unsigned* f, unsigned nb_points_front){ printf("Algorithm Rouy-Tourin : problem %d x %d with finite difference second order\n",nb_row,nb_col); FILE *ft = gnudata_open("time_so"); FILE *fiter = gnudata_open("iter_so"); double time_start = give_time(), time_end = 0; Pnum* m_0 = (Pnum*) malloc(nb_col*nb_row*sizeof(Pnum)); //Initialisation des noeuds int i,j; for (i = 0; i<nb_row; i++) { for (j = 0; j<nb_col; j++) { m_0[ind(nb_col,i,j)] = INF; } } //Initialisation des noeuds sources for (i = 0; i<2*nb_points_front; i+=2) { m_0[ind(nb_col,f[i], f[i+1])] = 0.0; } int s = 0, fi = 0, nb_iter = 0, convergence = 1; do{ convergence = 1; copie(m_0, m, nb_row, nb_col); for (i = 0; i<nb_row; i++) { for (j = 0; j<nb_col; j++) { if (isInObstacle(velocity, nb_col, i,j)){ m_0[ind(nb_col, i, j)] = INF; continue; } Pnum x_m1 = (i-1 >= 0) ? m[ind(nb_col, i-1, j)] : INF; Pnum x_m2 = (i-2 >= 0) ? m[ind(nb_col, i-2, j)] : INF; Pnum x_p1 = (i+1 < nb_col) ? m[ind(nb_col, i+1, j)] : INF; Pnum x_p2 = (i+2 < nb_col) ? m[ind(nb_col, i+2, j)] : INF; Pnum y_m1 = (j-1 >= 0) ? m[ind(nb_col, i, j-1)] : INF; Pnum y_m2 = (j-2 >= 0) ? m[ind(nb_col, i, j-2)] : INF; Pnum y_p1 = (j+1 < nb_row) ? m[ind(nb_col, i, j+1)] : INF; Pnum y_p2 = (j+2 < nb_row) ? m[ind(nb_col, i, j+2)] : INF; Pnum sol, Tx, Ty, Tx_m , Tx_p, Ty_m, Ty_p, f; f = velocity[ind(nb_col, i, j)]; if (x_p2 < INF && x_m2 < INF && y_m2 < INF && y_p2 < INF ){ s++; Tx_m = fmaxf((4*x_m1-x_m2)/3.0, 0); Tx_p = fminf((4*x_p1-x_p2)/3.0, 0); Ty_m = fmaxf((4*y_m1-y_m2)/3.0, 0); Ty_p = fminf((4*y_p1-y_p2)/3.0, 0); sol = solveEquation_2(Tx_m,Tx_p, Ty_m, Ty_p, h, f); }else{ fi++; Tx = fminf(x_m1, x_p1); Ty = fminf(y_m1, y_p1); sol = solveEquation_1(Tx,Ty,h,f); } Pnum sol_min = fminf(m[ind(nb_col, i, j)],sol); m_0[ind(nb_col, i, j)] = sol_min; convergence = convergence && (fabsf( m[ind(nb_col,i, j)] - m_0[ind(nb_col, i, j)] ) <= epsilon); } } nb_iter++; } while (!convergence); time_end = give_time(); dput_xy(ft, nb_row, time_end-time_start); dput_xy(fiter, nb_row, nb_iter); calculDistance(2,m, nb_col/2, nb_row/2, nb_row, nb_col); free(m_0); printf("%d itérations\n",nb_iter); printf("TIME : %f sec\n\n",time_end-time_start); }
void RT_firstOrder(Pnum* m,Pnum* velocity,unsigned nb_row, unsigned nb_col, unsigned* f, unsigned nb_points_front){ printf("Algorithm Rouy-Tourin : problem %d x %d with finite difference fisrt order\n",nb_row,nb_col); FILE *ft = gnudata_open("time_fo"); FILE *fiter = gnudata_open("iter_fo"); double time_start = give_time(), time_end = 0; Pnum* m_0 = (Pnum*) malloc(nb_col*nb_row*sizeof(Pnum)); //Initialisation des noeuds int i,j,nb_iter = 0,convergence = 1; for (i = 0; i<nb_row; i++) { for (j = 0; j<nb_col; j++) { m_0[ind(nb_col,i,j)] = INF; } } //Initialisation des noeuds sources for (i = 0; i<2*nb_points_front; i+=2) { m_0[ind(nb_col,f[i], f[i+1])] = 0.0; } do{ convergence = 1; copie(m_0, m, nb_row, nb_col); for (i = 0; i<nb_row; i++) { for (j = 0; j<nb_col; j++) { if (isInObstacle(velocity, nb_col, i,j)){ m_0[ind(nb_col, i, j)] = INF; continue; } Pnum x_m1 = (i-1 >= 0) ? m[ind(nb_col, i-1, j)] : INF; Pnum x_p1 = (i+1 < nb_col) ? m[ind(nb_col, i+1, j)] : INF; Pnum y_m1 = (j-1 >= 0) ? m[ind(nb_col, i, j-1)] : INF; Pnum y_p1 = (j+1 < nb_row) ? m[ind(nb_col, i, j+1)] : INF; Pnum Tx = fminf(x_m1, x_p1); Pnum Ty = fminf(y_m1, y_p1); Pnum f = velocity[ind(nb_col, i, j)]; Pnum sol = solveEquation_1(Tx,Ty,h,f); Pnum sol_min = fminf(m[ind(nb_col, i, j)],sol); m_0[ind(nb_col, i, j)] = sol_min; convergence = convergence && (fabsf( m[ind(nb_col,i, j)] - m_0[ind(nb_col, i, j)] ) <= epsilon); } } if (PRINT) { printf("\n----\n"); print_matrice(m, nb_row, nb_col); } nb_iter++; } while (!convergence); time_end = give_time(); dput_xy(ft, nb_row, time_end-time_start); dput_xy(fiter, nb_row, nb_iter); calculDistance(1,m, nb_col/2, nb_row/2, nb_row, nb_col); free(m_0); printf("%d itérations\n",nb_iter); printf("TIME : %f sec\n\n",time_end-time_start); }