30 Variable x = solver.MakeNumVar(0.0, 100.0,
"x");
31 Assert.Equal(0.0, x.Lb());
32 Assert.Equal(100.0, x.Ub());
34 Constraint ct1 = solver.
Add(x >= 1);
35 Assert.Equal(1.0, ct1.GetCoefficient(x));
36 Assert.Equal(1.0, ct1.Lb());
37 Assert.Equal(
double.PositiveInfinity, ct1.Ub());
39 Constraint ct2 = solver.
Add(x <= 1);
40 Assert.Equal(1.0, ct2.GetCoefficient(x));
41 Assert.Equal(
double.NegativeInfinity, ct2.Lb());
42 Assert.Equal(1.0, ct2.Ub());
44 Constraint ct3 = solver.
Add(x == 1);
45 Assert.Equal(1.0, ct3.GetCoefficient(x));
46 Assert.Equal(1.0, ct3.Lb());
47 Assert.Equal(1.0, ct3.Ub());
49 Constraint ct4 = solver.
Add(1 >= x);
50 Assert.Equal(1.0, ct4.GetCoefficient(x));
51 Assert.Equal(
double.NegativeInfinity, ct4.Lb());
52 Assert.Equal(1.0, ct4.Ub());
54 Constraint ct5 = solver.
Add(1 <= x);
55 Assert.Equal(1.0, ct5.GetCoefficient(x));
56 Assert.Equal(1.0, ct5.Lb());
57 Assert.Equal(
double.PositiveInfinity, ct5.Ub());
59 Constraint ct6 = solver.
Add(1 == x);
60 Assert.Equal(1.0, ct6.GetCoefficient(x));
61 Assert.Equal(1.0, ct6.Lb());
62 Assert.Equal(1.0, ct6.Ub());
73 Variable x = solver.MakeNumVar(0.0, 100.0,
"x");
74 Assert.Equal(0.0, x.Lb());
75 Assert.Equal(100.0, x.Ub());
77 Variable y = solver.MakeNumVar(0.0, 100.0,
"y");
78 Assert.Equal(0.0, y.Lb());
79 Assert.Equal(100.0, y.Ub());
81 Constraint ct1 = solver.
Add(x + y == 1);
82 Assert.Equal(1.0, ct1.GetCoefficient(x));
83 Assert.Equal(1.0, ct1.GetCoefficient(y));
85 Constraint ct2 = solver.
Add(x + x == 1);
86 Assert.Equal(2.0, ct2.GetCoefficient(x));
88 Constraint ct3 = solver.
Add(x + (y + x) == 1);
89 Assert.Equal(2.0, ct3.GetCoefficient(x));
90 Assert.Equal(1.0, ct3.GetCoefficient(y));
92 Constraint ct4 = solver.
Add(x + (y + x + 3) == 1);
93 Assert.Equal(2.0, ct4.GetCoefficient(x));
94 Assert.Equal(1.0, ct4.GetCoefficient(y));
95 Assert.Equal(-2.0, ct4.Lb());
96 Assert.Equal(-2.0, ct4.Ub());
107 Variable x = solver.MakeNumVar(0.0, 100.0,
"x");
108 Assert.Equal(0.0, x.Lb());
109 Assert.Equal(100.0, x.Ub());
111 Variable y = solver.MakeNumVar(0.0, 100.0,
"y");
112 Assert.Equal(0.0, y.Lb());
113 Assert.Equal(100.0, y.Ub());
115 Constraint ct1 = solver.
Add(3 * x == 1);
116 Assert.Equal(3.0, ct1.GetCoefficient(x));
118 Constraint ct2 = solver.
Add(x * 3 == 1);
119 Assert.Equal(3.0, ct2.GetCoefficient(x));
121 Constraint ct3 = solver.
Add(x + (2 * y + 3 * x) == 1);
122 Assert.Equal(4.0, ct3.GetCoefficient(x));
123 Assert.Equal(2.0, ct3.GetCoefficient(y));
125 Constraint ct4 = solver.
Add(x + 5 * (y + x + 3) == 1);
126 Assert.Equal(6.0, ct4.GetCoefficient(x));
127 Assert.Equal(5.0, ct4.GetCoefficient(y));
128 Assert.Equal(-14.0, ct4.Lb());
129 Assert.Equal(-14.0, ct4.Ub());
131 Constraint ct5 = solver.
Add(x + (2 * y + x + 3) * 3 == 1);
132 Assert.Equal(4.0, ct5.GetCoefficient(x));
133 Assert.Equal(6.0, ct5.GetCoefficient(y));
134 Assert.Equal(-8.0, ct5.Lb());
135 Assert.Equal(-8.0, ct5.Ub());
146 Variable x = solver.MakeNumVar(0.0, 100.0,
"x");
147 Assert.Equal(0.0, x.Lb());
148 Assert.Equal(100.0, x.Ub());
150 Variable y = solver.MakeNumVar(0.0, 100.0,
"y");
151 Assert.Equal(0.0, y.Lb());
152 Assert.Equal(100.0, y.Ub());
154 Constraint ct1 = solver.
Add(x == y);
155 Assert.Equal(1.0, ct1.GetCoefficient(x));
156 Assert.Equal(-1.0, ct1.GetCoefficient(y));
158 Constraint ct2 = solver.
Add(x == 3 * y + 5);
159 Assert.Equal(1.0, ct2.GetCoefficient(x));
160 Assert.Equal(-3.0, ct2.GetCoefficient(y));
161 Assert.Equal(5.0, ct2.Lb());
162 Assert.Equal(5.0, ct2.Ub());
164 Constraint ct3 = solver.
Add(2 * x - 9 == y);
165 Assert.Equal(2.0, ct3.GetCoefficient(x));
166 Assert.Equal(-1.0, ct3.GetCoefficient(y));
167 Assert.Equal(9.0, ct3.Lb());
168 Assert.Equal(9.0, ct3.Ub());
171 Assert.True(!(x != x));
172 Assert.True((x != y));
173 Assert.True(!(x == y));
184 Variable x = solver.MakeNumVar(0.0, 100.0,
"x");
185 Assert.Equal(0.0, x.Lb());
186 Assert.Equal(100.0, x.Ub());
188 Variable y = solver.MakeNumVar(0.0, 100.0,
"y");
189 Assert.Equal(0.0, y.Lb());
190 Assert.Equal(100.0, y.Ub());
192 Constraint ct1 = solver.
Add(2 * (x + 3) + 5 * (y + x - 1) >= 3);
193 Assert.Equal(7.0, ct1.GetCoefficient(x));
194 Assert.Equal(5.0, ct1.GetCoefficient(y));
195 Assert.Equal(2.0, ct1.Lb());
196 Assert.Equal(
double.PositiveInfinity, ct1.Ub());
198 Constraint ct2 = solver.
Add(2 * (x + 3) + 5 * (y + x - 1) <= 3);
199 Assert.Equal(7.0, ct2.GetCoefficient(x));
200 Assert.Equal(5.0, ct2.GetCoefficient(y));
201 Assert.Equal(
double.NegativeInfinity, ct2.Lb());
202 Assert.Equal(2.0, ct2.Ub());
204 Constraint ct3 = solver.
Add(2 * (x + 3) + 5 * (y + x - 1) >= 3 - x - y);
205 Assert.Equal(8.0, ct3.GetCoefficient(x));
206 Assert.Equal(6.0, ct3.GetCoefficient(y));
207 Assert.Equal(2.0, ct3.Lb());
208 Assert.Equal(
double.PositiveInfinity, ct3.Ub());
210 Constraint ct4 = solver.
Add(2 * (x + 3) + 5 * (y + x - 1) <= -x - y + 3);
211 Assert.Equal(8.0, ct4.GetCoefficient(x));
212 Assert.Equal(6.0, ct4.GetCoefficient(y));
213 Assert.Equal(
double.NegativeInfinity, ct4.Lb());
214 Assert.Equal(2.0, ct4.Ub());
227 Constraint ct1 = solver.
Add(x.Sum() == 3);
228 Assert.Equal(1.0, ct1.GetCoefficient(x[0]));
230 Constraint ct2 = solver.
Add(-2 * x.Sum() == 3);
231 Assert.Equal(-2.0, ct2.GetCoefficient(x[0]));
234 Constraint ct3 = solver.
Add(array.Sum() == 1);
235 Assert.Equal(3.0, ct3.GetCoefficient(x[0]));
236 Assert.Equal(-8.0, ct3.Lb());
237 Assert.Equal(-8.0, ct3.Ub());
248 Variable x = solver.MakeNumVar(0.0, 100.0,
"x");
249 Assert.Equal(0.0, x.Lb());
250 Assert.Equal(100.0, x.Ub());
252 Variable y = solver.MakeNumVar(0.0, 100.0,
"y");
253 Assert.Equal(0.0, y.Lb());
254 Assert.Equal(100.0, y.Ub());
257 Assert.Equal(0.0, solver.Objective().Offset());
258 Assert.Equal(1.0, solver.Objective().GetCoefficient(x));
259 Assert.True(solver.Objective().Maximization());
262 Assert.Equal(3.0, solver.Objective().Offset());
263 Assert.Equal(-1.0, solver.Objective().GetCoefficient(x));
264 Assert.Equal(-2.0, solver.Objective().GetCoefficient(y));
265 Assert.True(solver.Objective().Minimization());
268 void SolveAndPrint(in
Solver solver, in
Variable[] variables, in Constraint[] constraints)
270 Console.WriteLine($
"Number of variables = {solver.NumVariables()}");
271 Console.WriteLine($
"Number of constraints = {solver.NumConstraints()}");
273 Solver.ResultStatus resultStatus = solver.Solve();
275 if (resultStatus !=
Solver.ResultStatus.OPTIMAL)
277 Console.WriteLine(
"The problem does not have an optimal solution!");
281 Console.WriteLine(
"Solution:");
284 Console.WriteLine($
"{var.Name()} = {var.SolutionValue()}");
286 Console.WriteLine($
"Optimal objective value = {solver.Objective().Value()}");
287 Console.WriteLine(
"");
288 Console.WriteLine(
"Advanced usage:");
289 Console.WriteLine($
"Problem solved in {solver.WallTime()} milliseconds");
290 Console.WriteLine($
"Problem solved in {solver.Iterations()} iterations");
293 Console.WriteLine($
"{var.Name()}: reduced cost {var.ReducedCost()}");
296 double[] activities = solver.ComputeConstraintActivities();
297 foreach (Constraint ct
in constraints)
299 Console.WriteLine($
"{ct.Name()}: dual value = {ct.DualValue()}",
300 $
" activity = {activities[ct.Index()]}");
305 void RunLinearProgrammingExample(in String problemType)
307 Console.WriteLine($
"------ Linear programming example with {problemType} ------");
314 Variable x = solver.MakeNumVar(0.0,
double.PositiveInfinity,
"x");
315 Variable y = solver.MakeNumVar(0.0,
double.PositiveInfinity,
"y");
318 Objective objective = solver.Objective();
319 objective.SetCoefficient(x, 3);
320 objective.SetCoefficient(y, 4);
321 objective.SetMaximization();
324 Constraint c0 = solver.MakeConstraint(
double.NegativeInfinity, 14.0,
"c0");
325 c0.SetCoefficient(x, 1);
326 c0.SetCoefficient(y, 2);
329 Constraint c1 = solver.MakeConstraint(0.0,
double.PositiveInfinity,
"c1");
330 c1.SetCoefficient(x, 3);
331 c1.SetCoefficient(y, -1);
334 Constraint c2 = solver.MakeConstraint(
double.NegativeInfinity, 2.0,
"c2");
335 c2.SetCoefficient(x, 1);
336 c2.SetCoefficient(y, -1);
338 SolveAndPrint(solver,
new Variable[] { x, y },
new Constraint[] { c0, c1, c2 });
340 void RunMixedIntegerProgrammingExample(in String problemType)
342 Console.WriteLine($
"------ Mixed integer programming example with {problemType} ------");
349 Variable x = solver.MakeIntVar(0.0,
double.PositiveInfinity,
"x");
350 Variable y = solver.MakeIntVar(0.0,
double.PositiveInfinity,
"y");
353 Objective objective = solver.Objective();
354 objective.SetCoefficient(x, 1);
355 objective.SetCoefficient(y, 10);
356 objective.SetMaximization();
359 Constraint c0 = solver.MakeConstraint(
double.NegativeInfinity, 17.5,
"c0");
360 c0.SetCoefficient(x, 1);
361 c0.SetCoefficient(y, 7);
364 Constraint c1 = solver.MakeConstraint(
double.NegativeInfinity, 3.5,
"c1");
365 c1.SetCoefficient(x, 1);
366 c1.SetCoefficient(y, 0);
368 SolveAndPrint(solver,
new Variable[] { x, y },
new Constraint[] { c0, c1 });
370 void RunBooleanProgrammingExample(in String problemType)
372 Console.WriteLine($
"------ Boolean programming example with {problemType} ------");
379 Variable x = solver.MakeBoolVar(
"x");
380 Variable y = solver.MakeBoolVar(
"y");
383 Objective objective = solver.Objective();
384 objective.SetCoefficient(x, 2);
385 objective.SetCoefficient(y, 1);
386 objective.SetMinimization();
389 Constraint c0 = solver.MakeConstraint(1, 3,
"c0");
390 c0.SetCoefficient(x, 1);
391 c0.SetCoefficient(y, 2);
393 SolveAndPrint(solver,
new Variable[] { x, y },
new Constraint[] { c0 });
399 RunLinearProgrammingExample(
"GLOP");
400 RunLinearProgrammingExample(
"GLPK_LP");
401 RunLinearProgrammingExample(
"CLP");
402 RunLinearProgrammingExample(
"GUROBI_LP");
404 RunMixedIntegerProgrammingExample(
"GLPK");
405 RunMixedIntegerProgrammingExample(
"CBC");
406 RunMixedIntegerProgrammingExample(
"SCIP");
407 RunMixedIntegerProgrammingExample(
"SAT");
409 RunBooleanProgrammingExample(
"SAT");
410 RunBooleanProgrammingExample(
"BOP");
414 static void testSetHintAndSolverGetters()
416 Console.WriteLine(
"testSetHintAndSolverGetters");
419 Variable x = solver.MakeIntVar(0.0,
double.PositiveInfinity,
"x");
420 Variable y = solver.MakeIntVar(0.0,
double.PositiveInfinity,
"y");
423 Objective objective = solver.Objective();
424 objective.SetCoefficient(x, 1);
425 objective.SetCoefficient(y, 10);
426 objective.SetMaximization();
429 Constraint c0 = solver.MakeConstraint(
double.NegativeInfinity, 17.5,
"c0");
430 c0.SetCoefficient(x, 1);
431 c0.SetCoefficient(y, 7);
434 Constraint c1 = solver.MakeConstraint(
double.NegativeInfinity, 3.5,
"c1");
435 c1.SetCoefficient(x, 1);
436 c1.SetCoefficient(y, 0);
438 Constraint[] constraints = solver.constraints();
439 Assert.Equal(constraints.Length, 2);
440 Variable[] variables = solver.variables();
441 Assert.Equal(variables.Length, 2);
443 solver.SetHint(
new Variable[] { x, y },
new double[] { 2.0, 3.0 });