new api with decision builder on solver::accept()

This commit is contained in:
lperron@google.com
2012-08-27 14:10:15 +00:00
parent c24644d467
commit 3b8acc086e
3 changed files with 49 additions and 1 deletions

View File

@@ -398,6 +398,42 @@ public class CsTestCpOperator
Console.WriteLine(y.ToString());
}
static void TestScheduling()
{
Solver solver = new Solver("Scheduling");
IntervalVar[] tasks = new IntervalVar[taskCount];
List<IntVar> all_ends = new List<IntVar>();
int i = 0;
foreach(Task t in myTaskList)
{
tasks[i] = solver.MakeFixedInterval(0, (long)t.Duration, t.Name);
if (t.Successors.Count <= 0)
all_ends.Add(tasks[i].EndExpr().Var());
//solver.Add(solver.MakeGreaterOrEqual(tasks[i].StartExpr(), 1)); // { 1 }
i++;
}
IntVar objective_var = solver.MakeMax(all_ends.ToArray()).Var();
OptimizeVar objective_monitor = solver.MakeMinimize(objective_var, 1);
DecisionBuilder obj_phase = solver.MakePhase(objective_var, Solver.CHOOSE_FIRST_UNBOUND, Solver.ASSIGN_MIN_VALUE);
const int kLogFrequency = 999999999;
SearchMonitor search_log = solver.MakeSearchLog(kLogFrequency, objective_monitor);
SolutionCollector collector = solver.MakeLastSolutionCollector();
collector.AddObjective(objective_var);
if (solver.Solve(obj_phase, objective_monitor))
{
Console.Out.WriteLine("Solution: ");
foreach(IntervalVar t in tasks)
Console.Out.WriteLine(t.ToString());
}else
{
Console.Out.WriteLine("Can not find a solution");
}
}
static void Main()
{
TestConstructors();

View File

@@ -1702,11 +1702,17 @@ void Solver::AddCastConstraint(CastConstraint* const constraint,
void Solver::Accept(ModelVisitor* const visitor) const {
std::vector<SearchMonitor*> monitors;
Accept(visitor, monitors);
Accept(visitor, monitors, NULL);
}
void Solver::Accept(ModelVisitor* const visitor,
const std::vector<SearchMonitor*>& monitors) const {
Accept(visitor, monitors, NULL);
}
void Solver::Accept(ModelVisitor* const visitor,
const std::vector<SearchMonitor*>& monitors,
DecisionBuilder* const db) const {
visitor->BeginVisitModel(name_);
for (int index = 0; index < constraints_list_.size(); ++index) {
Constraint* const constraint = constraints_list_[index];
@@ -1719,6 +1725,9 @@ void Solver::Accept(ModelVisitor* const visitor,
monitors[i]->Accept(visitor);
}
}
if (db != NULL) {
db->Accept(visitor);
}
visitor->EndVisitModel(name_);
}

View File

@@ -2743,6 +2743,9 @@ class Solver {
// Accepts the given model visitor.
void Accept(ModelVisitor* const visitor,
const std::vector<SearchMonitor*>& monitors) const;
void Accept(ModelVisitor* const visitor,
const std::vector<SearchMonitor*>& monitors,
DecisionBuilder* const db) const;
Decision* balancing_decision() const { return balancing_decision_.get(); }