param nBlocks;
param nLoads;
param nDests;
param nNodes;

set Blocks, default{1.. nBlocks};
set Loads, default{1.. nLoads};
set Dests, default{1.. nDests};
set Nodes, default{1.. nNodes};

param Block_ID{b in Blocks}, symbolic;
param Block_Node{b in Blocks}, symbolic;
param Block_VC{b in Blocks}, default 0;

param Load_ID{l in Loads}, symbolic;

set BlockLoads, within Blocks cross Loads;
param LoadVol{(b,l) in BlockLoads}, default 0;

param Dest_ID{d in Dests}, symbolic;
param Dest_Node{d in Dests}, symbolic;

param Node_ID{n in Nodes}, symbolic;

set DestLoads, within Dests cross Loads;
param DL_Rev{(d,l) in DestLoads}, default 0;

set TransNet, within Nodes cross Nodes;
set TransNetLoads, within Nodes cross Nodes cross Loads;

param Trans_Cost{(n1,n2) in TransNet}, default 0;

set BlockNodeLoads:=setof{b in Blocks, n in Nodes, l in Loads: (Node_ID[n]=Block_Node[b])} (b,n,l);
set DestNodeLoads:=setof{d in Dests, n in Nodes, l in Loads: (Node_ID[n]=Dest_Node[d])} (d,n,l);
set DestNodes:= setof{(d,n,l) in DestNodeLoads} (d,n);

var Qbn{(b,n,l) in BlockNodeLoads}, >=0;
var Qbu{(b,l) in BlockLoads}, >=0;
var Qnn{(n1,n2,l) in TransNetLoads}, >=0;
var Qnd{(d,n,l) in DestNodeLoads}, >=0;
var Qdl{(d,l) in DestLoads}, >=0;
var Qd{d in Dests}, >=0;

var ProductRev, >=0;
var VarCost, >=0;
var TranCost, >=0;
var NetIncome;

maximize obj: NetIncome;

s.t. NetIncomeCalc: NetIncome = ProductRev - VarCost - TranCost;

s.t. ProdRev: sum{d in Dests} sum{l in Loads:(d,l) in DestLoads} DL_Rev[d,l] * Qdl[d,l] = ProductRev;

s.t. TransportCost: sum{(n1,n2,l) in TransNetLoads} Trans_Cost[n1,n2] * Qnn[n1,n2,l] = TranCost; 

s.t. CostVar: sum{(b,n,l) in BlockNodeLoads} Qbn[b,n,l] * Block_VC[b] + sum{(b,l) in BlockLoads} Qbu[b,l] * Block_VC[b] = VarCost; 

s.t. MatchVol{(b,l) in BlockLoads}: sum{n in Nodes: (b,n,l) in BlockNodeLoads} Qbn[b,n,l] + Qbu[b,l] =  LoadVol[b,l]; 

s.t. NodeInOut{n in Nodes, l in Loads}: sum{b in Blocks: (b,n,l) in BlockNodeLoads} Qbn[b,n,l] + sum{n1 in Nodes: (n1,n,l) in TransNetLoads} Qnn[n1,n,l] - sum{n2 in Nodes: (n,n2,l) in TransNetLoads} Qnn[n,n2,l] - sum{d in Dests: (d,n,l) in DestNodeLoads} Qnd[d,n,l] = 0;

s.t. DestLoadNode{(d,l) in DestLoads}: sum{n in Nodes: (d,n) in DestNodes} Qnd[d,n,l] = Qdl[d,l];

s.t. DestLoadNode2{d in Dests}: sum{n in Nodes: (d,n) in DestNodes} sum{l in Loads} Qnd[d,n,l] = Qd[d]; 

solve;

printf """ "",""%s"",""%s"",%f\n","","Manuf. Var.",ProductRev;
printf "\n";

printf """Qbn""\n";
printf{(b,n,l) in BlockNodeLoads: Qbn[b,n,l]!=0} """%d"", ""%d"",""%d"",%f\n", Block_ID[b], Node_ID[n], Load_ID[l], Qbn[b,n,l];

printf """Qnn""\n";
printf{(n1,n2,l) in TransNetLoads: Qnn[n1,n2,l]!=0} """%d"", ""%d"",""%d"",%f\n", Node_ID[n1], Node_ID[n2], Load_ID[l],Qnn[n1,n2,l];

printf """Qnd""\n";
printf{(d,n) in DestNodes, l in Loads: Qnd[d,n,l]!=0} """%d"", ""%d"",""%d"",%f\n", Dest_ID[d], Node_ID[n], Load_ID[l], Qnd[d,n,l];

data;

param nBlocks:=1;
param nLoads:=2;
param nDests:=4;
param nNodes:=10;

param : Blocks: Block_ID Block_Node Block_VC:=
1 1 1 25;

param : Loads: Load_ID:=
13 13
14 14;

param : BlockLoads : LoadVol:=
1 13 5719.002
1 14 1579.776;

param : Dests: Dest_ID Dest_Node:=
1 1 787
5 5 791
7 7 793
10 10 796;

param : Nodes: Node_ID:=
1 1
719 719
742 742
752 752
787 787
791 791
793 793
796 796;

param : DestLoads : DL_Rev:=
1 13 50
5 13 129
10 13 76
7 14 43
10 14 81;

param : TransNet: Trans_Cost:=
1 742 8.28
1 719 9.02
1 752 13.33
742 787 9.32
719 787 9.46
752 787 10.99
742 791 8.32
719 791 8.46
752 791 8.99
742 793 11.32
719 793 11.46
752 793 11.99
742 796 11.32
719 796 11.46
752 796 11.99;

set TransNetLoads:=
1 742 13
1 719 13
1 752 13
742 787 13
719 787 13
752 787 13
742 791 13
719 791 13
752 791 13
742 793 13
719 793 13
752 793 13
742 796 13
719 796 13
752 796 13
1 742 14
1 719 14
1 752 14
742 787 14
719 787 14
752 787 14
742 791 14
719 791 14
752 791 14
742 793 14
719 793 14
752 793 14
742 796 14
719 796 14
752 796 14;

end;
