示例#1
0
        public Constraint AddLinearExpressionInDomain(LinearExpression linear_expr, Domain domain)
        {
            Dictionary <IntVar, long> dict = new Dictionary <IntVar, long>();
            long                  constant = LinearExpression.GetVarValueMap(linear_expr, 1L, dict);
            Constraint            ct       = new Constraint(model_);
            LinearConstraintProto linear   = new LinearConstraintProto();

            foreach (KeyValuePair <IntVar, long> term in dict)
            {
                linear.Vars.Add(term.Key.Index);
                linear.Coeffs.Add(term.Value);
            }
            foreach (long value in domain.FlattenedIntervals())
            {
                if (value == Int64.MinValue || value == Int64.MaxValue)
                {
                    linear.Domain.Add(value);
                }
                else
                {
                    linear.Domain.Add(value - constant);
                }
            }
            ct.Proto.Linear = linear;
            return(ct);
        }
示例#2
0
        // Internal methods.

        void SetObjective(LinearExpression obj, bool minimize)
        {
            CpObjectiveProto objective = new CpObjectiveProto();

            if (obj is IntVar)
            {
                objective.Coeffs.Add(1L);
                objective.Offset = 0L;
                if (minimize)
                {
                    objective.Vars.Add(obj.Index);
                    objective.ScalingFactor = 1L;
                }
                else
                {
                    objective.Vars.Add(Negated(obj.Index));
                    objective.ScalingFactor = -1L;
                }
            }
            else
            {
                Dictionary <IntVar, long> dict = new Dictionary <IntVar, long>();
                long constant = LinearExpression.GetVarValueMap(obj, 1L, dict);
                if (minimize)
                {
                    objective.ScalingFactor = 1L;
                    objective.Offset        = constant;
                }
                else
                {
                    objective.ScalingFactor = -1L;
                    objective.Offset        = -constant;
                }
                foreach (KeyValuePair <IntVar, long> it in dict)
                {
                    objective.Coeffs.Add(it.Value);
                    if (minimize)
                    {
                        objective.Vars.Add(it.Key.Index);
                    }
                    else
                    {
                        objective.Vars.Add(Negated(it.Key.Index));
                    }
                }
            }
            model_.Objective = objective;
        }