예제 #1
0
        public void SolveFromString()
        {
            string           model_str     = @"
            { 
              ""variables"": [
                { ""name"": ""C"", ""domain"": [ ""1"", ""9"" ] },
                { ""name"": ""P"", ""domain"": [ ""0"", ""9"" ] },
                { ""name"": ""I"", ""domain"": [ ""1"", ""9"" ] },
                { ""name"": ""S"", ""domain"": [ ""0"", ""9"" ] },
                { ""name"": ""F"", ""domain"": [ ""1"", ""9"" ] },
                { ""name"": ""U"", ""domain"": [ ""0"", ""9"" ] },
                { ""name"": ""N"", ""domain"": [ ""0"", ""9"" ] },
                { ""name"": ""T"", ""domain"": [ ""1"", ""9"" ] },
                { ""name"": ""R"", ""domain"": [ ""0"", ""9"" ] },
                { ""name"": ""E"", ""domain"": [ ""0"", ""9"" ] }
              ],
              ""constraints"": [
                { ""allDiff"": { ""vars"": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ] } },
                { ""linear"": { ""vars"": [ 6, 5, 9, 4, 3, 7, 8, 2, 0, 1 ], ""coeffs"": [ ""1"", ""0"", ""-1"", ""100"", ""1"", ""-1000"", ""-100"", ""10"", ""10"", ""1"" ], ""domain"": [ ""0"", ""0"" ] } }
              ]
            }";
            CpModelProto     model         = Google.Protobuf.JsonParser.Default.Parse <CpModelProto>(model_str);
            SolveWrapper     solve_wrapper = new SolveWrapper();
            CpSolverResponse response      = solve_wrapper.Solve(model);

            Console.WriteLine(response);
        }
예제 #2
0
 public IntVar(CpModelProto model, int index)
 {
     model_    = model;
     index_    = index;
     var_      = model.Variables[index];
     negation_ = null;
 }
예제 #3
0
 public CpModel()
 {
     model_         = new CpModelProto();
     constant_map_  = new Dictionary <long, int>();
     var_value_map_ = new Dictionary <int, long>(10);
     terms_         = new Queue <Term>(10);
 }
예제 #4
0
        public static LinearExpr RebuildLinearExprFromLinearExpressionProto(LinearExpressionProto proto,
                                                                            CpModelProto model)
        {
            int  numElements = proto.Vars.Count;
            long offset      = proto.Offset;

            if (numElements == 0)
            {
                return(LinearExpr.Constant(offset));
            }
            else
            if (numElements == 1)
            {
                IntVar var   = new IntVar(model, proto.Vars[0]);
                long   coeff = proto.Coeffs[0];
                return(LinearExpr.Affine(var, coeff, offset));
            }
            else
            {
                LinearExpr[] exprs = new LinearExpr[numElements];
                for (int i = 0; i < numElements; ++i)
                {
                    IntVar var   = new IntVar(model, proto.Vars[i]);
                    long   coeff = proto.Coeffs[i];
                    exprs[i] = Prod(var, coeff);
                }
                SumArray sum = new SumArray(exprs);
                sum.Offset = sum.Offset + offset;
                return(sum);
            }
        }
예제 #5
0
        internal static LinearExpr RebuildLinearExprFromLinearExpressionProto(LinearExpressionProto proto,
                                                                              CpModelProto model)
        {
            int  numElements = proto.Vars.Count;
            long offset      = proto.Offset;

            if (numElements == 0)
            {
                return(LinearExpr.Constant(offset));
            }
            else if (numElements == 1)
            {
                IntVar var   = new IntVar(model, proto.Vars[0]);
                long   coeff = proto.Coeffs[0];
                return(LinearExpr.Affine(var, coeff, offset));
            }
            else
            {
                LinearExprBuilder builder = LinearExpr.NewBuilder(numElements);
                for (int i = 0; i < numElements; ++i)
                {
                    builder.AddTerm(new IntVar(model, proto.Vars[i]), proto.Coeffs[i]);
                }
                builder.Add(offset);
                return(builder);
            }
        }
예제 #6
0
 public IntVar(CpModelProto model, Domain domain, string name)
 {
     index_    = model.Variables.Count;
     var_      = new IntegerVariableProto();
     var_.Name = name;
     var_.Domain.Add(domain.FlattenedIntervals());
     model.Variables.Add(var_);
 }
예제 #7
0
 public IntVar(CpModelProto model, long lb, long ub, string name)
 {
     index_               = model.Variables.Count;
     var_                 = new IntegerVariableProto();
     var_.Name            = name;
     var_.Domain.Capacity = 2;
     var_.Domain.Add(lb);
     var_.Domain.Add(ub);
     model.Variables.Add(var_);
 }
예제 #8
0
 public IntVar(CpModelProto model, IEnumerable <long> bounds, string name)
 {
     model_    = model;
     index_    = model.Variables.Count;
     var_      = new IntegerVariableProto();
     var_.Name = name;
     var_.Domain.Add(bounds);
     model.Variables.Add(var_);
     negation_ = null;
 }
예제 #9
0
 public IntVar(CpModelProto model, IEnumerable <long> bounds,
               int is_present_index, string name)
 {
     model_    = model;
     index_    = model.Variables.Count;
     var_      = new IntegerVariableProto();
     var_.Name = name;
     var_.Domain.Add(bounds);
     var_.EnforcementLiteral.Add(is_present_index);
     model.Variables.Add(var_);
     negation_ = null;
 }
예제 #10
0
    static void TestSimpleLinearModel2()
    {
        CpModelProto model = new CpModelProto();

        model.Variables.Add(NewIntegerVariable(-10, 10));
        model.Variables.Add(NewIntegerVariable(-10, 10));
        model.Constraints.Add(NewLinear2(0, 1, 1, 1, -1000000, 100000));
        model.Objective = NewMaximize2(0, 1, 1, -2);

        CpSolverResponse response = SatHelper.Solve(model);

        Console.WriteLine("model = " + model.ToString());
        Console.WriteLine("response = " + response.ToString());
    }
예제 #11
0
        public void SimpleLinearModelProto2()
        {
            CpModelProto model = new CpModelProto();
            model.Variables.Add(NewIntegerVariable(-10, 10));
            model.Variables.Add(NewIntegerVariable(-10, 10));
            model.Constraints.Add(NewLinear2(0, 1 , 1, 1, -1000000, 100000));
            model.Objective = NewMaximize2(0, 1, 1, -2);
            //Console.WriteLine("model = " + model.ToString());

            CpSolverResponse response = SatHelper.Solve(model);
            Assert.Equal(CpSolverStatus.Optimal, response.Status);
            Assert.Equal(30, response.ObjectiveValue);
            Assert.Equal(new long[] {10, -10}, response.Solution);
            //Console.WriteLine("response = " + response.ToString());
        }
예제 #12
0
        public IntervalVar(CpModelProto model, int start_index, int size_index, int end_index, string name)
        {
            model_          = model;
            index_          = model.Constraints.Count;
            interval_       = new IntervalConstraintProto();
            interval_.Start = start_index;
            interval_.Size  = size_index;
            interval_.End   = end_index;

            ConstraintProto ct = new ConstraintProto();

            ct.Interval = interval_;
            ct.Name     = name;
            model_.Constraints.Add(ct);
        }
예제 #13
0
        public IntervalVar(CpModelProto model, LinearExpressionProto start, LinearExpressionProto size,
                           LinearExpressionProto end, string name)
        {
            model_          = model;
            index_          = model.Constraints.Count;
            interval_       = new IntervalConstraintProto();
            interval_.Start = start;
            interval_.Size  = size;
            interval_.End   = end;

            ConstraintProto ct = new ConstraintProto();

            ct.Interval = interval_;
            ct.Name     = name;
            model_.Constraints.Add(ct);
        }
예제 #14
0
        public IntervalVar(CpModelProto model, LinearExpressionProto start, LinearExpressionProto size,
                           LinearExpressionProto end, int is_present_index, string name)
        {
            model_              = model;
            index_              = model.Constraints.Count;
            interval_           = new IntervalConstraintProto();
            interval_.StartView = start;
            interval_.SizeView  = size;
            interval_.EndView   = end;

            ConstraintProto ct = new ConstraintProto();

            ct.Interval = interval_;
            ct.Name     = name;
            ct.EnforcementLiteral.Add(is_present_index);
            model.Constraints.Add(ct);
        }
예제 #15
0
 public IntVar(CpModelProto model, int index)
 {
     index_ = index;
     var_   = model.Variables[index];
 }
예제 #16
0
 public BoolVar(CpModelProto model, String name) : base(model, 0, 1, name)
 {
 }
예제 #17
0
 public CircuitConstraint(CpModelProto model) : base(model)
 {
 }
예제 #18
0
 public NoOverlap2dConstraint(CpModelProto model) : base(model)
 {
 }
예제 #19
0
 public ReservoirConstraint(CpModel cp_model, CpModelProto model) : base(model)
 {
     this.cp_model_ = cp_model;
 }
예제 #20
0
 public AutomatonConstraint(CpModelProto model) : base(model)
 {
 }
예제 #21
0
 public BoolVar(CpModelProto model, int index) : base(model, index)
 {
 }
예제 #22
0
 public Constraint(CpModelProto model)
 {
     index_      = model.Constraints.Count;
     constraint_ = new ConstraintProto();
     model.Constraints.Add(constraint_);
 }
예제 #23
0
 public CpModel()
 {
     model_        = new CpModelProto();
     constant_map_ = new Dictionary <long, int>();
     terms_        = new Queue <Term>();
 }
예제 #24
0
 public MultipleCircuitConstraint(CpModelProto model) : base(model)
 {
 }
예제 #25
0
 public CumulativeConstraint(CpModel cp_model, CpModelProto model) : base(model)
 {
     this.cp_model_ = cp_model;
 }
예제 #26
0
 public CpModel()
 {
     model_        = new CpModelProto();
     constant_map_ = new Dictionary <long, int>();
 }
예제 #27
0
 public TableConstraint(CpModelProto model) : base(model)
 {
 }