Hi Jack,
Try this for question 3.
int BigM=99999999;
tuple TFreightTypes {
key string Destination;
key string VehicleType;
int TotalWeight;
key string Company;
int Cost;
};
tuple TOrders {
key int OrderNumber;
float Weight;
string ClientId;
string Destination;
string MaterialCategory;
int CategoryPriority;
};
{TFreightTypes} FreightTypes = ...;
{TOrders} Orders = ...;
{int} Set_CategoryPriority={o.CategoryPriority| o in Orders};
dvar boolean Assignment[Orders][FreightTypes];
dvar boolean x_dvb_OrderFreightType[Set_CategoryPriority][FreightTypes];
dvar int+ x_dvi_SlackOrderFreightType[Set_CategoryPriority];
//choose freight with total minimum cost
dexpr float objective =
sum(o in Orders, f in FreightTypes)
Assignment[o][f] * f.Cost;
//try to put all orders with CategoryPriority=1 on one truck
dexpr float objective1 =
BigM*sum(o in Set_CategoryPriority)x_dvi_SlackOrderFreightType[o];
minimize 0.95*objective+0.05*objective1;
subject to{
//c1: all order must be fulfilled
forall(o in Orders)
sum(f in FreightTypes) Assignment[o][f]==1;
//Remove this constraint
//I just added it to test the grouping high priority
forall(f in FreightTypes: f.VehicleType in {"Type1","Type2"})
sum(o in Orders) Assignment[o][f]<=1;
//Remove this constraint
//I just added it to test the grouping high priority
forall(f in FreightTypes: f.VehicleType =="Type3")
sum(o in Orders) Assignment[o][f]<=2;
//Important constraints
//The constraint new_cts_1 tries to put all orders with the same priority on one freight
//This is achieved by minimizing objective1 with is based on the integer variable x_dvi_SlackOrderFreightType
forall(o in Set_CategoryPriority)
new_cts_1:sum(f in FreightTypes)x_dvb_OrderFreightType[o][f]==1+x_dvi_SlackOrderFreightType[o];
//Link the new decision variables x_dvb_OrderFreightType and Assignment
forall(o in Orders,f in FreightTypes)
x_dvb_OrderFreightType[o.CategoryPriority][f]>=Assignment[o][f];
//
forall(categ in Set_CategoryPriority,f in FreightTypes)
x_dvb_OrderFreightType[categ][f]<=sum(o in Orders:
categ==o.CategoryPriority) Assignment[o][f];
}
execute
{
for(var o in Orders)
for(var f in FreightTypes)
if(Assignment[o][f]==1)
writeln("<","<",o.OrderNumber," ",
o.Weight," ",
o.ClientId," ",
o.Destination," ",
o.MaterialCategory," ",
o.CategoryPriority,">",
"<",f.Company," ",f.Cost," ",f.Destination, " ",f.VehicleType,">",">")
FreightTypes = {
<"LONDON","Type1",20000,"SP TRANSPORTS",20000>,
<"LONDON","Type2",20000,"SP TRANSPORTS",20000>,
<"DURHAM","Type3",10000,"SP TRANSPORTS",20000>,
};
Orders = {
<1,5000,"Client1","LONDON","A",0>,
<2,1000,"Client2","DURHAM","B",1>,
<3,2000,"Client3","LONDON","C",1>,
| Nourredine Hail, PhD in Applied Mathematics Senior Operations Research & Data Scientist Data Analytics Governance team Canadian Tire Corporation 2111 Steeles Avenue East, Brampton, ON, L6T4L5 Phone: 905.792.5983 nourredine.hail@cantire.com |
"Anyone who stops learning is old, whether at twenty or eighty. Anyone who keeps learning stays young. The greatest thing in life is to keep your mind young." Henry Ford