2021-4-8
还是 1984 年的文献
[1] Crainic T G , Rousseau J M . Multicommodity, multimode freight transportation: A general modeling and algorithmic framework for the service network design problem[J]. Transportation Research Part B: Methodological, 1986, 20(3):225-242.
接着之前介绍完货运服务网络,下面把文献给出的通用模型放一下
再给一个我特例化的小模型:
这个小模型暂时还不能放,先说说在小算例编程求解的时候遇到的问题
想看看Gurobipy能不能求解一个小算例,所以要在货运需求构成的服务网络基础上,找到服务图的所有路径。
货运需求是向的,表示为从节点A到节点B的运输需求。
# 每个弧段的运输需求
serarc, req = grb.multidict({
('hz','js'):24,
('hz','sh'):30,
('hz','nb'):16,
('hz','sz'):20,
('yw','hz'):18,
('yw','sz'):50,
('sz','js'):40,
('js','hz'):30,
('sh','nb'):45,
('nb','sz'):34
})
上面是我目前作为输入数据的货运需求。
grb.multidict()是Gurobipy的一种数据结构。
for s in serarc:
print(f'弧:{s},起始点:{s[0]} -> 终止点{s[1]}')
serarc输出为如下:
弧:('hz', 'js'),起始点:hz -> 终止点js
弧:('hz', 'sh'),起始点:hz -> 终止点sh
弧:('hz', 'nb'),起始点:hz -> 终止点nb
弧:('hz', 'sz'),起始点:hz -> 终止点sz
弧:('yw', 'hz'),起始点:yw -> 终止点hz
弧:('yw', 'sz'),起始点:yw -> 终止点sz
弧:('sz', 'js'),起始点:sz -> 终止点js
弧:('js', 'hz'),起始点:js -> 终止点hz
弧:('sh', 'nb'),起始点:sh -> 终止点nb
弧:('nb', 'sz'),起始点:nb -> 终止点sz
可以先将问题化解为两个点之间的所有可行路径:
可以先定义one step 为一个弧,two steps 则表示两段弧构成的路径,依次类推。路径生长不能逆,即不能回头。
- 获取一对起始点和终止点,记录1step路径
- 记录从起始点出发的弧所连接的1step路径,删除指向终止点的路径,继续增加一节剩下路径的弧段,判断是否指向终止点,是则记录2steps路径,并删除指向终止点的路径。
- 剩余的路径继续增加一段弧,判断是否指向终止点,是则记录3 steps 路径,并删除指向终止点的路径。
- 重复直到路径没有可以新增弧段
- 由于服务网络中转过多会导致成本上升,时效变差,因此可以选择在3steps时停止路径搜索,这需要将以上操作做成函数,函数的输入是有向图的边集,最大中转数,输出是所有可行路径的字典,路径字典的键是路径的序号,值是弧段。
具体的代码实现再说吧。