set CITIES;
set LINKS within (CITIES cross CITIES);
set PRODS;
param supply {PRODS,CITIES} >= 0; # amounts available at cities
param demand {PRODS,CITIES} >= 0; # amounts required at cities
check {p in PRODS}:
sum {i in CITIES} supply[p,i] = sum {j in CITIES} demand[p,j];
param cost {PRODS,LINKS} >= 0; # shipment costs/1000 packages
param capacity {PRODS,LINKS} >= 0; # max packages shipped of product
set FEEDS;
param yield {PRODS,FEEDS} >= 0; # amounts derived from feedstocks
param limit {FEEDS,CITIES} >= 0; # feedstocks available at cities
minimize Total_Cost;
var Feed {f in FEEDS, k in CITIES} >= 0, <= limit[f,k];
node Balance {p in PRODS, k in CITIES}:
net_out = supply[p,k] - demand[p,k]
+ sum {f in FEEDS} yield[p,f] * Feed[f,k];
arc Ship {p in PRODS, (i,j) in LINKS} >= 0, <= capacity[p,i,j],
from Balance[p,i], to Balance[p,j], obj Total_Cost cost[p,i,j];