**Algorithm 1** Function: experience(*vk*, *vl*, *A*).

**Input:** *vk*: base vertex; *vl*: immediate successor of the base vertex; A: list of resources **Output:** *vl* with updated experience 1: **for** *Ap* in *A* **do** 2: **for** *j* in *I* **do** 3: *vl*.exp[*Ap*][*j*]<sup>←</sup> *vk*.exp[*Ap*][*j*]+*D*(*π*(*vk*, *vl*)*<sup>j</sup>* , *Ap*) 4: **end for** 5: **end for** 6: **return** *vl* //the successor with updated experience

Combined with the allocated resource value, which serves as a proxy of the interference level, the definition of resource experience in Equation (6) actually defines a property of an agent: Only the situation in which the resource allocated to an agent is dissatisfying because of the co-existence of other agents (i.e., *Ak*(*e j pq*) ≥ *<sup>k</sup>* should hold), will contribute to the dissatisfying experience of that agent. Furthermore, each dissatisfying condition is weighted by the edge cost *g*(*e j pq*). In this way, we can quantify the resource experience in terms of how long such a dissatisfying condition lasts in travel time or distance, which is quantified by *g*(*e j pq*). As discussed below, the resource experience of an agent will determine its collision score, which is defined from a probabilistic point of view.
