The connection is really just a way to get a reference from one CP to another. Most of the CPs with a connection only have one and they form a loop. This allows the AGV to follow the loop defined the CP connections.
Some CPs (the ones in front of entry points to a smaller loop) have two such connections and two labels. If the "LoopCurrent" label value is smaller than the "LoopLimit" label, the second connection will be used to determine the next destination, so the that the AGV enters the small loop. Otherwise the first one and the AGV continues along the main loop.

The Process Flow works like this:
At the start of the model, a token is created for each AGV. These then create a sub-flow token that is responsible for having the AGV travel along the loop. Afterwards the AGV is pushed to a list (made available to be pulled for tasks).

The first thing the sub-flow token does is to search for the next "Loop-CP". If the CP the AGV is currently at ("AGV(token.OHT).recentCP") has at least one loop-connection, it can follow the connection (blue). If there are two connections, the aforementioned labels are checked. If the AGV is then diverted to the smaller loop, the "LoopCurrent" label on the CP is incremented and a reference to the CP is written to the label "CurrentLoopCP" on the AGV (green).
If the current CP does not have a loop-connection (either at the start of the model or after finishing a task) the code loops through all CPs belonging to the main loop. They are identified by being part of the "MainLoopCPs" group. It then chooses the one closest to the AGV as the next destination (pink).

This gets repeated after the AGV arrives at the next destination. The travel task uses the "TaskExecuter.MaxEndSpeed" expression for the end speed field. This means that the travel task will finish when the AGV would start to decelerate in order to come to a stop at the destination CP. If a new travel task is given to it immediately afterwards, they don't have to decelerate at all and keep travelling in the loop at full speed.

Now let's go back to the "main" token. When the AGV is pulled from the list, the token checks if the AGV has entered a small loop in the meantime, meaning the "CurrentLoopCP" label would be set. If that is the case, the label on that CP gets decremented again, since the AGV is now assigned to a task and as such does not count as "in the loop" anymore (at least that is what I assumed). It then releases the sub-flow token to a sink activity. Then it waits until the token that pulled the AGV is put onto a list to denote that the task is completed and the AGV should resume the idle travel.

So overall this logic assumes that there is one big main loop with smaller loops around it. To add more small loops, just draw the necessary connections and add the labels as shown in the first screenshot to the CP where an AGV would get diverted to the small loop.