Files
ortools-clone/examples/dotnet/zebra.cs
Corentin Le Molgat 42d7c276ab dotnet: rework example layout
- Fix examples using MPConstraint::Activity instead of MPSolver
- Move all examples to exmaples/dotnet
- remove netfx sub-directories
- Add all examples to target test_dotnet
  - still few disabled since they are too long
- Add tools/generate_examples_csproj.sh to generate .*proj files
2018-08-30 11:58:47 +02:00

179 lines
5.9 KiB
C#

//
// Copyright 2012 Hakan Kjellerstrand
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
using System;
using System.Linq;
using Google.OrTools.ConstraintSolver;
public class NQueens
{
/**
*
* Solves the Zebra problem.
*
* This is a port of the or-tools/Python model zebra.py
*
*
* """
* This is the zebra problem as invented by Lewis Caroll.
*
* There are five houses.
* The Englishman lives in the red house.
* The Spaniard owns the dog.
* Coffee is drunk in the green house.
* The Ukrainian drinks tea.
* The green house is immediately to the right of the ivory house.
* The Old Gold smoker owns snails.
* Kools are smoked in the yellow house.
* Milk is drunk in the middle house.
* The Norwegian lives in the first house.
* The man who smokes Chesterfields lives in the house next to the man
* with the fox.
* Kools are smoked in the house next to the house where the horse is kept.
* The Lucky Strike smoker drinks orange juice.
* The Japanese smokes Parliaments.
* The Norwegian lives next to the blue house.
*
* Who owns a zebra and who drinks water?
* """
*
*/
private static void Solve()
{
Solver solver = new Solver("Zebra");
int n = 5;
//
// Decision variables
//
// Colors
IntVar red = solver.MakeIntVar(1, n, "red");
IntVar green = solver.MakeIntVar(1, n, "green");
IntVar yellow = solver.MakeIntVar(1, n, "yellow");
IntVar blue = solver.MakeIntVar(1, n, "blue");
IntVar ivory = solver.MakeIntVar(1, n, "ivory");
// Nationality
IntVar englishman = solver.MakeIntVar(1, n, "englishman");
IntVar spaniard = solver.MakeIntVar(1, n, "spaniard");
IntVar japanese = solver.MakeIntVar(1, n, "japanese");
IntVar ukrainian = solver.MakeIntVar(1, n, "ukrainian");
IntVar norwegian = solver.MakeIntVar(1, n, "norwegian");
// Animal
IntVar dog = solver.MakeIntVar(1, n, "dog");
IntVar snails = solver.MakeIntVar(1, n, "snails");
IntVar fox = solver.MakeIntVar(1, n, "fox");
IntVar zebra = solver.MakeIntVar(1, n, "zebra");
IntVar horse = solver.MakeIntVar(1, n, "horse");
// Drink
IntVar tea = solver.MakeIntVar(1, n, "tea");
IntVar coffee = solver.MakeIntVar(1, n, "coffee");
IntVar water = solver.MakeIntVar(1, n, "water");
IntVar milk = solver.MakeIntVar(1, n, "milk");
IntVar fruit_juice = solver.MakeIntVar(1, n, "fruit juice");
// Smoke
IntVar old_gold = solver.MakeIntVar(1, n, "old gold");
IntVar kools = solver.MakeIntVar(1, n, "kools");
IntVar chesterfields = solver.MakeIntVar(1, n, "chesterfields");
IntVar lucky_strike = solver.MakeIntVar(1, n, "lucky strike");
IntVar parliaments = solver.MakeIntVar(1, n, "parliaments");
// for search
IntVar[] all_vars =
{parliaments, kools, chesterfields, lucky_strike, old_gold,
englishman, spaniard, japanese, ukrainian, norwegian,
dog, snails, fox, zebra, horse,
tea, coffee, water, milk, fruit_juice,
red, green, yellow, blue, ivory};
//
// Constraints
//
// Alldifferents
solver.Add(new IntVar[]
{red, green, yellow, blue, ivory}.AllDifferent());
solver.Add(new IntVar[]
{englishman, spaniard, japanese, ukrainian, norwegian}.AllDifferent());
solver.Add(new IntVar[]
{dog, snails, fox, zebra, horse}.AllDifferent());
solver.Add(new IntVar[]
{tea, coffee, water, milk, fruit_juice}.AllDifferent());
solver.Add(new IntVar[]
{parliaments, kools, chesterfields, lucky_strike, old_gold}.AllDifferent());
//
// The clues
//
solver.Add(englishman == red);
solver.Add(spaniard == dog);
solver.Add(coffee == green);
solver.Add(ukrainian == tea);
solver.Add(green == ivory + 1);
solver.Add(old_gold == snails);
solver.Add(kools == yellow);
solver.Add(milk == 3);
solver.Add(norwegian == 1);
solver.Add((fox - chesterfields).Abs() == 1);
solver.Add((horse - kools).Abs() == 1);
solver.Add(lucky_strike == fruit_juice);
solver.Add(japanese == parliaments);
solver.Add((norwegian - blue).Abs() == 1);
//
// Search
//
DecisionBuilder db = solver.MakePhase(all_vars,
Solver.INT_VAR_DEFAULT,
Solver.INT_VALUE_DEFAULT);
solver.NewSearch(db);
IntVar[] p = {englishman, spaniard, japanese, ukrainian, norwegian};
int[] ix = {0,1,2,3,4};
while (solver.NextSolution()) {
int water_drinker = (from i in ix
where p[i].Value() == water.Value()
select i).First();
int zebra_owner = (from i in ix
where p[i].Value() == zebra.Value()
select i).First();
Console.WriteLine("The {0} drinks water.", p[water_drinker].ToString());
Console.WriteLine("The {0} owns the zebra", p[zebra_owner].ToString());
}
Console.WriteLine("\nSolutions: {0}", solver.Solutions());
Console.WriteLine("WallTime: {0}ms", solver.WallTime());
Console.WriteLine("Failures: {0}", solver.Failures());
Console.WriteLine("Branches: {0} ", solver.Branches());
solver.EndSearch();
}
public static void Main(String[] args)
{
Solve();
}
}