Esempio n. 1
0
void DPGlobalConstraint::propagateAC(){	

    bool changed = true;
    clear();  

    //Cost thisUb;
    //thisUb = wcsp->getUb();
    for(int i = 0; i < arity(); i++){
        EnumeratedVariable * x = scope[i];
        bool first = true;
        for(EnumeratedVariable::iterator it = x->begin(); it != x->end(); ++it){            
            if(zero[i][x->toIndex(*it)]) continue;
            Result r = minCost(i, *it, changed && first);            
            if(changed && first) changed = false;
            first = false;

            Cost cost = r.first;
            /*if(cost >= thisUb || cost + wcsp->getLb() + scope[i]->getCost(*it) >= thisUb){            
			  x->remove(*it);
			  changed = true;
            }else */
            if(cost > 0){
                project(i, *it, cost);
                changed = true;
            } else if(cost < 0) {
                /* Should not happen*/
                printf("Warning: AC propagation get negative cost\n");
                extend(i, *it, -cost);
                changed = true;
            }
            if(x->canbe(*it)) record(r.second);
        }
        x->findSupport();
    }
}
Esempio n. 2
0
void DPGlobalConstraint::findSupport(int var, bool &changed){
    EnumeratedVariable * x = scope[var];
    bool first = true;
    vector<Value> remove;

    for(EnumeratedVariable::iterator it = x->begin(); it != x->end(); ++it){
        Cost cost;
        Result r = pair<Cost, Value*>(0, NULL);       
        if(zero[var][x->toIndex(*it)]){
            cost = 0;
        }else{
            r = minCost(var, *it, changed && first);
            if(changed && first) changed = false;
            first = false;
            cost = r.first;
        }      
        //deltaCost[var][x->toIndex(*it)] += x->getCost(*it);
        deltaCost[var][x->toIndex(*it)] += 	preUnaryCosts[var][x->toIndex(*it)];
        //Cost delta = cost - x->getCost(*it);
        Cost delta = cost - preUnaryCosts[var][x->toIndex(*it)];
        if(delta > 0){
            project(var, *it, delta, true); // NC will be delayed (avoid forward checking on binary/ternay cost functions)
            assert(x->canbe(*it));
        } else if (delta < 0) {
            extend(var, *it, -delta);
        }
        if (!zero[var][x->toIndex(*it)] && x->getCost(*it) + wcsp->getLb() < wcsp->getUb()) record(r.second);
    }
    x->findSupport();
    changed = true;  //Detect any change in variable domain or unary costs
}