Quartz | Level 8

## Help Wanted: Coding a Constraint

I'm working to develop a general optimization approach for aiming a network of meteor cameras. The goal of this particular version of the model is to find the optimal orientation of 5 stations.

I would like to include a "constraint" in the model such that the optimal solution does not allow selected stations to be oriented in the same direction. To wit: given five stations (A,B,C,D and E), where Stations A and B are co-located as are Stations C and D (at a different location than A,B). How do I code a constraint that prohibits solutions where stations A,B have the same orientation and stations C,D have the same orientation?

The code below is the current Proc Optmodel statement that I am using.

Many thanks in advance for any guidance you can provide.

Regards,

Gene

``````Proc Optmodel;
/* Read CoverageMatrix data into index sets*/
set <str> stations;
/*
/*						Modify Orientations below to reflect addition of elevation angles of 40 and 50 degrees */
set <str> ORIENTATIONS=/'360/55' '360/50' '360/45' '360/40' '360/35' '45/55' '45/50'
'45/45' '45/40' '45/35' '90/55' '90/50' '90/45' '90/40' '90/35' '135/55' '135/50'
'135/45' '135/40' '135/35' '180/55' '180/50' '180/45' '180/40' '180/35' '225/55'
'225/50' '225/45' '225/40' '225/35' '270/55' '270/50' '270/45' '270/40' '270/35'
'315/55' '315/50' '315/45' '315/40' '315/35'/;

set <str> Targets;
num Matrix {stations, ORIENTATIONS, TARGETS};
read data work.RoOMatrix into [station orientation target]
Matrix=k;

/* Set Constants*/
/* optimal number of cameras covering each target*/
%Let k=3;
num k=&k;
/*Declare Variables*/
var CHI {stations, ORIENTATIONS} binary;
var IsTriplyCovered {TARGETS} binary;
impvar XIT{target in TARGETS}=sum{station in stations, orientation in
orientations} matrix[station, orientation, target] *Chi[station,
orientation];

/* Declare Model*/
max NumTriplyCovered=sum{t in TARGETS} IsTriplyCovered[t];

/*Subject to Following Constraints*/
con CHI_constraint {station in stations}:
sum{orientation in ORIENTATIONS}CHI[station, orientation] <=1;
con TriplyCoveredCon {t in TARGETS}: XIT[t] >=k * IsTriplyCovered[t];

/* Call Solver and Save Results:*/
solve with milp/ relobjgap=&relobjgap;
/* 						solve; */
create data work.OptimalSolution_&RoO from
[station orientation]={c in stations, o in orientations: CHI[c, o]>0.5} CHI;
quit;
/*Print Results*/
proc print data=work.optimalsolution_&RoO;
Title "Optimal Solution RoO=&RoO x &RoO km";
run;``````
1 ACCEPTED SOLUTION

Accepted Solutions
SAS Super FREQ

## Re: Help Wanted: Coding a Constraint

If I understand correctly, you want to include the following "conflict" constraints that prohibit both binary variables from taking the value 1 simultaneously:

``````   set STATION_PAIRS = {<'A','B'>, <'C','D'>};
con NotSameOrientation {<s1,s2> in STATION_PAIRS, o in ORIENTATIONS}:
CHI[s1,o] + CHI[s2,o] <= 1;
``````
2 REPLIES 2
SAS Super FREQ

## Re: Help Wanted: Coding a Constraint

If I understand correctly, you want to include the following "conflict" constraints that prohibit both binary variables from taking the value 1 simultaneously:

``````   set STATION_PAIRS = {<'A','B'>, <'C','D'>};
con NotSameOrientation {<s1,s2> in STATION_PAIRS, o in ORIENTATIONS}:
CHI[s1,o] + CHI[s2,o] <= 1;
``````
Quartz | Level 8

## Re: Help Wanted: Coding a Constraint

Thanks, Rob!  I implemented your suggested code and it works perfectly. This was a big help.  I'm marking your solution as accepted.  Thanks again for your help with this.

Gratefully,

Gene

Discussion stats
• 2 replies
• 219 views
• 2 likes
• 2 in conversation