The OPTMILP Procedure

PROC OPTMILP Statement

PROC OPTMILP <options> ;

You can specify the following options in the PROC OPTMILP statement.

Data Set Options

DATA=SAS-data-set

specifies the input data set that corresponds to the MILP model. If this option is not specified, PROC OPTMILP uses the most recently created SAS data set. See Chapter 16: The MPS-Format SAS Data Set, for more details about the input data set.

DUALOUT=SAS-data-set
DOUT=SAS-data-set

specifies the output data set to contain the constraint activities.

OBJSENSE=MIN $\mid $ 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 set. This option supersedes the objective sense specified in the input data set. If the objective sense is not specified anywhere, then PROC OPTMILP interprets and solves the MILP as a minimization problem.

PRIMALIN=SAS-data-set

enables you to input a warm start solution in a SAS data set. PROC OPTMILP validates both the data set and the solution stored in the data set. If the data set is not valid, then the PRIMALIN= data are ignored. If the solution stored in a valid PRIMALIN= data set 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 set 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.

PRIMALOUT=SAS-data-set
POUT=SAS-data-set

specifies the output data set for the primal solution. This data set contains the primal solution information. See the section Data Input and Output for details.

Presolve Option

PRESOLVER=number | string

specifies a presolve string or its corresponding value number, as listed in Table 12.2.

Table 12.2: Values for PRESOLVER= Option

number

string

Description

–1

AUTOMATIC

Applies the default level of presolve processing

0

NONE

Disables presolver

1

BASIC

Performs minimal presolve processing

2

MODERATE

Applies a higher level of presolve processing

3

AGGRESSIVE

Applies the highest level of presolve processing


The default value is AUTOMATIC.

Control Options

ABSOBJGAP=number

specifies a stopping criterion. When the absolute difference between the best integer objective and the objective of the best remaining node 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 with an objective value above (below) number. The value of number can be any number; the default value is the positive (negative) number that has the largest absolute value that can be represented in your operating environment.

EMPHASIS=number | string

specifies a search emphasis string or its corresponding value number as listed in Table 12.3.

Table 12.3: Values for EMPHASIS= Option

number

string

Description

0

BALANCE

Performs a balanced search

1

OPTIMAL

Emphasizes optimality over feasibility

2

FEASIBLE

Emphasizes feasibility over optimality


The default value is BALANCE.

FEASTOL=number

specifies the tolerance used 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 (and including) 1E–4 and 1E–9. The default value is 1E–6.

If PROC OPTMILP fails to find a feasible solution within this tolerance but does find a solution with a slightly larger violation, then the procedure ends with a solution status of OPTIMAL_COND (see the section Macro Variable _OROPTMILP_).

INTTOL=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 0.0 and 0.5. PROC OPTMILP attempts to find an optimal solution whose integer infeasibility is less than number. If you assign a value smaller than 1E–10 to number and the best solution found by PROC OPTMILP has integer infeasibility between number and 1E–10, then PROC OPTMILP ends with a solution status of OPTIMAL_COND (see the section Macro Variable _OROPTMILP_). The default value is 1E–5.

LOGFREQ=number
PRINTFREQ=number

specifies how often information is printed in the node log. The value of number can be any nonnegative integer up to the largest four-byte signed integer, which is $2^{31} - 1$. The default value is 100. If number is set to 0, then the node log is disabled. If number is positive, then an entry is made in the node log at the first node, at the last node, and at intervals dictated by the value of number. An entry is also made each time a better integer solution is found.

LOGLEVEL=number | string
PRINTLEVEL2=number | string

controls the amount of information displayed in the SAS log by the solver, from a short description of presolve information and summary to details at each node. Table 12.4 describes the valid values for this option.

Table 12.4: Values for LOGLEVEL= Option

number

string

Description

0

NONE

Turns off all solver-related messages in the SAS log

1

BASIC

Displays a solver summary after stopping

2

MODERATE

Prints a solver summary and a node log by using the interval dictated by the LOGFREQ= option

3

AGGRESSIVE

Prints a detailed solver summary and a node log by using the interval dictated by the LOGFREQ= option


The default value is MODERATE.

MAXNODES=number

specifies the maximum number of branch-and-bound nodes to be processed. The value of number can be any nonnegative integer up to the largest four-byte signed integer, which is $2^{31} - 1$. The default value is $2^{31} - 1$.

MAXSOLS=number

specifies a stopping criterion. If number solutions have been found, then the procedure stops. The value of number can be any positive integer up to the largest four-byte signed integer, which is $2^{31} - 1$. The default value is $2^{31} - 1$.

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 this option, the procedure does not stop based on the amount of time elapsed. The value of t can be any positive number; the default value is the positive number that has the largest absolute value that can be represented in your operating environment.

OPTTOL=number

specifies the tolerance 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.

PARALLEL=number | string  (Experimental)

specifies whether to enable or disable parallel processing of the branch-and-cut algorithm. Table 12.5 describes the valid values of the PARALLEL= option.

Table 12.5: Values for PARALLEL= Option

number

string

Description

0

OFF

Disables parallel processing of the branch-and-cut algorithm

1

ON

Enables parallel processing of the branch-and-cut algorithm


The default value is 0. You can specify options that control parallel processing in the PERFORMANCE statement, which is documented in the section PERFORMANCE Statement in Chapter 4: Shared Concepts and Topics.

PRINTLEVEL=0 $\mid $ 1 $\mid $ 2

specifies whether a summary of the problem and solution should be printed. If PRINTLEVEL=1, then the Output Delivery System (ODS) tables ProblemSummary, SolutionSummary, and PerformanceInfo are produced and printed. If PRINTLEVEL=2, then the same tables are produced and printed along with an additional table called ProblemStatistics. If PRINTLEVEL=0, then no ODS tables are produced or printed. The default value is 1.

For details about the ODS tables created by PROC OPTMILP, see the section ODS Tables.

PROBE=number | string

specifies a probing string or its corresponding value number, as listed in Table 12.6:

Table 12.6: Values for PROBE= Option

number

string

Description

–1

AUTOMATIC

Uses the probing strategy determined by PROC OPTMILP

0

NONE

Disables probing

1

MODERATE

Uses the probing moderately

2

AGGRESSIVE

Uses the probing aggressively


The default value is AUTOMATIC. See the section Presolve and Probing for more information.

RELOBJGAP=number

specifies a stopping criterion based on the best integer objective (BestInteger) and the objective of the best remaining node (BestBound). The relative objective gap is equal to

\[ \mid \mbox{BestInteger} - \mbox{BestBound}\mid / \left(\mbox{1E--10}~  + \mid \mbox{BestBound}\mid \right) \]

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=number | string

indicates whether to scale the problem matrix. SCALE= can take either of the values AUTOMATIC (–1) and NONE (0). SCALE=AUTOMATIC scales the matrix as determined by PROC OPTMILP; SCALE=NONE disables scaling. The default value is 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 $2^{31} - 1$. The default value of the seed is 100.

TARGET=number

specifies a stopping criterion for minimization (maximization) problems. 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 negative (positive) number that has the largest absolute value representable in your operating environment.

TIMETYPE=number | string

specifies whether CPU time or real time is used for the MAXTIME= option and the _OROPTMILP_ macro variable in a PROC OPTMILP call. Table 12.7 describes the valid values of the TIMETYPE= option.

Table 12.7: Values for TIMETYPE= Option

number

string

Description

0

CPU

Specifies units of CPU time

1

REAL

Specifies units of real time


The default value of the TIMETYPE= option depends on the algorithm used and on various options. When the solver is used with distributed or multithreaded processing, then by default TIMETYPE= REAL. Otherwise, by default TIMETYPE= CPU. Table 12.8 describes the detailed logic for determining the default; the first context in the table that applies determines the default value. The NTHREADS= and NODES= options are specified in the PERFORMANCE statement. For more information about the NTHREADS= and NODES= options, see the section PERFORMANCE Statement in Chapter 4: Shared Concepts and Topics.

Table 12.8: Default Value for TIMETYPE= Option

Context

Default

PARALLEL= 0

CPU

NODES= value is nonzero for the decomposition algorithm

REAL

NTHREADS= value is greater than 1

REAL

NTHREADS= 1

CPU


Heuristics Option

HEURISTICS=number | string

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. The values of string and the corresponding values of number are listed in Table 12.9.

Table 12.9: Values for HEURISTICS= Option

number

string

Description

–1

AUTOMATIC

Applies the default level of heuristics, similar to MODERATE

0

NONE

Disables all primal heuristics

1

BASIC

Applies basic primal heuristics at low frequency

2

MODERATE

Applies most primal heuristics at moderate frequency

3

AGGRESSIVE

Applies all primal heuristics at high frequency


Setting HEURISTICS=NONE does not disable the heuristics that repair an infeasible input solution that is specified in a PRIMALIN= data set.

The default value of the HEURISTICS= option is AUTOMATIC. For details about primal heuristics, see the section Primal Heuristics.

Search Options

CONFLICTSEARCH=number | string

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. The values of string and the corresponding values of number are listed in Table 12.10.

Table 12.10: Values for CONFLICTSEARCH= Option

number

string

Description

–1

AUTOMATIC

Performs conflict search based on a strategy determined by PROC OPTMILP

0

NONE

Disables conflict search

1

MODERATE

Performs a moderate conflict search

2

AGGRESSIVE

Performs an aggressive conflict search


The default value is AUTOMATIC.

NODESEL=number | string

specifies the node selection strategy string or its corresponding value number, as listed in Table 12.11.

Table 12.11: Values for NODESEL= Option

number

string

Description

–1

AUTOMATIC

Uses automatic node selection

0

BESTBOUND

Chooses the node with the best relaxed objective (best-bound-first strategy)

1

BESTESTIMATE

Chooses the node with the best estimate of the integer objective value (best-estimate-first strategy)

2

DEPTH

Chooses the most recently created node (depth-first strategy)


The default value is AUTOMATIC. For details about node selection, see the section Node Selection.

PRIORITY=0 | 1

indicates whether to use specified branching priorities for integer variables. PRIORITY=0 ignores variable priorities; PRIORITY=1 uses priorities when they exist. The default value is 1. See the section Branching Priorities for details.

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 $2^{31} - 1$. If you specify the keyword AUTOMATIC or the value –1, 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 $2^{31} - 1$. If you specify the keyword AUTOMATIC or the value –1, PROC OPTMILP uses the default value; this value is calculated automatically.

SYMMETRY=number | string

specifies the level of symmetry detection. Symmetry detection identifies groups of equivalent decision variables and uses this information to solve the problem more efficiently. The values of string and the corresponding values of number are listed in Table 12.12.

Table 12.12: Values for SYMMETRY= Option

number

string

Description

–1

AUTOMATIC

Performs symmetry detection based on a strategy that is determined by PROC OPTMILP

0

NONE

Disables symmetry detection

1

BASIC

Performs a basic symmetry detection

2

MODERATE

Performs a moderate symmetry detection

3

AGGRESSIVE

Performs an aggressive symmetry detection


The default value is AUTOMATIC. For more information about symmetry detection, see (Ostrowski, 2008).

VARSEL=number | string

specifies the rule for selecting the branching variable. The values of string and the corresponding values of number are listed in Table 12.13.

Table 12.13: Values for VARSEL= Option

number

string

Description

–1

AUTOMATIC

Uses automatic branching variable selection

0

MAXINFEAS

Chooses the variable with maximum infeasibility

1

MININFEAS

Chooses the variable with minimum infeasibility

2

PSEUDO

Chooses a branching variable based on pseudocost

3

STRONG

Uses strong branching variable selection strategy


The default value is AUTOMATIC. For details about variable selection, see the section Variable Selection.

Cut Options

Table 12.14 describes the string and number values for the cut options in PROC OPTMILP.

Table 12.14: Values for Individual Cut Options

number

string

Description

–1

AUTOMATIC

Generates cutting planes based on a strategy determined by PROC OPTMILP

0

NONE

Disables generation of cutting planes

1

MODERATE

Uses a moderate cut strategy

2

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=number | string

provides a shorthand way of setting all the cuts-related options in one setting. In other words, ALLCUTS=number is equivalent to setting each of the individual cuts parameters to the same value number. Thus, ALLCUTS=–1 has the effect of setting CUTCLIQUE=–1, CUTFLOWCOVER=–1, CUTFLOWPATH=–1, …, CUTMIR=–1, and CUTZEROHALF=–1. Table 12.14 lists the values that can be assigned to string and number. In addition, you can override levels for individual cuts with the CUTCLIQUE=, CUTFLOWCOVER=, CUTFLOWPATH=, CUTGOMORY=, CUTGUB=, CUTIMPLIED=, CUTKNAPSACK=, CUTLAP=, CUTMILIFTED=, CUTMIR=, 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=number | string

specifies the level of clique cuts generated by PROC OPTMILP. Table 12.14 lists the values that can be assigned to string and number. The CUTCLIQUE= option overrides the ALLCUTS= option. The default value is AUTOMATIC.

CUTFLOWCOVER=number | string

specifies the level of flow cover cuts generated by PROC OPTMILP. Table 12.14 lists the values that can be assigned to string and number. The CUTFLOWCOVER= option overrides the ALLCUTS= option. The default value is AUTOMATIC.

CUTFLOWPATH=number | string

specifies the level of flow path cuts generated by PROC OPTMILP. Table 12.14 lists the values that can be assigned to string and number. The CUTFLOWPATH= option overrides the ALLCUTS= option. The default value is AUTOMATIC.

CUTGOMORY=number | string

specifies the level of Gomory cuts generated by PROC OPTMILP. Table 12.14 lists the values that can be assigned to string and number. The CUTGOMORY= option overrides the ALLCUTS= option. The default value is AUTOMATIC.

CUTGUB=number | string

specifies the level of generalized upper bound (GUB) cover cuts generated by PROC OPTMILP. Table 12.14 lists the values that can be assigned to string and number. The CUTGUB= option overrides the ALLCUTS= option. The default value is AUTOMATIC.

CUTIMPLIED=number | string

specifies the level of implied bound cuts generated by PROC OPTMILP. Table 12.14 lists the values that can be assigned to string and number. The CUTIMPLIED= option overrides the ALLCUTS= option. The default value is AUTOMATIC.

CUTKNAPSACK=number | string

specifies the level of knapsack cover cuts generated by PROC OPTMILP. Table 12.14 lists the values that can be assigned to string and number. The CUTKNAPSACK= option overrides the ALLCUTS= option. The default value is AUTOMATIC.

CUTLAP=number | string

specifies the level of lift-and-project (LAP) cuts generated by PROC OPTMILP. Table 12.14 lists the values that can be assigned to string and number. The CUTLAP= option overrides the ALLCUTS= option. The default value is NONE.

CUTMILIFTED=number | string

specifies the level of mixed lifted 0-1 cuts that are generated by PROC OPTMILP. Table 12.14 lists the values that can be assigned to option and num. The CUTMILIFTED= option overrides the ALLCUTS= option. The default value is AUTOMATIC.

CUTMIR=number | string

specifies the level of mixed integer rounding (MIR) cuts generated by PROC OPTMILP. Table 12.14 lists the values that can be assigned to string and number. The CUTMIR= option overrides the ALLCUTS= option. The default value is 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=number | string
CUTS=number | string

specifies the overall aggressiveness of the cut generation in the solver. Setting a nondefault value adjusts a number of cut parameters such that the cut generation is basic, moderate, or aggressive compared to the default value.

CUTZEROHALF=number | string

specifies the level of zero-half cuts that are generated by PROC OPTMILP. Table 12.14 lists the values that can be assigned to string and number.The CUTZEROHALF= option overrides the ALLCUTS= option. The default value is AUTOMATIC.