42 cout <<
"=== Supply-Demand Networks: Educational Examples ===\n\n";
48 cout <<
"--- Example 1: Simple Distribution Problem ---\n\n";
55 cout <<
"SCENARIO: Warehouse distribution to stores\n";
56 cout <<
"=========================================\n\n";
59 cout <<
"SUPPLY NODES (Warehouses):\n";
62 cout <<
" Warehouse1: supplies 100 units\n";
63 cout <<
" Warehouse2: supplies 150 units\n";
64 cout <<
" Total supply: 250 units\n\n";
67 cout <<
"DEMAND NODES (Stores):\n";
71 cout <<
" Store1: demands 80 units\n";
72 cout <<
" Store2: demands 100 units\n";
73 cout <<
" Store3: demands 70 units\n";
74 cout <<
" Total demand: 250 units\n\n";
77 cout <<
"TRANSIT NODES (Distribution Centers):\n";
79 cout <<
" Hub: transit point (no supply/demand)\n\n";
82 cout <<
"NETWORK CONNECTIONS (with capacities):\n";
89 cout <<
" Warehouse1 -> Hub: capacity 100\n";
90 cout <<
" Warehouse2 -> Hub: capacity 150\n";
91 cout <<
" Hub -> Store1: capacity 80\n";
92 cout <<
" Hub -> Store2: capacity 100\n";
93 cout <<
" Hub -> Store3: capacity 70\n\n";
96 cout <<
"FEASIBILITY CHECK:\n";
97 cout <<
" Total supply: 250 units\n";
98 cout <<
" Total demand: 250 units\n";
99 cout <<
" Network is BALANCED ✓\n\n";
101 cout <<
"KEY INSIGHT: Balanced network (supply = demand) has feasible solution\n";
102 cout <<
" Flow can satisfy all demands from available supply\n\n";
109 cout <<
"--- Example 2: Complex Distribution Network ---\n\n";
115 cout <<
"SCENARIO: Multiple factories → Multiple customers\n";
116 cout <<
"================================================\n\n";
123 cout <<
"Factories (suppliers):\n";
124 cout <<
" Factory A: 200 units\n";
125 cout <<
" Factory B: 180 units\n";
126 cout <<
" Factory C: 220 units\n";
127 cout <<
" Total: 600 units\n\n";
135 cout <<
"Customers (demanders):\n";
136 cout <<
" Customer 1: 150 units\n";
137 cout <<
" Customer 2: 200 units\n";
138 cout <<
" Customer 3: 120 units\n";
139 cout <<
" Customer 4: 130 units\n";
140 cout <<
" Total: 600 units\n\n";
146 cout <<
"Distribution hubs (transit):\n";
147 cout <<
" Hub North: 0 (transit only)\n";
148 cout <<
" Hub South: 0 (transit only)\n\n";
151 cout <<
"Network topology:\n";
152 cout <<
" Factories → Hubs → Customers\n";
153 cout <<
" Multiple paths for redundancy\n\n";
170 cout <<
"ADVANTAGES OF MULTI-HUB DESIGN:\n";
171 cout <<
" ✓ Redundancy (multiple paths)\n";
172 cout <<
" ✓ Load balancing across hubs\n";
173 cout <<
" ✓ Geographic optimization\n";
174 cout <<
" ✓ Fault tolerance\n\n";
181 cout <<
"--- Example 3: Unbalanced Network ---\n\n";
187 cout <<
"SCENARIO: Supply > Demand\n";
188 cout <<
"=========================\n\n";
194 cout <<
"Supply: 500 units\n";
195 cout <<
"Demand: 300 units\n";
196 cout <<
"Excess: 200 units\n\n";
200 cout <<
"HANDLING EXCESS SUPPLY:\n";
201 cout <<
" Option 1: Add dummy demand node (sink excess)\n";
202 cout <<
" Option 2: Model as upper bound on supply\n";
203 cout <<
" Option 3: Storage/inventory node\n\n";
209 cout <<
"Solution: Added storage node\n";
210 cout <<
" Supplier -> Customer: 300 units\n";
211 cout <<
" Supplier -> Storage: 200 units\n";
212 cout <<
" Network now balanced ✓\n\n";
219 cout <<
"--- Example 4: Capacity Bottlenecks ---\n\n";
225 cout <<
"SCENARIO: Balanced but infeasible due to capacity\n";
226 cout <<
"================================================\n\n";
228 auto source =
network.insert_node(
"Source", 100);
229 auto sink =
network.insert_node(
"Sink", -100);
232 cout <<
"Network: Source -> Bottleneck -> Sink\n";
233 cout <<
" Source supply: 100\n";
234 cout <<
" Sink demand: 100\n";
235 cout <<
" Balanced! ✓\n\n";
241 cout <<
"Arc capacities:\n";
242 cout <<
" Source -> Bottleneck: 100 (OK)\n";
243 cout <<
" Bottleneck -> Sink: 50 (TOO SMALL!)\n\n";
245 cout <<
"PROBLEM: Capacity bottleneck!\n";
246 cout <<
" Can only send 50 units through bottleneck\n";
247 cout <<
" Cannot satisfy demand of 100\n";
248 cout <<
" Network is INFEASIBLE ✗\n\n";
250 cout <<
"LESSON: Balanced supply/demand ≠ feasible solution\n";
251 cout <<
" Must also check capacity constraints!\n\n";
258 cout <<
"--- Example 5: Power Grid Distribution ---\n\n";
260 cout <<
"REAL-WORLD APPLICATION: Electric Power Grid\n";
261 cout <<
"==========================================\n\n";
264 cout <<
" * Power plants (supply nodes)\n";
265 cout <<
" - Coal plant: 500 MW\n";
266 cout <<
" - Solar farm: 200 MW\n";
267 cout <<
" - Wind farm: 150 MW\n";
269 cout <<
" * Cities (demand nodes)\n";
270 cout <<
" - City A: -300 MW\n";
271 cout <<
" - City B: -250 MW\n";
272 cout <<
" - City C: -200 MW\n";
274 cout <<
" * Substations (transit nodes)\n";
275 cout <<
" - Balance load\n";
276 cout <<
" - Transform voltage\n";
277 cout <<
" - No generation or consumption\n\n";
279 cout <<
"ARCS (Transmission Lines):\n";
280 cout <<
" * Capacity = power line rating (MW)\n";
281 cout <<
" * Cost = transmission loss/distance\n";
282 cout <<
" * Redundancy for reliability\n\n";
284 cout <<
"OPTIMIZATION GOALS:\n";
285 cout <<
" 1. Meet all demand (feasibility)\n";
286 cout <<
" 2. Minimize transmission losses (cost)\n";
287 cout <<
" 3. Respect line capacities (constraints)\n";
288 cout <<
" 4. Load balancing across plants\n\n";
290 cout <<
"ALGORITHMS:\n";
291 cout <<
" * Check feasibility: Max-flow algorithm\n";
292 cout <<
" * Minimize cost: Min-cost flow\n";
293 cout <<
" * Handle failures: Network simplex\n\n";
296 cout <<
"=== SUMMARY: Supply-Demand Networks ===\n";
297 cout <<
"\n1. NODE TYPES:\n";
298 cout <<
" Supply (source): positive value (produces)\n";
299 cout <<
" Demand (sink): negative value (consumes)\n";
300 cout <<
" Transit: zero value (passes flow)\n";
301 cout <<
"\n2. FEASIBILITY CONDITIONS:\n";
302 cout <<
" ✓ Total supply = Total demand (balance)\n";
303 cout <<
" ✓ Capacities allow required flows\n";
304 cout <<
" ✓ Network is connected\n";
305 cout <<
"\n3. COMMON PATTERNS:\n";
306 cout <<
" * Hub-and-spoke: Central distribution\n";
307 cout <<
" * Multi-tier: Factory→Hub→Store\n";
308 cout <<
" * Redundant paths: Fault tolerance\n";
309 cout <<
"\n4. REAL-WORLD APPLICATIONS:\n";
310 cout <<
" * Supply chain logistics\n";
311 cout <<
" * Power grid distribution\n";
312 cout <<
" * Water/gas networks\n";
313 cout <<
" * Transportation planning\n";
314 cout <<
" * Telecommunications\n";
315 cout <<
"\n5. KEY ALGORITHMS:\n";
316 cout <<
" Feasibility: Max-flow (source to sink)\n";
317 cout <<
" Optimal: Min-cost flow\n";
318 cout <<
" Complexity: Polynomial time\n";
319 cout <<
"\n6. DESIGN PRINCIPLES:\n";
320 cout <<
" * Balance supply and demand\n";
321 cout <<
" * Size capacities appropriately\n";
322 cout <<
" * Add redundancy for reliability\n";
323 cout <<
" * Use transit nodes for routing flexibility\n";
Network graph with supply and demand nodes.
Main namespace for Aleph-w library functions.
DynList< T > maps(const C &c, Op op)
Classic map operation.
Arc of a flow network implemented with adjacency lists.
Network flow graph structures.
Supply-demand network flow algorithms.