15 using System.Collections.Generic;
20 static void RankTasks(
CpModel model,
24 int num_tasks = starts.Length;
28 for (
int i = 0; i < num_tasks; ++i) {
29 for (
int j = 0; j < num_tasks; ++j) {
31 precedences[i, i] = presences[i];
34 precedences[i, j] = prec;
41 for (
int i = 0; i < num_tasks - 1; ++i) {
42 for (
int j = i + 1; j < num_tasks; ++j) {
43 List<ILiteral> tmp_array =
new List<ILiteral>();
44 tmp_array.Add(precedences[i, j]);
45 tmp_array.Add(precedences[j, i]);
46 tmp_array.Add(presences[i].Not());
50 tmp_array.Add(presences[j].Not());
66 for (
int i = 0; i < num_tasks; ++i) {
68 for (
int j = 0; j < num_tasks; ++j) {
69 tmp_array[j] = (
IntVar)precedences[j, i];
91 for (
int t = 0; t < num_tasks; ++t) {
92 starts[t] = model.
NewIntVar(0, horizon, String.Format(
"start_{0}", t));
94 ends[t] = model.
NewIntVar(0, horizon, String.Format(
"end_{0}", t));
95 if (t < num_tasks / 2) {
96 intervals[t] = model.NewIntervalVar(starts[t], duration, ends[t],
97 String.Format(
"interval_{0}", t));
98 presences[t] = true_var;
100 presences[t] = model.
NewBoolVar(String.Format(
"presence_{0}", t));
101 intervals[t] = model.NewOptionalIntervalVar(
102 starts[t], duration, ends[t], presences[t],
103 String.Format(
"o_interval_{0}", t));
108 model.
NewIntVar(-1, num_tasks - 1, String.Format(
"rank_{0}", t));
115 RankTasks(model, starts, presences, ranks);
118 model.
Add(ranks[0] < ranks[1]);
122 for (
int t = 0; t < num_tasks; ++t) {
129 for (
int t = 0; t < num_tasks; ++t) {
130 presences_as_int_vars[t] = (
IntVar)presences[t];
139 Console.WriteLine(String.Format(
"Optimal cost: {0}",
141 Console.WriteLine(String.Format(
"Makespan: {0}", solver.
Value(makespan)));
142 for (
int t = 0; t < num_tasks; ++t) {
144 Console.WriteLine(String.Format(
145 "Task {0} starts at {1} with rank {2}",
146 t, solver.
Value(starts[t]), solver.
Value(ranks[t])));
148 Console.WriteLine(String.Format(
149 "Task {0} in not performed and ranked at {1}", t,
150 solver.
Value(ranks[t])));
155 String.Format(
"Solver exited with nonoptimal status: {0}", status));