diff --git a/examples/tests/bug_fz1.cc b/examples/tests/bug_fz1.cc index 840f75d0e4..96242ad9cf 100644 --- a/examples/tests/bug_fz1.cc +++ b/examples/tests/bug_fz1.cc @@ -22,176 +22,53 @@ namespace operations_research { void ShoppingBasketBug() { Solver s("ShoppingBasketBug"); - IntVar* const x15 = s.MakeIntVar(13, 18, "x15"); - IntVar* const x18 = s.MakeIntVar(13, 18, "x18"); - // IsLessEqualCstCt((((Watch(0 .. 1) * 1132) + (Watch(0 .. 1) * 1970)) + 3787), 4499, Is((((Watch(0 .. 1) * 1132) + (Watch(0 .. 1) * 1970)) + 3787) <= 4499)(0 .. 1)) - IntVar* const is_less = - s.MakeIsLessOrEqualCstVar( - s.MakeSum( - s.MakeSum( - s.MakeProd(s.MakeIsEqualCstVar(x15, 18), 1132), - s.MakeProd(s.MakeIsEqualCstVar(x18, 18), 1970)), - 3787), - 4499); -// IntElementConstraint([1130, 1602, 1354, 99999, 1117, 1132], (x[15](13..18) + -13), Var(1117 1130 1132 1354 1602 99999)) + IntVar* const x15 = s.MakeIntVar(0, 2, "x15"); + IntVar* const x18 = s.MakeIntVar(0, 2, "x18"); + IntVar* const is1 = s.MakeIsEqualCstVar(x15, 2); + IntVar* const is2 = s.MakeIsEqualCstVar(x18, 2); + IntVar* const is_less = s.MakeIsLessOrEqualCstVar( + s.MakeSum(s.MakeProd(is1, 2), s.MakeProd(is2, 2)), 1); std::vector values1; - values1.push_back(1130); - values1.push_back(1602); - values1.push_back(1354); - values1.push_back(99999); - values1.push_back(1117); - values1.push_back(1132); - IntVar* const elem1 = s.MakeElement(values1, s.MakeSum(x15, -13)->Var())->Var(); -// IntElementConstraint([1908, 99999, 2093, 3060, 2256, 1970], (x[18](13..18) + -13), Var(1908 1970 2093 2256 3060 99999)) + values1.push_back(10); + values1.push_back(2); + values1.push_back(12); + IntVar* const elem1 = s.MakeElement(values1, x15)->Var(); std::vector values2; - values2.push_back(1908); - values2.push_back(99999); - values2.push_back(2093); - values2.push_back(3060); - values2.push_back(2256); - values2.push_back(1970); - IntVar* const elem2 = s.MakeElement(values2, s.MakeSum(x18, -13)->Var())->Var(); -// cast(MinIntExpr(BOOL____00117(0 .. 1), BOOL____00118(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____00180(0 .. 1), BOOL____00181(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____00243(0 .. 1), BOOL____00244(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____00369(0 .. 1), BOOL____00370(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____00432(0 .. 1), BOOL____00433(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____00495(0 .. 1), BOOL____00496(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____00621(0 .. 1), BOOL____00622(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____00810(0 .. 1), BOOL____00811(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____00873(0 .. 1), BOOL____00874(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____01062(0 .. 1), BOOL____01063(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____01125(0 .. 1), BOOL____01126(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____01251(0 .. 1), BOOL____01252(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____01314(0 .. 1), BOOL____01315(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____01377(0 .. 1), BOOL____01378(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____01440(0 .. 1), BOOL____01441(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____01503(0 .. 1), BOOL____01504(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____01566(0 .. 1), BOOL____01567(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____01629(0 .. 1), BOOL____01630(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____01692(0 .. 1), BOOL____01693(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____01755(0 .. 1), BOOL____01756(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____01818(0 .. 1), BOOL____01819(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____01881(0 .. 1), BOOL____01882(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____02007(0 .. 1), BOOL____02008(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____02070(0 .. 1), BOOL____02071(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____02133(0 .. 1), BOOL____02134(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____02259(0 .. 1), BOOL____02260(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____02322(0 .. 1), BOOL____02323(0 .. 1)), Var(0 .. 1)) -// cast(MinIntExpr(BOOL____02385(0 .. 1), BOOL____02386(0 .. 1)), Var(0 .. 1)) - std::vector ands; - s.MakeBoolVarArray(28, "ands", &ands); -// Sum(Var(1117 1130 1132 1354 1602 99999), (Var(0 .. 1) * 398), (Var(0 .. 1) * 395), (Var(0 .. 1) * 450), (Var(0 .. 1) * 390), (Var(0 .. 1) * 450), (Var(0 .. 1) * 490), (Var(0 .. 1) * 395), (Var(0 .. 1) * 395), (Var(0 .. 1) * 295), (Var(0 .. 1) * 395), (Var(0 .. 1) * 345), (Var(0 .. 1) * 395), (Var(0 .. 1) * 350), (Var(0 .. 1) * 390), (Var(0 .. 1) * 450), (Var(0 .. 1) * 390), (Var(0 .. 1) * 395), (Var(0 .. 1) * 395), (Var(0 .. 1) * 390), (Var(0 .. 1) * 395), (Var(0 .. 1) * 395), (Var(0 .. 1) * 450), (Var(0 .. 1) * 300), (Var(0 .. 1) * 400), (Var(0 .. 1) * 390), (Is((((Watch(0 .. 1) * 1132) + (Watch(0 .. 1) * 1970)) + 3787) <= 4499)(0 .. 1) * 290), Var(1908 1970 2093 2256 3060 99999), (Var(0 .. 1) * 395), (Var(0 .. 1) * 399), (Var(0 .. 1) * 390)) == ScalProd([Var, Var, Var, Var, Var, Var, Var, Var, Var, Var, Var, Var, Var, Var, Var, Var, Var, Var, Var, Var, Var, Var, Var, Var, Var, Var, Is((((Watch(0 .. 1) * 1132) + (Watch(0 .. 1) * 1970)) + 3787) <= 4499), Var, Var, Var, Var], [1, 398, 395, 450, 390, 450, 490, 395, 395, 295, 395, 345, 395, 350, 390, 450, 390, 395, 395, 390, 395, 395, 450, 300, 400, 390, 290, 1, 395, 399, 390])(3025..211355) + values2.push_back(2); + values2.push_back(10); + values2.push_back(5); + IntVar* const elem2 = s.MakeElement(values2, x18)->Var(); std::vector vars; vars.push_back(elem1); - vars.push_back(ands[0]); - vars.push_back(ands[1]); - vars.push_back(ands[2]); - vars.push_back(ands[3]); - vars.push_back(ands[4]); - vars.push_back(ands[5]); - vars.push_back(ands[6]); - vars.push_back(ands[7]); - vars.push_back(ands[8]); - vars.push_back(ands[9]); - vars.push_back(ands[10]); - vars.push_back(ands[11]); - vars.push_back(ands[12]); - vars.push_back(ands[13]); - vars.push_back(ands[14]); - vars.push_back(ands[15]); - vars.push_back(ands[16]); - vars.push_back(ands[17]); - vars.push_back(ands[18]); - vars.push_back(ands[19]); - vars.push_back(ands[20]); - vars.push_back(ands[21]); - vars.push_back(ands[22]); - vars.push_back(ands[23]); - vars.push_back(ands[24]); vars.push_back(is_less); vars.push_back(elem2); - vars.push_back(ands[25]); - vars.push_back(ands[26]); - vars.push_back(ands[27]); - - // Var, - // Var, - // Var, - // Var, - // Var, - // Var, - // Var, - // Var, - // Var, - // Var, - - // Var, - // Var, - // Var, - // Var, - // Var, - // Var, - // Var, - // Var, - // Var, - // Var, - - // Var, - // Var, - // Var, - // Var, - // Var, - // Var, - // Is((((Watch(0 .. 1) * 1132) + (Watch(0 .. 1) * 1970)) + 3787) <= 4499), - // Var, - // Var, - // Var, - - // Var std::vector coefs; coefs.push_back(1); - coefs.push_back(398); - coefs.push_back(395); - coefs.push_back(450); - coefs.push_back(390); - coefs.push_back(450); - coefs.push_back(490); - coefs.push_back(395); - coefs.push_back(395); - coefs.push_back(295); - - coefs.push_back(395); - coefs.push_back(345); - coefs.push_back(395); - coefs.push_back(350); - coefs.push_back(390); - coefs.push_back(450); - coefs.push_back(390); - coefs.push_back(395); - coefs.push_back(395); - coefs.push_back(390); - - coefs.push_back(395); - coefs.push_back(395); - coefs.push_back(450); - coefs.push_back(300); - coefs.push_back(400); - coefs.push_back(390); - coefs.push_back(290); + coefs.push_back(90); coefs.push_back(1); - coefs.push_back(395); - coefs.push_back(399); - - coefs.push_back(390); IntVar* const obj = s.MakeScalProd(vars, coefs)->Var(); - - + OptimizeVar* const optimize = s.MakeMinimize(obj, 1); + SearchMonitor* const log = s.MakeSearchLog(10, optimize); + SolutionCollector* const collector = s.MakeLastSolutionCollector(); + collector->Add(x15); + collector->Add(x18); + collector->Add(is_less); + collector->Add(elem1); + collector->Add(elem2); + collector->Add(is1); + collector->Add(is2); + DecisionBuilder* const db1 = + s.MakePhase(x15, x18, Solver::CHOOSE_MAX_SIZE, Solver::ASSIGN_MIN_VALUE); + DecisionBuilder* const db2 = s.MakePhase(obj, Solver::CHOOSE_FIRST_UNBOUND, + Solver::ASSIGN_MIN_VALUE); + DecisionBuilder* const db = s.Compose(db1, db2); + s.Solve(db, optimize, log, collector); + LOG(INFO) << collector->solution(0)->DebugString(); } } // namespace operations_research int main(int argc, char** argv) { google::ParseCommandLineFlags(&argc, &argv, true); - + operations_research::ShoppingBasketBug(); return 0; }