运输时间矩阵设计为 (num_machines + 1) × (num_machines + 1) 的原因如下:
1. 虚拟的 "0号机器" 设计目的
-
作用:表示作业的 初始位置(如仓库、起始点),而非实际物理机器。
-
必要性:作业首次被调度到某台机器时,需要从初始位置(虚拟的0号机器)运输到目标机器,此时需要记录从0到实际机器的运输时间。
-
逻辑意义:将运输起点统一编码为机器编号,简化调度逻辑。
2. 矩阵结构的实际含义
假设实际机器编号为 1~N,则矩阵维度为 (N+1) × (N+1),其中:
-
行索引
i
:运输起点(0表示初始位置,1~N表示实际机器) -
列索引
j
:运输终点(同上) -
值
transport_matrix[i][j]
:从起点i
到终点j
的运输时间。
示例(3台实际机器):
0 (初始) | 1 (机器1) | 2 (机器2) | 3 (机器3) | |
---|---|---|---|---|
0 | 0 | 2 | 4 | 1 |
1 | 0 | 0 | 3 | 5 |
2 | 0 | 3 | 0 | 2 |
3 | 0 | 5 | 2 | 0 |
3. 代码中的实际应用
在调度过程中,通过检查 last_machine
的值区分运输类型:
# 运输调度逻辑片段
last_machine = selected['last_machine'] # 作业上一次使用的机器(0表示初始位置)
transport = self.transport_matrix[last_machine][machine]
if last_machine != 0 and last_machine != machine: # 排除初始位置和同一台机器的情况
machines[machine - 1]['transport'].append((
selected['current_time'], transport_end, selected['id'], last_machine
))
-
当
last_machine == 0
:作业从初始位置运输到第一台机器(需记录transport_matrix[0][machine]
)。 -
当
last_machine == machine
:在同一台机器上加工,无需运输。 -
当
last_machine != machine
:机器间运输(需记录transport_matrix[last_machine][machine]
)。
4. 若去掉 "0号机器" 的问题
如果矩阵维度为 N×N(仅包含实际机器):
-
初始运输无法表示:无法区分作业是从初始位置还是其他机器运输而来。
-
逻辑漏洞:首次调度时必须假设作业已位于某台机器,与实际情况矛盾。
-
代码复杂度增加:需要额外逻辑处理初始位置,破坏统一性。
总结
通过增加一个虚拟的 0号机器:
-
统一性:所有运输起点(包括初始位置)统一用机器编号表示。
-
完整性:覆盖作业从初始位置到第一台机器的运输场景。
-
代码简洁性:无需特殊处理初始运输逻辑。