2022-C-杭州电子科技大学-论文精读

一、优化目标模型建立

目标 1:出车顺序车身需满足动力属性间隔要求

\[u_j= \begin{cases} 0 \quad ,\text{第 } j \text{ 辆车身的动力属性为燃油} \\ 1 \quad ,\text{第 } j \text{ 辆车身的动力属性为混动} \end{cases} \tag{2} \]

其中,\(u_j\) 为出车序列中第\(j\)辆车身的动力属性。

\[\delta(u_j, u_{j+1}, u_{j+2}, u_{j+3})= \begin{cases} 0 \quad ,u_j = u_{j+3} \text{ 且 } u_{j+1} = u_{j+2} \ \ (j \in H,u_j \in U) \\ 1 \quad ,\text{else} \ \ (j \in H) \end{cases} \tag{3} \]

其中,\(\delta(u_j, u_{j+1}, u_{j+2}, u_{j+3})\) 为出车序列中对于每一个混动车的惩罚分数。

\[Z_1 = 100 - \sum_{j \in H} \delta(u_j, u_{j+1}, u_{j+2}, u_{j+3}) \tag{4} \]

模型解读

先翻译合规条件:\(u_j = u_{j+3}\)\(u_{j+1} = u_{j+2}\)

\(j\) 位置这台车必须是混动(\(u_j = 1\)):

  1. \(u_j = u_{j+3}\):第 \(j\) 台 = 第 \(j+3\) 台,都是混动(1)
  2. \(u_{j+1} = u_{j+2}\):中间第 \(j+1\)\(j+2\) 两台必须完全一样,而且只能是燃油(0)

拼在一起就是标准合规模板:
[混动,燃油,燃油,混动]

也就是题目硬性要求:两台混动之间必须恰好夹 2 台燃油车。

\(\delta\) 取值含义

  • 满足「混 - 燃 - 燃 - 混」\(\rightarrow \boldsymbol{\delta = 0}\):不扣分
  • 但凡不是这个顺序 \(\rightarrow \boldsymbol{\delta = 1}\):扣 1 分

举 4 个直观例子

  1. 序列片段 1,0,0,1 ✅ 合规 \(\rightarrow \delta=0\),不罚分
  2. 序列片段 1,0,1,1 ❌ 中间不是 2 台燃油 \(\rightarrow \delta=1\),扣 1 分
  3. 序列片段 1,1,0,1 ❌ 第一台后面直接跟混动 \(\rightarrow \delta=1\),扣 1 分
  4. 序列片段 1,0,0,0 ❌ 第 4 台不是混动 \(\rightarrow \delta=1\),扣 1 分

目标2模型解读:出车顺序车身需满足驱动属性等比例要求

一、公式 (5):驱动属性编码 \(v_j\)

\[v_j= \begin{cases} 2 \quad \text{出车序列第}j\text{台:两驱} \\ 4 \quad \text{出车序列第}j\text{台:四驱} \end{cases} \]

把最终总装进车队列按顺序编号,用数字标记每台车是两驱还是四驱,方便程序分块判断。

二、公式 (6):切分连续同属性「块 block」+ 块间惩罚 \(\varepsilon(m)\)

第一步:怎么切分块 block (\(m\))
条件:

\[v_j = v_{j+1} = \dots = v_{j+\text{length}},\ v_j \neq v_{j-1},\ v_{j+\text{length}+1} \neq v_j \]

大白话:
从第\(j\)台开始,往后连续一长串完全一样的驱动类型(全2两驱 或 全4四驱);
前一台和它不一样、后一台也和它不一样,这一整段连续相同车型就划分为第 \(m\) 个块 block (\(m\))。
\(\text{length}\) = 这个块里面包含车辆的总数量。

举例子:
序列:4,4,2,2,2,4
分块结果:

  • block1:[4,4],长度 = 2(连续四驱)
  • block2:[2,2,2],长度 = 3(连续两驱)
  • block3:[4],长度 = 1(单个四驱)

总块数 \(M = 3\)

第二步:惩罚项 \(\varepsilon(m)\)

\[\varepsilon(m)= \begin{cases} 0 \quad \text{第}m\text{块长度} = \text{第}m+1\text{块长度} \\ 1 \quad \text{两块长度不相等,扣1分} \end{cases} \]

题目原始要求:相邻切换的两个块必须1:1数量对等,也就是一块四驱、一块两驱,数量必须一模一样。

  • 相邻两块长度相同 → 合规,不扣分 \(\varepsilon = 0\)
  • 相邻两块数量不一样 → 违规,扣1分 \(\varepsilon = 1\)

目标3模型解读:返回道尽量不使用

一、先明确编码前提

题目规定:返回道 1 号车位的区域编码固定是 70。

\(x_{it}\) 就是你最终输出 Excel 表格里:第\(i\)号车、第\(t\)秒所在位置编码。

公式 (10):\(back_{it}\) 标记「车辆首次进入返回道」

\[back_{it}= \begin{cases} 1 \quad &x_{i(t-1)} \neq 70 \ \text{并且} \ x_{it} = 70 \\ 0 \quad &\text{其他所有情况} \end{cases} \]

直白翻译

  • \(t-1\) 上一秒,这辆车还不在返回道 1 号位(编码不是 70);
  • 到了第\(t\)这一秒,它刚好进入返回道第一个车位(编码变成 70);
    \(\rightarrow\) 代表这台车被送进返回道回退重排 1 次,记\(back_{it} = 1\),算作 1 次使用返回道。
    然后进行遍历扣分

目标4模型解读:总调度时间尽量短

一、先定义所有变量

  1. \(C\):本次调度的车辆总数量(附件 1 就是 318 台,\(C = 318\)
  2. \(T\):实际总完工秒数
    指从仿真最开始第 0 秒启动,到最后一台车第一次出现 \(x_{it} = 3\)(彻底驶出 PBS 进入总装)的那一时刻,就是整个调度流程全部结束的总时长 \(T\)
  3. 基准理论最短时间:\(T_{base} = 9C + 72\)
    这是赛题题目原文给定的理想极限最小耗时:
    所有车全程不走返回道、全部塞进正中间 4 号进车道,不做任何回退重排、一路顺顺当当直接送出 PBS,理论上最少需要这么多秒。

二、公式拆解

\[Z_4 = 100 - \big(0.01 \times T - 9C - 72\big) \]

可以等价改写为:

\[Z_4 = 100 - 0.01 \times \big(T - (9C + 72)\big) \]

括号部分含义

$T - (9C + 72) = $ 实际用时 \(-\) 理论最快用时,也就是调度多花出来的额外冗余时间。

  • 冗余时间 \(= 0\):完全达到理论最优速度,没有多浪费一秒
  • 冗余时间 \(> 0\):因为频繁把车退回返回道重排、车道拥堵排队,整体流程拖慢了,多花了时间

二、约束目标模型建立

约束1(PBS约束说明3、9):某一时刻,一种区域代码下(除区域代码0与3)只能存在一个车身

三、公式 (14) 翻译

\[x_{it} \neq x_{i't} \quad , \quad \forall t,\ i \neq i',\ x_{it}, x_{i't} \in A' \]

逐段翻译

对任意一秒 \(t\),只要是两辆不同的车,并且这两辆车当下都还在 PBS 内部(编码属于 \(A'\),不是 \(0\) 也不是 \(3\)),
那么这两辆车这一秒的位置编码绝对不能相等。

约束2(PBS约束说明1、2、12):车身在进车道和返回道上的移动方向恒定

一、对应原题三条原始硬性规则

对应赛题约束1、2、12:

  1. 进车道车辆只能单向从 10 号位往 1 号位走,绝对不能倒车反向移动;
  2. 返回道车辆只能单向从 1 号位往 10 号位走,也不能掉头倒着开;
  3. 车辆在车位之间移动的时候,不能被横移机中途抓走调度,只能按固定方向往前挪。

二、公式符号拆解

\[x_{it} = a,\ x_{i(t+1)} = P_a,\ \text{if } a \in A,\ P_a \in Q_a \]

  1. \(x_{it} = a\):第\(i\)台车在第\(t\)秒处在区域编码\(a\)这个位置;
  2. \(x_{i(t+1)} = P_a\):到了下一秒 \(t+1\),它必须只能去到\(P_a\)这个唯一合法位置;
  3. \(Q_a\):是一个预先写死的合法跳转清单:编码\(a\)下一秒能去往的位置只有固定集合\(Q_a\),没有别的选择。

直白翻译
只要车辆现在在车位编码\(a\),下一时刻它只能去往系统预先规定好的下一个位置\(P_a\),不允许跳到任意其他编码,彻底锁死移动方向,杜绝倒车、乱跳位置。

四、核心本质

这一条约束就是把车道「只能单向顺序前移、不能反向 / 乱跳」这条物理规则写成数学表达式。
每一个车位编码都绑定了唯一的下一时刻目的地,车辆位置随时间只能按预设路径递进,保证整条 PBS 内部车辆移动顺序完全符合工厂设备机械逻辑。

约束3(PBS 约束说明6):若返回道停车位10有车身,当接车横移机空闲时,则优先运送返回道停车位10上的车身

一、先锁定论文里两个关键编码约定

  1. 区域编码 \(= 1\):车辆处在接车横移机上,代表左叉车正在运车;
  2. 区域编码 \(= 79\):车辆停在返回道第 10 号车位(返回道最尽头的车位)。

二、公式 (16):定义\(Z_{1t}\),标记接车横移机忙 / 闲

\[Z_{1t}= \begin{cases} 0 \quad &\text{所有车在第}t\text{秒,没有任何一辆车编码等于1} \Rightarrow \text{接车横移机空闲} \\ 1 \quad &\text{只要有任意一台车编码是1} \Rightarrow \text{接车横移机正在干活、处于忙碌状态} \end{cases} \]

大白话:
\(Z_{1t} = 0 \rightarrow\) 左叉车空着没事干;
\(Z_{1t} = 1 \rightarrow\) 左叉车正拉着车运输,不能接新任务。

三、公式 (17):强制执行「返回道末尾车辆优先拉走」

\[x_{i(t+1)} = 1,\ Z_{1(t+1)} = 1 \quad ,\ \text{if } x_{it} = 79 \ \text{且} \ Z_{1t} = 0 \]

拆开前置两个必须同时满足的条件

  1. \(x_{it} = 79\):第\(i\)辆车,当前第\(t\)秒正好停在返回道最后一个车位;
  2. \(Z_{1t} = 0\):当前接车横移机完全空闲、没有在运任何车。

满足条件后强制执行两条结果

  1. 下一秒\(t+1\),这辆车直接被抓取到接车横移机内,位置编码改成\(1\)
  2. 横移机状态\(Z_1\)立刻变为\(1\),标记为忙碌,不再接收其他调度指令。

约束4(PBS 约束说明7):如果若干进车道停车位1有车身,当送车横移机空闲时,则优先运送最先进入进车道停车位1上的车身

一、先明确论文编码定义

  1. 编码 2:代表车辆处在送车横移机(右侧叉车)上,也就是右叉车正在运载车身;
  2. \(\{10,20,30,40,50,60\}\):正好对应6条进车道各自的1号出口车位
    • 1车道1号位 = 10、2车道1号位 = 20、3车道1号位 = 30、4车道1号位 = 40、5车道1号位 = 50、6车道1号位 = 60;
      这些就是所有车道等待被右叉车调度的出口位置。

二、公式 (18):\(Z_{2t}\) 标记送车横移机忙闲状态

\[Z_{2t}= \begin{cases} 0 \quad &\text{任意车辆的位置编码都不等于2} \Rightarrow \text{送车横移机空闲} \\ 1 \quad &\text{只要有一台车编码是2} \Rightarrow \text{送车横移机正在运车,忙碌} \end{cases} \]

大白话:
\(Z_{2t} = 0 \rightarrow\) 右边叉车活干完了,停在原点没事干;
\(Z_{2t} = 1 \rightarrow\) 右叉车正拉着车跑运输,不能接新取车任务。

三、公式 (19):核心强制先到先出规则

\[x_{i(t+1)} = 2,\ Z_{2(t+1)} = 1 \quad \text{if } x_{it} \in \{10,20,30,40,50,60\},\ Z_{2t} = 0 \]

触发前提两个条件:

  1. \(x_{it} \in \{10,20,30,40,50,60\}\):这辆车此刻停在任意一条进车道的出口1号位,属于排队等待出车的车辆;
  2. \(Z_{2t} = 0\):送车横移机现在完全空闲。

约束强制结果:
从所有卡在车道出口的车里,挑选最早抵达1号位的那一台车,下一秒直接抓进送车横移机(编码改为2),同时把叉车状态\(Z_{2(t+1)}\)置1,标记为正在工作。

约束5(PBS约束说明8):若任意进车道停车位1存在车身,则送车横移机不能空闲

一、先搞懂基础符号 & 编码

  1. \(Z_{2t}\):送车横移机(右侧叉车)忙闲标记变量

    • \(Z_{2t} = 0 \rightarrow\) 叉车空闲、无任务;
    • \(Z_{2t} = 1 \rightarrow\) 叉车处于工作状态,不能待命休息。
  2. 集合 \(\{10,20,30,40,50,60\}\)
    6 条进车道最靠近总装的 1 号出口车位专属编码:
    1 车道 1 号位 = 10、2 车道 1 号位 = 20、3 车道 1 号位 = 30、4 车道 1 号位 = 40、5 车道 1 号位 = 50、6 车道 1 号位 = 60。
    只要车辆编码落在这组数字里,就代表车已经开到车道出口,排队等待被叉车调度。

二、公式 (20) 核心含义

\[z_{2t} = 1,\ \text{if } x_{it} \in \{10,20,30,40,50,60\} \]

直白翻译

只要任意一条进车道的出口 1 号位停了任意一台车,送车横移机就强制标记为忙碌(\(Z_{2t} = 1\)),绝对不允许处于空闲待命状态,必须立刻执行出车调度。

三、对标赛题原题原文

原题约束 8 原文:只要任意进车道 1 号位有车等待,送车横移机不能空闲。
这条数学式子就是把这条硬性车间设备规则,写成可用于建模、程序仿真的标准化约束。

约束6(PBS约束说明10、11): 当在同一车道内,连续两辆车身的可以不同步移动时间约束

一、先把前置规则和集合定义讲明白

1. 原题底层机械规则(本约束的来源)

  1. 进车道:车辆只能向编码更小的方向走(10号位→9号位…→1号位,编码 -1),每移动一格必须间隔 9 秒;
  2. 返回道:车辆只能向编码更大的方向走(1号位→2号位…→10号位,编码 +1),同样移动一格固定间隔 9 秒;
  3. 核心强制:只要前方下一个车位是空的,这辆车必须在最多 9 秒之内往前挪一格;如果前面车位有车堵着,就原地不动等待。

2. 论文里集合含义

  • \(B\):所有进车道 + 返回道的全部车位编码集合;
  • \(D\):进车道所有车位编码(往小编码走,\(x_{it}-1\) 是下一车位);
  • \(B-D\):返回道所有车位编码(往大编码走,\(x_{it}+1\) 是下一车位);
  • \(i'\):排在该车正前方紧邻车位的那台车;
  • 连乘 \(\prod_{k=1}^{9}\):遍历过去第 1 秒、第 2 秒……第 9 秒一共 9 个历史时刻。

二、第一条公式(进车道车辆,式 21 上半行)

\[\prod_{k=1}^{9} \big(x_{i(t-k)} - x_{it} + 1\big) = 0,\quad \text{if } x_{i't} \neq x_{it} - 1,\ x_{it} \in D \]

条件拆解

  1. \(x_{it} \in D\):车在进车道里;
  2. \(x_{i't} \neq x_{it} - 1\):它正前方紧邻的车位没有车(前方空位,没有东西挡路)。

公式数学含义

9 项相乘结果等于 0,代表在过去 9 秒内,至少存在某一个时刻 \(t-k\),这辆车的位置 \(x_{i(t-k)}\) 刚好等于 \(x_{it}-1\)

直白翻译

前方车位一空出来,这辆车最晚 9 秒之内,一定要从当前车位往前挪一格到下一个车位,不能长期原地卡死不动。

式子怎么实现「9 秒内必须动」:
乘积为 0 → 9 个历史时刻里至少有一次发生过位置前移;
也就是最多拖 9 秒,必须完成一次车位前进,完全对应题目「空位就前移、一格耗时 9 秒」。

三、第二条公式(返回道车辆,式 21 下半行)

\[\prod_{k=1}^{9} \big(x_{i(t-k)} - x_{it} - 1\big) = 0,\quad \text{if } x_{i't} \neq x_{it} + 1,\ x_{it} \in B-D \]

条件拆解

  1. \(x_{it} \in B-D\):车在返回道里;
  2. \(x_{i't} \neq x_{it} + 1\):它前进方向的下一个车位是空的,没有车辆阻挡。

含义

返回道车辆是往编码 \(+1\) 方向前进;
乘积为 0 意味着:前方无遮挡的前提下,9 秒时间窗口内必须向前移动一个车位,禁止长时间滞留原地。

四、一句话总括整条约束 6

不管是进车道还是返回道里的车,只要前面没有车挡住路,最多 9 秒钟就必须往前挪一个车位;只有前车堵着的时候,才允许停下来不动。

约束7:车道内车身移动的时间约束

一、先明确基础符号与集合

  1. \(B\):所有进车道、返回道内部车位的区域编码全集,只要车停在车道任意车位里,\(x_{it} \in B\)
  2. \(i\):某一台单独的车身;\(t\):仿真第\(t\)秒。
  3. \(L\):这辆车在同一个车位原地停留的总秒数。

二、拆分公式里4个前置判断条件(if 后面一整串)

\[\text{if } \underbrace{x_{i(t-1)} \neq x_{it}}_{\text{条件1}},\ \underbrace{\sum_{l=0}^{L} \big(x_{i(t+l)} - x_{it}\big) = 0}_{\text{条件2}},\ \underbrace{x_{it} \neq x_{i(t+L+1)}}_{\text{条件3}},\ \underbrace{x_{it} \in B}_{\text{条件4}} \]

条件1:\(x_{i(t-1)} \neq x_{it}\)

上一秒 \(t-1\) 该车还不在这个车位,第\(t\)秒刚刚开进这个车位,是本车位的入驻起始时刻。

条件2:\(\displaystyle \sum_{l=0}^{L} \big(x_{i(t+l)} - x_{it}\big) = 0\)

从第\(t\)秒,一直到第\(t+L\)秒,这连续\(L+1\)秒里:
每一秒车辆位置编码都和刚进来时\(x_{it}\)完全一样,全程没挪窝,一直停在当前车位。
求和每一项都是0,总和自然等于0。

条件3:\(x_{it} \neq x_{i(t+L+1)}\)

等到\(t+L+1\)这一秒,车辆编码发生变化,正式离开这个车位,往前移动到下一个车位。

条件4:\(x_{it} \in B\)

车辆此时处在车道车位内,不是横移机、不是还没进厂、不是已经出厂。

三、核心强制结论:\(\boldsymbol{L \ge 9}\)

\(L\)是车辆在单个车位里静止停留的总时长,约束硬性规定:
同一车位最少必须停满9秒钟,才允许往前移动一格到下一个车位,不能刚停1、2秒就立刻瞬移开走。

约束8(PBS约束说明4、5):横移机上车身移动时间约束

一、先锁定核心编码与基础定义

  1. \(x_{it} \in \{1,2\}\)

    • 编码 1:车辆在接车横移机(左叉车)上;
    • 编码 2:车辆在送车横移机(右叉车)上;
      本条约束只针对「车已经被抓上叉车、正在运输途中」的场景。
  2. \(E\):叉车单次完整运输一趟必须花费的固定总秒数;

  3. 集合 \(S\):赛题题干里提前规定好的每一条运输路线对应的标准时长(比如从涂装入口运进车道固定多少秒、从车道出口运去总装固定多少秒、从返回道末尾运回车道固定多少秒)。

  4. \(time(\cdot)\):根据「起点位置 + 当前叉车 + 终点位置」,查表取出这条路线规定好的标准运输秒数\(E\)

二、逐条拆解 if 里面 5 个判定条件

\[\text{if } \begin{cases} x_{i(t-1)} \neq x_{it} & \text{(条件1)} \\ \displaystyle \sum_{e=0}^{E-1} \big(x_{i(t+e)} - x_{it}\big) = 0 & \text{(条件2)} \\ x_{it} \neq x_{i(t+E)} & \text{(条件3)} \\ time(\dots) \in S & \text{(条件4)} \\ x_{it} \in \{1,2\} & \text{(条件5)} \end{cases} \]

条件1:\(x_{i(t-1)} \neq x_{it}\)

\(t-1\) 秒车还不在叉车里,第\(t\)秒刚把车抓取装载进横移机,是本次运输的起点时刻。

条件2:\(\displaystyle \sum_{e=0}^{E-1} \big(x_{i(t+e)} - x_{it}\big) = 0\)

\(t\)秒到\(t+E-1\)秒,这连续\(E\)秒全程:车辆编码一直等于1或2,始终待在叉车上面,中途不能中途卸货、不能半路跳去别的位置。
求和每一项都是 0,总和自然为 0。

条件3:\(x_{it} \neq x_{i(t+E)}\)

等到第\(t+E\)秒,车辆编码发生改变,正式卸载离开叉车,送到目标车位 / 出口,本次运输彻底结束。

条件4+5

  • 条件5:确认当前确实处在接 / 送叉车工位;
  • 条件4:这条运输路线是题目规定的合法路线,对应固定时长\(E\)

三、约束核心规则

叉车一旦把车抓上车开始运输,必须严格跑完该路线规定的\(E\)整秒时长:

  1. 运输中途不允许中途停下、不允许提前卸货;
  2. 必须满\(E\)秒之后,才能把车辆放到目的位置,结束本次转运;

完全对应原题两条机械约束:

  • 约束 4:接车横移机单次运输有固定耗时,任务不能中断、不能提前;
  • 约束 5:送车横移机单次运输同样有固定行程时间,运输过程不可打断。

约束9:PBS进车顺序与出车顺序约束(𝒊与𝒋对应关系)

一、先把所有符号定义讲清楚

  1. \(I(i)\):进厂原始顺序
    \(i = 1,2,\dots,318\),代表第 1 台最先开进 PBS、第 2 台第二个进厂……第 318 台最后进厂,是涂装车间送过来的固定输入顺序。

  2. \(J(j)\):最终出厂出库序列
    \(j = 1,2,\dots,318\),代表第 \(j\) 个驶出 PBS、送往总装的车辆。

  3. \(t_{\{x_{J(j)}\ t_{first}=3\}}\)
    编码 3 代表车辆离开 PBS 进入总装;
    这个式子含义:出库序列里第 \(j\) 台车,第一次出现编码 3、正式开出 PBS 的具体时刻。

  4. \(J(j) = f(I(i))\):映射关系
    出库队列里每一台车,都能唯一溯源到它最开始的进厂编号,不会丢车、不会重复。

  5. \(U\):出车序列动力属性(混动 / 燃油),\(V\):出车序列驱动属性(两驱 / 四驱);\(J=(U,V)\) 就是给每台出库车绑定它的两个固有车型属性。

二、核心不等式公式

\[t_{\{x_{J(1)}\ t_{first}=3\}} \ < \ t_{\{x_{J(2)}\ t_{first}=3\}} \ < \ \dots \ < \ t_{\{x_{J(318)}\ t_{first}=3\}} \]

直译核心规则

出库必须严格按照先后时间排序:第 1 个出库的车离开时间 \(<\) 第 2 个出库车离开时间 \(< \dots \dots <\) 第 318 台出库车离开时间。
也就是出车队列是严格按出厂时间从小到大排列,绝对不允许后进厂的车反而比先进厂的车更早开出 PBS。

三、整段约束的两层本质含义

第一层:出库队列本身时序严格递增

每一台车驶出 PBS 的时间,必须按照出库列表 \(J\) 的下标依次往后推迟,不能插队逆序。
比如 \(J(5)\) 是第五个该出库的车,它的出厂时间绝对不能早于 \(J(4)\)

第二层:绑定进厂原始顺序,不能颠倒全局先后

\(J(j) = f(I(i))\) 规定:
出库列表\(J\)里存放的就是经过调度重排后的进厂车辆编号,并且进厂更早的车辆,最终出厂时间一定不会晚于后进厂车辆。

简单说:
先送进 PBS 的车,整体上必须先完成出库;后进来的车不能整体抢先全部出库,破坏来料基本顺序。

posted @ 2026-07-19 16:13  王新文  阅读(2)  评论(0)    收藏  举报