コード例 #1
0
ファイル: RangeConstraint.cs プロジェクト: coin-or/SONNET
 /// <summary>
 /// Initializes a new instance of the RangeConstraint class based on a copy of the given constraint,
 /// but with the given name.
 /// </summary>
 /// <param name="name">The name for the new constraint.</param>
 /// <param name="rangeConstraint">The range constraint to be copied.</param>
 public RangeConstraint(string name, RangeConstraint rangeConstraint)
     : base(name, rangeConstraint)
 {
     this.lower = rangeConstraint.lower;
 }
コード例 #2
0
        private static Model NewHelper(out Variable[] variables, Func <int, bool> isIntegerFunc, Func <int, string> columnNameFunc, Func <int, string> rowNameFunc,
                                       double[] colLower, double[] colUpper, string objName, double[] objCoefs, int numberVariables, int numberConstraints, char[] rowSenses, CoinPackedMatrix rowMatrix, double[] rowLowers, double[] rowUppers)
        {
            Model model = new Model();

            variables = new Variable[numberVariables];

            Expression objExpr = new Expression();

            int i = 0;

            for (i = 0; i < numberVariables; i++)
            {
                Variable var = new Variable();
                variables[i] = var;

                double lower     = colLower[i];
                double upper     = colUpper[i];
                bool   isInteger = isIntegerFunc.Invoke(i);

                string name = columnNameFunc.Invoke(i);
                if (!string.IsNullOrEmpty(name))
                {
                    var.Name = name;
                }
                else
                {
                    var.Name = string.Concat("VAR", i);
                }

                var.Lower = lower;
                var.Upper = upper;
                var.Type  = (isInteger) ? VariableType.Integer : VariableType.Continuous;

                objExpr.Add(objCoefs[i], var);
            }

            model.Objective      = new Objective(objName, objExpr);
            model.ObjectiveSense = ObjectiveSense.Minimise;
            // NOTE: MPS DOESNT STORE MAXIMIZATION OR MINIMIZATION!
            // bUT LP always returns Minimization (and transforms objective accordingly if original is max)

            for (int j = 0; j < numberConstraints; j++)
            {
                Expression expr = new Expression();
                CoinShallowPackedVector vector = rowMatrix.getVector(j); // I guess..
                int      nElements             = vector.getNumElements();
                int[]    indices  = vector.getIndices();
                double[] elements = vector.getElements();

                for (int e = 0; e < nElements; e++)
                {
                    int      index = indices[e];
                    Variable var   = variables[index];
                    double   coef  = elements[e];

                    expr.Add(coef, var);
                }

                double lower = rowLowers[j];
                double upper = rowUppers[j];

                string name = rowNameFunc.Invoke(j);
                string conName;
                if (!string.IsNullOrEmpty(name))
                {
                    conName = name;
                }
                else
                {
                    conName = string.Concat("CON", i);
                }

                switch (rowSenses[j])
                {
                case 'L':     //<= constraint and rhs()[i] == rowupper()[i]
                {
                    ConstraintType type      = ConstraintType.LE;
                    Expression     upperExpr = new Expression(upper);
                    Constraint     con       = new Constraint(conName, expr, type, upperExpr);
                    upperExpr.Clear();
                    model.Add(con);
                    break;
                }

                case 'E':     //=  constraint
                {
                    ConstraintType type      = ConstraintType.EQ;
                    Expression     upperExpr = new Expression(upper);
                    Constraint     con       = new Constraint(conName, expr, type, upperExpr);
                    upperExpr.Clear();
                    model.Add(con);
                    break;
                }

                case 'G':     //>= constraint and rhs()[i] == rowlower()[i]
                {
                    ConstraintType type      = ConstraintType.GE;
                    Expression     lowerExpr = new Expression(lower);
                    Constraint     con       = new Constraint(conName, expr, type, lowerExpr);
                    lowerExpr.Clear();
                    model.Add(con);
                    break;
                }

                case 'R':     //ranged constraint
                {
                    RangeConstraint con = new RangeConstraint(conName, lower, expr, upper);
                    model.Add(con);
                    break;
                }

                case 'N':     //free constraint
                {
                    RangeConstraint con = new RangeConstraint(conName, lower, expr, upper);
                    con.Enabled = false;
                    model.Add(con);
                    break;
                }

                default:
                    break;
                }
            }
            return(model);
        }
コード例 #3
0
ファイル: RangeConstraint.cs プロジェクト: coin-or/SONNET
 /// <summary>
 /// Initializes a new instance of the RangeConstraint class based on a copy of the given constraint.
 /// A default name is used.
 /// </summary>
 /// <param name="rangeConstraint">The range constraint to be copied.</param>
 public RangeConstraint(RangeConstraint rangeConstraint)
     : base(null, rangeConstraint)
 {
     this.lower = rangeConstraint.lower;
 }