Hello, I've a problem solved with gecode where jobs must be assigned to person. Each (job, person) has it own cost statically given. The implementation looks like : // -------------------------------------------------------------- _j(*this, _nb_jobs, 0, _nb_persons - 1) int _cost[] = { 9, 2, 7, 8, 6, 4, 3, 7, 5, 8, 1, 8, 7, 6, 9, 4, }; IntArgs cost(_nb_persons*_nb_jobs, _cost); distinct(*this, _j); for (int i = 0 ; i < _nb_jobs ; ++i) { C << expr(*this, element(cost_m.col(i), _j[i])); } _total_cost = expr(*this, sum(C)); JobBrancher::post(*this, _j); // -------------------------------------------------------------- The problem is that the _cost must be precomputed. To enable a dynamic cost computation (and to prepare futher improvement), i've modified the code this way : // -------------------------------------------------------------- _cost(*this, _nb_persons, 0, 10) // a IntVarArray JobBrancher::post(*this, _j, _cost, _nb_jobs, _nb_persons); // -------------------------------------------------------------- And : 1) compute dynamically the cost in JobBrancher::choice 2) call me_failed(_costs_views[choice._person].eq(home, choice._cost)) In JobBrancher::commit (for job/person affectation) 3) call me_failed(_jobs_views[choice._job].eq(home, choice._person)) In JobBrancher::commit (to compute the _total_cost) The problem is that solution can be found without having an assigned cost. This produce a Int::ValOfUnassignedVar as stated in MPG. I've tried to set all unassigned cost in JobBrancher::commit (not only the one corresponding to the choice person/job) just to make a try but it doesn't work : // -------------------------------------------------------------- for(int i = 0 ; i < choice._costs.size() ; ++i) { const JobChoice::Info & elem = choice._costs[i]; const int p = elem.person; const int c = elem.cost; if (! _costs_views[p].assigned()) { has_failed = me_failed(_costs_views[p].eq(home, c)); if (has_failed) { return Gecode::ES_FAILED; } } } return Gecode::ES_OK; // -------------------------------------------------------------- The first affectation seems to works. After that, i see under gist that the first branch is infinitely explored without any change. Can someone explain me what i'm doing wrong and how to correct it ? Thanks Philippe.
_______________________________________________ Gecode users mailing list users@gecode.org https://www.gecode.org/mailman/listinfo/gecode-users