Each node is an autonomous agent picking one of k colours (read: a time slot, frequency or channel). Neighbours sharing a colour clash over the resource. No agent sees the whole network; each knows only its own choice and its neighbours'. Yet through purely local moves they drive the global conflict count down: the backbone of decentralised scheduling and allocation. This is a DCOP. Live runs the real Python engine via Pyodide.
Nodes are agents coloured by their current choice; a red edge is an unresolved conflict. Watch agents flip colours round by round until the clashes clear (or settle into a stubborn few).
Total conflicts per round. DSA drops fast but can wobble; MGM only ever improves but may stall above zero.
Switch Mode to Live · Python, then change the resources or the move probability and re-solve. Too few colours and the conflicts can't all clear.
No agent ever sees the whole network or counts the global conflicts; each just reacts to its neighbours. The global objective falls anyway, purely from local self-interest.
How that worksIn DSA, if every conflicting agent moved at once they'd chase each other forever. The move probability p breaks that symmetry. Turn it up in Live and watch it thrash.
DSA's coin flipLetting only the biggest-gain agent in each neighbourhood move guarantees conflicts never rise, but the dense network shows it can get stuck a notch above zero.
Local optimaDrop the colour count below what the network needs (Live) and no assignment can satisfy everyone, and the agents fight forever over a genuinely scarce resource.
Scarcity & allocation