The OPTMILP Procedure
PROC OPTMILP Statement
PROC OPTMILP <options>;
You can specify the following options in the PROC OPTMILP statement.
Data Table Options
- DATA=CAS-libref.data-table
specifies the input data table that corresponds to the MILP model. If this option is not specified, PROC OPTMILP uses the most recently created data table. See Chapter 9: The MPS-Format Data Table, for more details about the input data table. CAS-libref.data-table is a two-level name, where CAS-libref refers to the
casliband session identifier, and data-table specifies the name of the input data table. For more information about this two-level name, see the section Using CAS Sessions and CAS Engine Librefs in Chapter 4: Shared Concepts.-
DUALOUT=CAS-libref.data-table
DOUT=CAS-libref.data-table specifies the output data table to contain the constraint activities. CAS-libref.data-table is a two-level name, where CAS-libref refers to the
casliband session identifier, and data-table specifies the name of the input data table. For more information about this two-level name, see the section Using CAS Sessions and CAS Engine Librefs in Chapter 4: Shared Concepts.- MAXPOOLSOLS=number
specifies the number of solutions to return in the ouput data tables, where number can be any positive integer up to the largest four-byte signed integer, which is . By default, MAXPOOLSOLS=1.
-
OBJCONSTANT=number
OBJECTIVECONSTANT=number specifies the constant part of the objective, where number can be any number. This option supersedes the objective right-hand side that is specified in the input data table. By default, OBJCONSTANT=0.
- OBJSENSE=MIN MAX
specifies whether the MILP model is a minimization or a maximization problem. You can use OBJSENSE=MIN for a minimization problem and OBJSENSE=MAX for a maximization problem. Alternatively, you can specify the objective sense in the input data table. This option supersedes the objective sense specified in the input data table. If the objective sense is not specified anywhere, then PROC OPTMILP interprets and solves the MILP as a minimization problem.
- PRIMALIN=CAS-libref.data-table
enables you to input a warm start solution in a data table. PROC OPTMILP validates both the data table and the solution stored in the data table. If the data table is not valid, then the PRIMALIN= data table is ignored. If the solution stored in a valid PRIMALIN= data table is a feasible integer solution, then it provides an incumbent solution and a bound for the branch-and-bound algorithm. If the solution stored in a valid PRIMALIN= data table is infeasible, contains missing values, or contains fractional values for integer variables, PROC OPTMILP tries to repair the solution with a number of specialized repair heuristics. See the section Warm Start for details. CAS-libref.data-table is a two-level name, where CAS-libref refers to the
casliband session identifier, and data-table specifies the name of the input data table. For more information about this two-level name, see the section Using CAS Sessions and CAS Engine Librefs in Chapter 4: Shared Concepts.-
PRIMALOUT=CAS-libref.data-table
POUT=CAS-libref.data-table specifies the output data table for the primal solution. This data table contains the primal solution information. See the section Data Input and Output for details. CAS-libref.data-table is a two-level name, where CAS-libref refers to the
casliband session identifier, and data-table specifies the name of the input data table. For more information about this two-level name, see the section Using CAS Sessions and CAS Engine Librefs in Chapter 4: Shared Concepts.
Presolve Option
- PRESOLVER=AUTOMATIC | NONE | BASIC | MODERATE | AGGRESSIVE
specifies a presolve level. You can specify the following values:
- AUTOMATIC
applies the default level of presolve processing.
- NONE
disables the presolver.
- BASIC
performs minimal presolve processing.
- MODERATE
applies a higher level of presolve processing.
- AGGRESSIVE
applies the highest level of presolve processing.
By default, PRESOLVER=AUTOMATIC.
Control Options
-
ABSOBJGAP=number
ABSOLUTEOBJECTIVEGAP=number specifies a stopping criterion. When the absolute difference between the best integer objective and the best bound on the objective function value becomes smaller than the value of number, the procedure stops. The value of number can be any nonnegative number; the default value is 1E–6.
- CUTOFF=number
cuts off any nodes in a minimization (maximization) problem that have an objective value at or above (below) number. The value of number can be any number; the default value is the largest (smallest) number that can be represented by a double.
- EMPHASIS=BALANCE | OPTIMAL | FEASIBLE
specifies the type of search emphasis. You can specify the following values:
- BALANCE
performs a balanced search.
- OPTIMAL
emphasizes optimality over feasibility.
- FEASIBLE
emphasizes feasibility over optimality.
By default, EMPHASIS=BALANCE.
- FEASTOL=number
specifies the tolerance that PROC OPTMILP uses to check the feasibility of a solution. This tolerance applies both to the maximum violation of bounds on variables and to the difference between the right-hand sides and left-hand sides of constraints. The value of number can be any value between 1E–4 and 1E–9, inclusive. However, the value of number cannot be larger than the integer feasibility tolerance. If the value of number is larger than the value of the INTTOL= option, then PROC OPTMILP sets FEASTOL= to the value of INTTOL=. The default value is 1E–6.
If PROC OPTMILP fails to find a feasible solution within this tolerance but does find a solution that has some violation, then the procedure stops with a solution status of OPTIMAL_COND (see the section Macro Variable _OROPTMILP_).
-
INTTOL=number
INTEGERTOLERANCE=number specifies the amount by which an integer variable value can differ from an integer and still be considered integer feasible. The value of number can be any number between 1E–9 and 0.5, inclusive. PROC OPTMILP attempts to find an optimal solution whose integer infeasibility is less than number. The default value is 1E–5.
If the best solution that PROC OPTMILP finds has an integer infeasibility larger than the value of number, then PROC OPTMILP stops with a solution status of OPTIMAL_COND (see the section Macro Variable _OROPTMILP_).
-
LOGFREQ=k
PRINTFREQ=k prints information in the node log every k seconds, where k is any nonnegative integer up to the largest four-byte signed integer, which is . If k=0, then the node log is disabled. If k is positive, then the root node processing information is printed and, if possible, an entry is made every k seconds. An entry is also made each time a better integer solution is found.
By default, LOGFREQ=5.
- LOGLEVEL=NONE | BASIC | MODERATE | AGGRESSIVE
controls the amount of information displayed in the SAS log by the solver. You can specify the following values:
- NONE
turns off all solver-related messages in the SAS log.
- BASIC
displays a solver summary after stopping.
- MODERATE
prints a solver summary and a node log at the interval specified in the LOGFREQ= option.
- AGGRESSIVE
prints a detailed solver summary and a node log at the interval specified in the LOGFREQ= option.
By default, LOGLEVEL=MODERATE.
- MAXNODES=number
specifies the maximum number of branch-and-bound nodes to be processed, where number can be any nonnegative integer up to the largest four-byte signed integer, which is . The default value is . If you run PROC OPTMILP in concurrent mode, then the procedure stops as soon as number is reached on any machine. If you run PROC OPTMILP in distributed mode, then the procedure periodically checks and stops as soon as the total number of nodes that are processed by all grid nodes exceeds number.
- MAXSOLS=number
specifies a stopping criterion, where number can be any positive integer up to the largest four-byte signed integer, which is . If number of solutions have been found, then the procedure stops. The default value of number is .
- MAXTIME=t
specifies an upper limit of t seconds of time for reading in the data and performing the optimization process. The value of the TIMETYPE= option determines the type of units used. If you do not specify MAXTIME= option, the procedure does not stop based on the amount of time elapsed. If concurrent or distributed mode of PROC OPTMILP is enabled, then the procedure stops as soon as t is reached on any machine. The value of t can be any positive number; the default value is the largest number that can be represented by a double.
- OPTTOL=number
specifies the tolerance that is used to determine the optimality of nodes in the branch-and-bound tree. The value of number can be any value between (and including) 1E–4 and 1E–9. The default value is 1E–6.
- PRINTLEVEL=0 1 2
specifies whether to print a summary of the problem and solution. You can specify the following values:
- 0
does not produce or print any Output Delivery System (ODS) tables.
- 1
produces and prints the following ODS tables: ProblemSummary and SolutionSummary.
- 2
produces and prints the following ODS tables: ProblemSummary, SolutionSummary, ProblemStatistics, and Timing table.
By default, PRINTLEVEL=1.
For more information about the ODS tables created by PROC OPTMILP, see the section ODS Tables.
- PROBE=AUTOMATIC | NONE | MODERATE | AGGRESSIVE
specifies the probing strategy. You can specify the following values:
- AUTOMATIC
uses the probing strategy that is determined by PROC OPTMILP.
- NONE
disables probing.
- MODERATE
uses probing moderately.
- AGGRESSIVE
uses probing aggressively.
By default, PROBE=AUTOMATIC. For more information, see the section Presolve and Probing.
- RELOBJGAP=number
specifies a stopping criterion based on the best integer objective (BestInteger) and the best bound on the objective function value (BestBound). The relative objective gap is equal to
When this value becomes smaller than the specified gap size number, the procedure stops. The value of number can be any nonnegative number; the default value is 1E–4.
- SCALE=AUTOMATIC | NONE
indicates whether to scale the problem matrix. You can specify the following values:
- AUTOMATIC
scales the matrix as determined by PROC OPTMILP.
- NONE
disables scaling.
By default, SCALE=AUTOMATIC.
- SEED=number
specifies the initial seed of the random number generator. This option affects the perturbation in the simplex solvers; thus it might result in a different optimal solution and a different solver path. This option usually has a significant, but unpredictable, effect on the solution time. The value of number can be any positive integer up to the largest four-byte signed integer, which is . The default value of the seed is 100.
- TARGET=number
specifies a stopping criterion for a minimization or maximization problem. If the best integer objective is better than or equal to number, the procedure stops. The value of number can be any number; the default value is the largest (in magnitude) negative number (for a minimization problem) or the largest (in magnitude) positive number (for a maximization problem) that can be represented by a double.
- TIMETYPE=CPU | REAL
specifies whether CPU time or real time is used for the MAXTIME= option and the _OROPTMILP_ macro variable in a PROC OPTMILP call. You can specify the following values:
- CPU
specifies that units are in CPU time.
- REAL
specifies that units are in real time.
By default, TIMETYPE=REAL.
Heuristics Option
- HEURISTICS=AUTOMATIC | NONE | BASIC | MODERATE | AGGRESSIVE
controls the level of primal heuristics applied by PROC OPTMILP. This level determines how frequently primal heuristics are applied during the branch-and-bound tree search. It also affects the maximum number of iterations allowed in iterative heuristics. Some computationally expensive heuristics might be disabled by the solver at less aggressive levels. You can specify the following values:
- AUTOMATIC
applies the default level of heuristics, similar to MODERATE.
- NONE
disables all primal heuristics. This value does not disable the heuristics that repair an infeasible input solution that is specified in a PRIMALIN= data table.
- BASIC
applies basic primal heuristics at low frequency.
- MODERATE
applies most primal heuristics at moderate frequency.
- AGGRESSIVE
applies all primal heuristics at high frequency.
By default, HEURISTICS=AUTOMATIC. For more information about primal heuristics, see the section Primal Heuristics.
Search Options
- CONFLICTSEARCH=AUTOMATIC | NONE | MODERATE | AGGRESSIVE
specifies the level of conflict search performed by PROC OPTMILP. Conflict search is used to find clauses resulting from infeasible subproblems that arise in the search tree. You can specify the following values:
- AUTOMATIC
performs conflict search based on a strategy that is determined by PROC OPTMILP.
- NONE
disables conflict search.
- MODERATE
performs a moderate conflict search.
- AGGRESSIVE
performs an aggressive conflict search.
By default, CONFLICTSEARCH=AUTOMATIC.
- NODESEL=AUTOMATIC | BESTBOUND | BESTESTIMATE | DEPTH
specifies the node selection strategy. You can specify the following values:
- AUTOMATIC
uses automatic node selection.
- BESTBOUND
chooses the node with the best relaxed objective (best-bound-first strategy).
- BESTESTIMATE
chooses the node with the best estimate of the integer objective value (best-estimate-first strategy).
- DEPTH
chooses the most recently created node (depth-first strategy).
By default, NODESEL=AUTOMATIC. For more information about node selection, see the section Node Selection.
- PRIORITY=TRUE | FALSE
indicates whether to use specified branching priorities for integer variables. You can specify the following values:
- TRUE
uses priorities when they exist.
- FALSE
ignores variable priorities.
By default, PRIORITY=TRUE. For more information, see the section Branching Priorities.
- RESTARTS=AUTOMATIC | NONE | BASIC | MODERATE | AGGRESSIVE
specifies the strategy for restarting the processing of the root node. You can specify the following values:
- AUTOMATIC
uses a restarting strategy determined by PROC OPTMILP.
- NONE
disables restarting.
- BASIC
uses a basic restarting strategy.
- MODERATE
uses a moderate restarting strategy.
- AGGRESSIVE
uses an aggressive restarting strategy.
By default, RESTARTS=AUTOMATIC.
- STRONGITER=number | AUTOMATIC
specifies the number of simplex iterations performed for each variable in the candidate list when using the strong branching variable selection strategy. The value of number can be any positive integer up to the largest four-byte signed integer, which is . If you specify the keyword AUTOMATIC, PROC OPTMILP uses the default value; this value is calculated automatically.
- STRONGLEN=number | AUTOMATIC
specifies the number of candidates used when performing the strong branching variable selection strategy. The value of number can be any positive integer up to the largest four-byte signed integer, which is . If you specify the keyword AUTOMATIC, PROC OPTMILP uses the default value; this value is calculated automatically.
- SYMMETRY=AUTOMATIC | NONE | BASIC | MODERATE | AGGRESSIVE
specifies the level of symmetry detection. Symmetry detection identifies groups of equivalent decision variables and uses this information to solve the problem more efficiently. You can specify the following values:
- AUTOMATIC
performs symmetry detection based on a strategy that is determined by PROC OPTMILP.
- NONE
disables symmetry detection.
- BASIC
performs a basic symmetry detection.
- MODERATE
performs a moderate symmetry detection.
- AGGRESSIVE
performs an aggressive symmetry detection.
By default, SYMMETRY=AUTOMATIC. For more information about symmetry detection, see (Ostrowski 2008).
- VARSEL=AUTOMATIC | MAXINFEAS | MININFEAS | PSEUDO | STRONG
specifies the rule for selecting the branching variable. You can specify the following values:
- AUTOMATIC
uses automatic branching variable selection.
- MAXINFEAS
chooses the variable with maximum infeasibility.
- MININFEAS
chooses the variable with minimum infeasibility.
- PSEUDO
chooses a branching variable based on pseudocost.
- STRONG
uses a strong branching variable selection strategy.
By default, VARSEL=AUTOMATIC. For details about variable selection, see the section Variable Selection.
Cut Options
Table 7.2 describes the string values for the cut options in PROC OPTMILP.
Table 7.2: Values for Individual Cut Options
string | Description |
|---|---|
AUTOMATIC | Generates cutting planes based on a strategy determined by PROC OPTMILP |
NONE | Disables generation of cutting planes |
MODERATE | Uses a moderate cut strategy |
AGGRESSIVE | Uses an aggressive cut strategy |
You can specify the CUTSTRATEGY= option to set the overall aggressiveness of the cut generation in PROC OPTMILP. Alternatively, you can use the ALLCUTS= option to set all cut types to the same level. You can override the ALLCUTS= value by using the options that correspond to particular cut types. For example, if you want PROC OPTMILP to generate only Gomory cuts, specify ALLCUTS=NONE and CUTGOMORY=AUTOMATIC. If you want to generate all cuts aggressively but generate no lift-and-project cuts, set ALLCUTS=AGGRESSIVE and CUTLAP=NONE.
- ALLCUTS=AUTOMATIC | NONE | MODERATE | AGGRESSIVE
provides a shorthand way of setting all the cuts-related options in one setting. In other words, ALLCUTS=string is equivalent to setting each of the individual cuts parameters to the same value string. Thus, ALLCUTS=AUTOMATIC has the effect of setting CUTCLIQUE=AUTOMATIC, CUTFLOWCOVER=AUTOMATIC, …, and CUTZEROHALF=AUTOMATIC. Table 7.2 lists the values that can be assigned to string. In addition, you can override levels for individual cuts with the CUTCLIQUE=, CUTFLOWCOVER=, CUTFLOWPATH=, CUTGOMORY=, CUTGUB=, CUTIMPLIED=, CUTKNAPSACK=, CUTLAP=, CUTMILIFTED=, CUTMIR=, CUTMULTICOMMODITY=, and CUTZEROHALF= options. If the ALLCUTS= option is not specified, all the cuts-related options are either set to their individually specified values (if the corresponding option is specified) or to their default values (if that option is not specified).
- CUTCLIQUE=AUTOMATIC | NONE | MODERATE | AGGRESSIVE
specifies the level of clique cuts generated by PROC OPTMILP. Table 7.2 describes the possible values. This option overrides the ALLCUTS= option. By default, CUTCLIQE=AUTOMATIC.
- CUTFLOWCOVER=AUTOMATIC | NONE | MODERATE | AGGRESSIVE
specifies the level of flow cover cuts generated by PROC OPTMILP. Table 7.2 describes the possible values. This option overrides the ALLCUTS= option. By default, CUTFLOWCOVER=AUTOMATIC.
- CUTFLOWPATH=AUTOMATIC | NONE | MODERATE | AGGRESSIVE
specifies the level of flow path cuts generated by PROC OPTMILP. Table 7.2 describes the possible values. This option overrides the ALLCUTS= option. By default, CUTFLOWPATH=AUTOMATIC.
- CUTGOMORY=AUTOMATIC | NONE | MODERATE | AGGRESSIVE
specifies the level of Gomory cuts generated by PROC OPTMILP. Table 7.2 describes the possible values. This option overrides the ALLCUTS= option. By default, CUTGOMORY=AUTOMATIC.
- CUTGUB=AUTOMATIC | NONE | MODERATE | AGGRESSIVE
specifies the level of generalized upper bound (GUB) cover cuts generated by PROC OPTMILP. Table 7.2 describes the possible values. This option overrides the ALLCUTS= option. By default, CUTGUB=AUTOMATIC.
- CUTIMPLIED=AUTOMATIC | NONE | MODERATE | AGGRESSIVE
specifies the level of implied bound cuts generated by PROC OPTMILP. Table 7.2 describes the possible values. This option overrides the ALLCUTS= option. By default, CUTIMPLIED=AUTOMATIC.
- CUTKNAPSACK=AUTOMATIC | NONE | MODERATE | AGGRESSIVE
specifies the level of knapsack cover cuts generated by PROC OPTMILP. Table 7.2 describes the possible values. This option overrides the ALLCUTS= option. By default, CUTKNAPSACK=AUTOMATIC.
- CUTLAP=AUTOMATIC | NONE | MODERATE | AGGRESSIVE
specifies the level of lift-and-project (LAP) cuts generated by PROC OPTMILP. Table 7.2 describes the possible values. This option overrides the ALLCUTS= option. By default, CUTLAP=NONE.
- CUTMILIFTED=AUTOMATIC | NONE | MODERATE | AGGRESSIVE
specifies the level of mixed lifted 0-1 cuts that are generated by PROC OPTMILP. Table 7.2 describes the possible values. This option overrides the ALLCUTS= option. By default, CUTMILIFTED=AUTOMATIC.
- CUTMIR=AUTOMATIC | NONE | MODERATE | AGGRESSIVE
specifies the level of mixed integer rounding (MIR) cuts generated by PROC OPTMILP. Table 7.2 describes the possible values. This option overrides the ALLCUTS= option. By default, CUTMIR=AUTOMATIC.
- CUTMULTICOMMODITY=AUTOMATIC | NONE | MODERATE | AGGRESSIVE
specifies the level of multicommodity network flow cuts generated by PROC OPTMILP. Table 7.2 describes the possible values. This option overrides the ALLCUTS= option. By default, CUTMULTICOMMODITY=AUTOMATIC.
- CUTSFACTOR=number
specifies a row multiplier factor for cuts. The number of cuts that are added is limited to number times the original number of rows. The value of number can be any nonnegative number less than or equal to 100; the default value is automatically calculated by PROC OPTMILP.
-
CUTSTRATEGY=AUTOMATIC | NONE | MODERATE | AGGRESSIVE
CUTS=AUTOMATIC | NONE | MODERATE | AGGRESSIVE specifies the overall aggressiveness of the cut generation in the procedure. By default, CUTSTRATEGY=AUTOMATIC. Setting a nondefault value adjusts a number of cut parameters such that the cut generation is none, moderate, or aggressive compared to the default value.
- CUTZEROHALF=AUTOMATIC | NONE | MODERATE | AGGRESSIVE
specifies the level of zero-half cuts that are generated by PROC OPTMILP. Table 7.2 describes the possible values. This option overrides the ALLCUTS= option. By default, CUTZEROHALF=AUTOMATIC.
Parallel Options
- CONCURRENT=TRUE | FALSE
specifies whether to enable concurrent mode for PROC OPTMILP. You can specify the following values:
- TRUE
runs PROC OPTMILP in concurrent mode. The solver automatically runs the same problem on each grid node with different PROC OPTMILP options.
- FALSE
runs default PROC OPTMILP.
By default, CONCURRENT=FALSE.
- DETERMINISTIC=TRUE | FALSE
specifies whether to enable PROC OPTMILP to run deterministically when distributed or concurrent mode is enabled. The DETERMINISTIC= option is valid only when the DISTRIBUTED= or CONCURRENT= option is specified. You can specify the following values:
- TRUE
runs PROC OPTMILP in deterministic distributed or concurrent mode. The procedure always returns the same solution for subsequent runs on the same grid.
- FALSE
runs PROC OPTMILP in nondeterministic distributed or concurrent mode.
By default, DETERMINISTIC=FALSE when you specify the CONCURRENT= option, and DETERMINISTIC=TRUE when you specify the DISTRIBUTED= option.
- DISTRIBUTED=TRUE | FALSE
specifies whether to run PROC OPTMILP in distributed mode. For more information about this option as it relates to the standard PROC OPTMILP, see the section Parallel Processing. For more information about this option as it relates to the decomposition algorithm, see Chapter 18: The Decomposition Algorithm. You can specify the following values:
- TRUE
runs PROC OPTMILP in distributed mode.
- FALSE
turns off distributed mode of PROC OPTMILP.
By default, DISTRIBUTED=FALSE.
- NTHREADS=number
specifies the maximum number of threads to use for multithreaded processing. The branch-and-cut algorithm can take advantage of multicore machines and can potentially run faster when number is greater than 1. The value of number can be any integer between 1 and 256, inclusive. The default is the number of cores on the machine that executes the process or the number of cores permissible based on your installation (whichever is less). The number of simultaneously active CPUs is limited by your installation and license configuration.