货运服务网络设计:经典文献阅读笔记(2)

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 则表示两段弧构成的路径,依次类推。路径生长不能逆,即不能回头。

  1. 获取一对起始点和终止点,记录1step路径
  2. 记录从起始点出发的弧所连接的1step路径,删除指向终止点的路径,继续增加一节剩下路径的弧段,判断是否指向终止点,是则记录2steps路径,并删除指向终止点的路径。
  3. 剩余的路径继续增加一段弧,判断是否指向终止点,是则记录3 steps 路径,并删除指向终止点的路径。
  4. 重复直到路径没有可以新增弧段
  5. 由于服务网络中转过多会导致成本上升,时效变差,因此可以选择在3steps时停止路径搜索,这需要将以上操作做成函数,函数的输入是有向图的边集,最大中转数,输出是所有可行路径的字典,路径字典的键是路径的序号,值是弧段。

具体的代码实现再说吧。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于Python Socket服务器,以下是一些基本的学习笔记: 1. 创建Socket服务器 使用Python中的`socket`模块创建Socket服务器,可以使用`socket()`函数来创建一个Socket对象,如下所示: ```python import socket # 创建一个Socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ``` 其中,第一个参数`AF_INET`表示使用IPv4地址族,第二个参数`SOCK_STREAM`表示使用TCP协议,如果使用UDP协议,则应该使用`SOCK_DGRAM`。 2. 绑定Socket服务器 在创建Socket对象之后,需要使用`bind()`方法将Socket对象和一个IP地址及端口号绑定在一起,如下所示: ```python # 绑定IP地址和端口号 server_socket.bind(('127.0.0.1', 8888)) ``` 其中,`bind()`方法的参数是一个元组,第一个元素是IP地址,第二个元素是端口号。 3. 监听Socket服务器 在绑定IP地址和端口号之后,需要使用`listen()`方法开始监听Socket服务器,如下所示: ```python # 开始监听 server_socket.listen(5) ``` 其中,`listen()`方法的参数表示最大连接数,即同时可以连接的客户端数量。 4. 接受客户端连接 当有客户端连接到Socket服务器时,需要使用`accept()`方法来接受客户端连接,如下所示: ```python # 接受客户端连接 client_socket, client_address = server_socket.accept() ``` 其中,`accept()`方法返回一个元组,第一个元素是客户端的Socket对象,第二个元素是客户端的IP地址和端口号。 5. 接收和发送数据 客户端连接到Socket服务器之后,就可以进行数据的接收和发送了,使用`recv()`方法接收客户端发送的数据,使用`send()`方法向客户端发送数据,如下所示: ```python # 接收客户端数据 data = client_socket.recv(1024) # 发送服务器数据 client_socket.send(b'Hello, client!') ``` 其中,`recv()`方法的参数表示接收数据的最大字节数,`send()`方法的参数是要发送的数据,需要将其转换为字节串。 6. 关闭Socket服务器 当与客户端的通信完成后,需要使用`close()`方法关闭Socket服务器,如下所示: ```python # 关闭Socket服务器 server_socket.close() ``` 以上是关于Python Socket服务器的一些基本学习笔记,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值