proc optmodel; set Plant = {'BFPLANT','SCPLANT'}; set DC = {'BO','NA','PR','SP','WO'}; set Region = {'BO','BR','CO','HA','MN','NA','NH','NL','PO','PR','SP','WO'}; number PLvarcost{Plant} = [2.00 0.75]; number PLcapacity{Plant} = [0 99999]; number incost{Plant,DC} = [ 3.40 3.00 4.40 3.04 3.36 4.80 5.25 5.12 4.00 4.20]; number DCvarcost{DC} = [1.5 0.95 1.05 1.10 1.12]; number DCfixcost{DC} = [11000 5000 9000 8000 7000]; number DCcapacity{DC} = [1000 500 1000 500 1000]; number outdistance{DC,Region} = [ 8 93 69 98 55 37 128 95 62 42 82 34 37 65 33 103 20 12 137 113 48 72 79 41 42 106 105 73 92 72 94 57 104 17 68 38 82 59 101 27 93 79 63 57 127 68 12 47 34 68 72 66 60 41 98 71 85 38 47 18]; number proximity{DC,Region} = [ 1 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 1 1 1]; number demand{Region} = [450 60 80 130 110 140 140 70 120 310 200 190]; number M = sum{j in Region}demand[j]; var open{DC} binary; var inflow{Plant,DC} >= 0; var outflow{DC,Region} >= 0; minimize TotalCost = /*Production variable costs*/ sum{i in Plant}PLvarcost[i]*sum{k in DC}inflow[i,k] + /*Central Warehouse Fixed Costs*/ sum{k in DC}DCfixcost[k]*open[k] + /*Central Warehouse Variable Costs*/ sum{k in DC}DCvarcost[k]*sum{j in Region}outflow[k,j] + /*Cost of incost transportation*/ sum{i in Plant,k in DC}inflow[i,k]*incost[i,k] + /*Cost of outdistance transportation*/ sum{k in DC,j in Region}outflow[k,j]*outdistance[k,j]*0.55; con PlantCapacitycon{i in Plant}: sum{k in DC}inflow[i,k]<=PLcapacity[i]; con DCCapacitycon{k in DC}: sum{j in Region}outflow[k,j]<=DCcapacity[k]; con Demandcon{j in Region}: sum{k in DC}outflow[k,j]>=demand[j]; con Balance{k in DC}: sum{i in Plant}inflow[i,k]=sum{j in Region}outflow[k,j]; con Linking{k in DC}: sum{j in Region}outflow[k,j]<=M*open[k]; con MINused: sum{k in DC}open[k]<=4; con MAXused: sum{k in DC}open[k]>=4; con AvgDistance: sum{k in DC,j in Region}outdistance[k,j]*outflow[k,j]<=50*M; con FiftyMiles: sum{k in DC,j in Region}proximity[k,j]*outflow[k,j]>=0.5*M; solve; print TotalCost open inflow outflow; quit;