The following PROC TRANSPOSE statements and DATA step create an input data set for the CLP procedure in SAS/OR software:
proc transpose data=a_data out=trans(drop=_name_) prefix=x;
run;
data condata_feas(drop=j);
length _type_ $8;
array x[&n];
set trans;
_type_ = 'le';
_rhs_ = &b;
output;
do j = 1 to &n;
x[j] = 1;
end;
_type_ = 'binary';
_rhs_ = .;
output;
run;
The following PROC CLP statements find all feasible solutions and save them in the out_feas data set:
proc clp data=condata_feas out=out_feas allsolns usecondatavars=1; run;
The following DATA step creates another input data set for PROC CLP, for the purpose of finding all binary solutions that violate the original constraint:
data condata_infeas;
set condata_feas;
if _N_ = 1 then do;
_type_ = 'ge';
_rhs_ = _rhs_ + 1;
end;
run;
The following PROC CLP statements find all such solutions and save them in the out_infeas data set:
proc clp data=condata_infeas out=out_infeas allsolns usecondatavars=1; run;
The first several PROC OPTMODEL statements declare sets and parameters and read the original constraint data:
proc optmodel;
set VARS;
set VARS0 = VARS union {0};
num a {VARS0};
read data a_data into VARS=[_N_] a;
a[0] = &b;
The following statements declare the FEAS_POINTS set and the x_feas parameter and populate them by reading the out_feas data set:
set FEAS_POINTS;
num x_feas {FEAS_POINTS, VARS};
read data out_feas into FEAS_POINTS=[_N_]
{j in VARS} <x_feas[_N_,j]=col('x'||j)>;
The following statements declare the INFEAS_POINTS set and the x_infeas parameter and populate them by reading the out_infeas data set:
set INFEAS_POINTS;
num x_infeas {INFEAS_POINTS, VARS};
read data out_infeas into INFEAS_POINTS=[_N_]
{j in VARS} <x_infeas[_N_,j]=col('x'||j)>;
The following statements declare the variables and constraints:
var Scale {VARS0} >= 0;
impvar Alpha {j in VARS0} = a[j] * Scale[j];
con Feas_con {point in FEAS_POINTS}:
sum {j in VARS} Alpha[j] * x_feas[point,j] <= Alpha[0];
con Infeas_con {point in INFEAS_POINTS}:
sum {j in VARS} Alpha[j] * x_infeas[point,j] >= Alpha[0] + 1;
The following statements solve the problem by using the first objective and then print the solution:
min Objective1 = abs(a[0]) * Scale[0]; solve; print a Scale Alpha;
Figure 19.1 shows the output from the linear programming solver for the first objective.
Figure 19.1: Output from Linear Programming Solver, First Objective
| Problem Summary | |
|---|---|
| Objective Sense | Minimization |
| Objective Function | Objective1 |
| Objective Type | Linear |
| Number of Variables | 9 |
| Bounded Above | 0 |
| Bounded Below | 9 |
| Bounded Below and Above | 0 |
| Free | 0 |
| Fixed | 0 |
| Number of Constraints | 256 |
| Linear LE (<=) | 152 |
| Linear EQ (=) | 0 |
| Linear GE (>=) | 104 |
| Linear Range | 0 |
| Constraint Coefficients | 1280 |
| Performance Information | |
|---|---|
| Execution Mode | Single-Machine |
| Number of Threads | 1 |
| Solution Summary | |
|---|---|
| Solver | LP |
| Algorithm | Dual Simplex |
| Objective Function | Objective1 |
| Solution Status | Optimal |
| Objective Value | 25 |
| Primal Infeasibility | 4.218847E-15 |
| Dual Infeasibility | 0 |
| Bound Infeasibility | 0 |
| Iterations | 24 |
| Presolve Time | 0.02 |
| Solution Time | 0.02 |
| [1] | a | Scale | Alpha |
|---|---|---|---|
| 0 | 37 | 0.67568 | 25 |
| 1 | 9 | 0.66667 | 6 |
| 2 | 13 | 0.69231 | 9 |
| 3 | -14 | 0.71429 | -10 |
| 4 | 17 | 0.70588 | 12 |
| 5 | 13 | 0.69231 | 9 |
| 6 | -19 | 0.68421 | -13 |
| 7 | 23 | 0.69565 | 16 |
| 8 | 21 | 0.66667 | 14 |
The following statements solve the problem by using the second objective and then print the solution:
min Objective2 = sum {j in VARS} abs(a[j]) * Scale[j];
solve;
print a Scale Alpha;
quit;
Figure 19.2 shows the output from the linear programming solver for the second objective.
Figure 19.2: Output from Linear Programming Solver, Second Objective
| Problem Summary | |
|---|---|
| Objective Sense | Minimization |
| Objective Function | Objective2 |
| Objective Type | Linear |
| Number of Variables | 9 |
| Bounded Above | 0 |
| Bounded Below | 9 |
| Bounded Below and Above | 0 |
| Free | 0 |
| Fixed | 0 |
| Number of Constraints | 256 |
| Linear LE (<=) | 152 |
| Linear EQ (=) | 0 |
| Linear GE (>=) | 104 |
| Linear Range | 0 |
| Constraint Coefficients | 1280 |
| Performance Information | |
|---|---|
| Execution Mode | Single-Machine |
| Number of Threads | 1 |
| Solution Summary | |
|---|---|
| Solver | LP |
| Algorithm | Dual Simplex |
| Objective Function | Objective2 |
| Solution Status | Optimal |
| Objective Value | 89 |
| Primal Infeasibility | 4.218847E-15 |
| Dual Infeasibility | 0 |
| Bound Infeasibility | 0 |
| Iterations | 21 |
| Presolve Time | 0.02 |
| Solution Time | 0.02 |
| [1] | a | Scale | Alpha |
|---|---|---|---|
| 0 | 37 | 0.67568 | 25 |
| 1 | 9 | 0.66667 | 6 |
| 2 | 13 | 0.69231 | 9 |
| 3 | -14 | 0.71429 | -10 |
| 4 | 17 | 0.70588 | 12 |
| 5 | 13 | 0.69231 | 9 |
| 6 | -19 | 0.68421 | -13 |
| 7 | 23 | 0.69565 | 16 |
| 8 | 21 | 0.66667 | 14 |
For this test instance, it turns out that the optimal solutions for the two different objectives agree.