Объявления arc и node позволяют легко определить линейную программу для сети, которая имеет несколько различных типов узлов и дуг. В качестве примера вернемся к специализированной модели:
set D_CITY; set W_CITY; set DW_LINKS within (D_CITY cross W_CITY); param p_supply >= 0; # amount available at plant param w_demand {W_CITY} >= 0; # amounts required at warehouses check: p_supply = sum {j in W_CITY} w_demand[j]; param pd_cost {D_CITY} >= 0; # shipment costs/1000 packages param dw_cost {DW_LINKS} >= 0; param pd_cap {D_CITY} >= 0; # max packages that can be shipped param dw_cap {DW_LINKS} >= 0; var PD_Ship {i in D_CITY} >= 0, <= pd_cap[i]; var DW_Ship {(i,j) in DW_LINKS} >= 0, <= dw_cap[i,j]; # packages to be shipped minimize Total_Cost: sum {i in D_CITY} pd_cost[i] * PD_Ship[i] + sum {(i,j) in DW_LINKS} dw_cost[i,j] * DW_Ship[i,j]; subject to P_Bal: sum {i in D_CITY} PD_Ship[i] = p_supply; subject to D_Bal {i in D_CITY}: PD_Ship[i] = sum {(i,j) in DW_LINKS} DW_Ship[i,j]; subject to W_Bal {j in W_CITY}: sum {(i,j) in DW_LINKS} DW_Ship[i,j] = w_demand[j];
В сети есть узел завода, узел центра распределения для каждого D_CITY и узел склада для каждого W_CITY. Таким образом, для модели требуется три объявления узла:
node Plant: net_out = p_supply; node Dist {i in D_CITY}; node Whse {j in W_CITY}: net_in = w_demand[j];
Условия баланса говорят, что поток из узла Plant должен быть p_supply, а поток в узел Whse [j] равен w_demand [j]. (Сеть не имеет дуг на заводе или вне складов, поэтому net_out и net_in - это только поток исходящий и входящий, соответственно.) Условия в узле Dist[i] могут быть записаны либо net_in = 0, либо net_out = 0, но поскольку они предполагаются по умолчанию, нам не нужно указывать какие-либо условия вообще.
В этой сети есть два вида дуг: дуга от завода к каждому D_CITY, которую можно объявить:
arc PD_Ship {i in D_CITY} >= 0, <= pd_cap[i], from Plant, to Dist[i], obj Total_Cost pd_cost[i];
и есть дуги от распределительного центра i до склада j для каждой пары (i,j) в DW_LINKS:
arc DW_Ship {(i,j) in DW_LINKS} >= 0, <= dw_cap[i,j], from Dist[i], to Whse[j], obj Total_Cost dw_cost[i,j];
В объявлениях arc указываются соответствующие границы и целевые коэффициенты, как в нашем предыдущем примере. Вся модель представлена следующей записью:
set D_CITY; set W_CITY; set DW_LINKS within (D_CITY cross W_CITY); param p_supply >= 0; # amount available at plant param w_demand {W_CITY} >= 0; # amounts required at warehouses check: p_supply = sum {j in W_CITY} w_demand[j]; param pd_cost {D_CITY} >= 0; # shipment costs/1000 packages param dw_cost {DW_LINKS} >= 0; param pd_cap {D_CITY} >= 0; # max packages that can be shipped param dw_cap {DW_LINKS} >= 0; minimize Total_Cost; node Plant: net_out = p_supply; node Dist {i in D_CITY}; node Whse {j in W_CITY}: net_in = w_demand[j]; arc PD_Ship {i in D_CITY} >= 0, <= pd_cap[i], from Plant, to Dist[i], obj Total_Cost pd_cost[i]; arc DW_Ship {(i,j) in DW_LINKS} >= 0, <= dw_cap[i,j], from Dist[i], to Whse[j], obj Total_Cost dw_cost[i,j];