Hi,
then you could use a dvar array
.mod
{string} Gasolines = ...;
{string} Oils = ...;
tuple gasType {
float demand;
float price;
float octane;
float lead;
}
tuple oilType {
float capacity;
float price;
float octane;
float lead;
}
gasType Gas[Gasolines] = ...;
oilType Oil[Oils] = ...;
float MaxProduction = ...;
float ProdCost = ...;
dvar float+ a[Gasolines] in 2..2;
dvar float+ Blend[Oils][Gasolines];
dvar float obj[1..2];
maximize obj[1]+obj[2];
subject to {
obj[1]==sum( g in Gasolines , o in Oils )
(Gas[g].price - Oil[o].price - ProdCost) * Blend[o][g]
;
obj[2]==
- sum(g in Gasolines) a[g];
forall( g in Gasolines )
ctDemand:
sum( o in Oils )
Blend[o][g] == Gas[g].demand + 10*a[g];
forall( o in Oils )
ctCapacity:
sum( g in Gasolines )
Blend[o][g] <= Oil[o].capacity;
ctMaxProd:
sum( o in Oils , g in Gasolines )
Blend[o][g] <= MaxProduction;
forall( g in Gasolines )
ctOctane:
sum( o in Oils )
(Oil[o].octane - Gas[g].octane) * Blend[o][g] >= 0;
forall( g in Gasolines )
ctLead:
sum( o in Oils )
(Oil[o].lead - Gas[g].lead) * Blend[o][g] <= 0;
}
execute DISPLAY_REDUCED_COSTS{
for( var g in Gasolines ) {
writeln("a[",g,"].reducedCost = ",a[g].reducedCost);
}
}
.dat
SheetConnection sheet("oilSheet.xls");
Gasolines from SheetRead(sheet,"'gas data'!A2:A4");
Oils from SheetRead(sheet,"'oil data'!A2:A4");
Gas from SheetRead(sheet,"'gas data'!B2:E4");
Oil from SheetRead(sheet,"'oil data'!B2:E4");
MaxProduction = 14000;
ProdCost = 4;
a to SheetWrite(sheet,"RESULT!A2:A4");
Blend to SheetWrite(sheet,"RESULT!B2:D4");
obj to SheetWrite(sheet,"RESULT!E1:E2");
regards
#DecisionOptimization#OPLusingCPLEXOptimizer