I think some of the answer depends on the layout of the road network, and this question might be worth posting on the Math Stack Exchange (https://math.stackexchange.com/) as it seems like a graph theory problem. I don't think this will be the optimal solution, but it might help get you closer.
You could divide up the road network into natural regions, where the sum of the length of the segments will be roughly equal to the amount that a truck could cover with a given load. Then for each region you could run a eularian tour to get the route that would touch all of the segments.
Sample python code
def eulerian_tour(network_graph):
graph = network_graph[:]
route = []
def find_route(start):
for (i, j) in graph:
if i == start:
graph.remove((i, j))
find_route(j)
elif j == start:
graph.remove((i, j))
find_route(i)
route.append(start)
find_route(graph[0][0])
route.reverse()
return route
You might then consider routing between regions and the depot, and break up the access route into logical segments for the trucks available.
Hope this helps.
If the origins and destinations are specifically paired, and each delivery a single trip, then you're looking at 2k individual route solves. As you suspect, this can only be done with a model or script, iterating through each destination to find the route to its matching origin. If a delivery can hit multiple destinations in a single trip, the VRP (Vehicle Routing Problem) solver can generate the routes, though it gets more complicated factoring in maximum loads/return to origin for resupply.
Closest Facility could generate all the routes at once but only if it is known that the destinations are all paired with their closest origin. If they aren't, or it is unknown, it wouldn't work on the global dataset. However you could split the origin and destination pairs into their own files (ie 20 of each) in which case each CF analysis would only be looking at one possible origin, so all the matching destinations would be paired. That gets you down to 20 solves instead of 2000, but still might warrant an script/model/iterator. In a model you could also use selections instead of actually splitting the file (select > make feature layer > input to CF solver).
Once you've generated your routes and got them exported and all in a single file, they'd need to be given the goods quantity attribute via a Join or some other method.
With that done, you can look at your second part. This part basically becomes the same solution I gave at this question. You can Intersect the route layer with the road network layer (or rather the source of it, not the edges layer in the NDS). You end up with each network segment being duplicated once for each route that passes over it. Then you run Summary Statistics on that result, with network segment ID as a Case field and goods quantity as a Statistic field with Sum method. The result is a table with segment ID, total goods passing over that segment, and a frequency count of the number of routes that pass over that segment. The table can be joined back to the roads (or a select export of them) to symbolize the segments by number of routes using it or the quantity of goods (or both).
Best Answer
Open the layer properties for your route.
Go to the label tab.
Click on 'Symbol'.
Scroll down through all the available styles until you reach the following:
Select any of the symbols with the number inside the polygon and edit them to suit your needs by selecting the symbol and clicking 'Edit Symbol...'