Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
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);
}