AMPL input:
model; # Alloy Bidding stochastic programming problem
set I := 1..4; # Suppliers of alloy
set S := {'noStrike','strike'}; # Scenarios
var a {I} >= 0; # lbs of alloy to buy from supplier i in I
var x {I,S} >= 0; # extra lbs to order under scenario S from supplier I
var y binary; # 0 = don't use x[3,*], 1 = do use
var z {S}; # Cost of strategy under scenario s in S
param C {I} ; # standard alloy cost
param P {I} ; # premium alloy cost
param U {I} ; # max alloy available from supplier
param L3; # min purchase amount from supplier 3 if using on-demand
param Prob{S}; # probability of scenario S
param Pct90; # 90th percentile for demand
minimize ExpectedCost: sum {s in S} Prob[s]*z[s];
subject to CalcZ1:
z['noStrike'] = sum {i in I} C[i]*a[i] + sum {i in 3..4} P[i]*x[i,'noStrike'];
subject to CalcZ2:
z['strike'] = sum {i in 2..4} C[i]*a[i] + sum {i in 3..4} P[i]*x[i,'strike'];
subject to Chance1: # Chance constraint for scenario 1
sum {i in I} a[i] + sum {i in 3..4} x[i,'noStrike'] >= Pct90;
subject to Chance2: # Chance constraint for scenario 2
sum {i in 2..4 } a[i] + sum {i in 3..4} x[i,'strike'] >= Pct90;
subject to SupplierLimit {i in I, s in S}: # Max purchases from suppliers
a[i] + x[i,s] <= U[i];
subject to Sup3Upper {s in S}: # Upper use of supplier 3's premium service
x[3,s] <= U[3]*y;
subject to Sup3Lower {s in S}: # Lower use of supplier 3's premium service
a[3]+x[3,s] >= L3*y;
subject to NoPremium1 {i in 1..2, s in S}: # No on-demand from supplier
x[i,s] = 0;
data;
param: C P U :=
1 9.80 . 20000
2 9.90 . 30000
3 10.2 11.22 30000
4 10.6 12.72 50000
;
param L3 := 15000;
param: Prob :=
noStrike .90
strike .10
;
param Pct90 := 41000;
solve;
display a,x,y,z;
AMPL output: