论文阅读|《制造环境下多AGV调度的强化学习方法》

《A Reinforcement Learning Method for Multi-AGV Scheduling in Manufacturing》

ICIT/2018

1 摘要

        这篇文章提出用强化学习求解多AGV流水车间调度问题。AGV在固定轨道上移动,在机器之间运输半成品(semi-finished product)。

        目标:最小化平均工件延迟和总完工时间。

2 论文解读

        强化学习算法应用于车间调度问题的难点:

                (1)如何将生产调度问题转化为强化学习问题。

                (2)如何保证调度问题的可行解可以通过该算法来学习。

2.1 问题描述

         下图中,IJB表示等待加工的工件缓冲区,OJB表示已加工完的工件缓冲区,AGV参与的工作是将从工件从上一工序加工机器的OJB运输到下一工序加工机器的IJB。

2.2 强化学习要素定义

2.2.1 State Space S(状态空间 S)

        状态空间由缓冲区-机器组合以及当前AGVs的位置决定的,对缓冲区OJBi-机器Mi组合的状态Si,Si的值定义为={1,2,3,4},分别表示为:

        (1)机器Mi空闲且OJBi缓冲区为空.

        (2)机器Mi正在加工OJBi缓冲区为空

        (3)机器Mi空闲但OJBi缓冲区不为空

        (4)机器Mi正在加工且OJBi缓冲区不为空

        于是,整个状态空间定义为m+k(m个机器-缓冲对的状态,即上面的4个+k个AGV所在的位置)个长度的一位向量空间。

        位置定义可见:

 2.2.2 动作空间 A

         对动作空间A={a1,a2,...,am-1},动作ai定义为AGV将一个工件从机器的OJB缓冲区转移至下一机器的IJB,所有工件 都需要被转移至下一机器直至经过所有机器,于是最小的转移次数为n*(m-1)。

2.2.3 状态转移(System Transition Times)

        当AGV将一个工件放入下一机器的IJB时,这个AGV就进入下一个Transporting task,进行下一状态,假设AGV是在Mk的位置并且需要从Mi运输工件至mi+1传输作业,则该传输任务包括两个连续的AGV移动:

        (1)第一个运动是AGV从其当前位置移动到Mi的输出缓冲区,以取走作业。

        (2)第二个动作是将产品移动到Mi+1的IJB。

        如果在Mi的OJBi中没有完成的作业,则第二移动可能被延迟。因此,该AGV必须在机器Mi处定时等待,直到Mi+1完成作业为止。d定义为AGV到达Mi的输出缓冲器之后的等待时间。作业过渡的时间计算如下 :

 2.2.4 奖励函数

        这篇文章它设计了两个奖励函数,它的策略是一部分AGV使用r1作为奖励函数,以最小化AGV等待时间,剩下一部分AGV使用r2作为奖励函数,以此来最小化工件等待时间,最终来引导最大完工时间的下降。

        当AGV完成一个transfer task,它将转移下一个工件到另一个机器,下一机器定义为Mi,AT(i)定义为AGV到达Mi的OJB的时间,由于机器可以处于任何状态,AGV到达时将有两种可能的情况:

(1)Mi处于状态2,AGV必须等待直到机器完成工序。

(2)Mi处于状态3、4,AGV不会延迟直接转移下一工件。

        在第二种情况下,当AGV到达时,存储的所有作业都等待了不同的持续时间,因此AGV将选择等待时间最长的工件,这篇文章添加了一条规则,即如果机器Mi处于状态2,则AGV将不会接这个任务。

         于是,对r1:

        其中,JW(i)是等待时间最长的作业的过程完成时间 ;

        对r2:

   

### 关于强化学习制造车间AGV调度中的应用 强化学习是一种通过试错来优化策略的学习方法,近年来被广泛应用于自动化领域,特别是制造车间的自动导引车(AGV调度问题。以下是一个基于Python实现的简单示例代码框架,用于模拟强化学习算法解决AGV调度问题。 #### 环境定义 为了简化问题,可以构建一个二维网格环境,其中每个单元格代表工厂的一个区域或工作站。AGV的任务是从起点到终点运输物料,并遵循特定规则完成任务。 ```python import numpy as np import random class AGVEnv: def __init__(self, grid_size=5): self.grid_size = grid_size self.state = (0, 0) # 初始状态 self.goal_state = (grid_size - 1, grid_size - 1) # 终点状态 def reset(self): """重置环境""" self.state = (0, 0) return self.state def step(self, action): """ 执行动作并返回新的状态、奖励和是否结束标志。 动作编码: 0: 向上移动 1: 向下移动 2: 向左移动 3: 向右移动 """ x, y = self.state if action == 0: # 上移 x = max(x - 1, 0) elif action == 1: # 下移 x = min(x + 1, self.grid_size - 1) elif action == 2: # 左移 y = max(y - 1, 0) elif action == 3: # 右移 y = min(y + 1, self.grid_size - 1) new_state = (x, y) reward = -1 # 每次移动都有负奖励以鼓励快速到达目标 done = (new_state == self.goal_state) if done: reward += 100 # 达到目标给予额外正奖励 self.state = new_state return new_state, reward, done ``` #### Q-Learning 实现 Q-Learning 是一种经典的强化学习算法,适用于离散状态空间的小型问题。以下是针对上述环境的Q-Learning实现: ```python class QLearningAgent: def __init__(self, env, learning_rate=0.1, discount_factor=0.9, epsilon=0.1): self.env = env self.learning_rate = learning_rate self.discount_factor = discount_factor self.epsilon = epsilon self.q_table = {} def get_q_value(self, state, action): """获取指定状态下某个动作的Q值,默认初始为0""" if (state, action) not in self.q_table: self.q_table[(state, action)] = 0.0 return self.q_table[(state, action)] def choose_action(self, state): """ε-greedy策略选择动作""" if random.uniform(0, 1) < self.epsilon: return random.choice([0, 1, 2, 3]) # 随机探索 else: q_values = [self.get_q_value(state, a) for a in range(4)] return np.argmax(q_values) def update_q_table(self, state, action, reward, next_state): """更新Q表""" current_q = self.get_q_value(state, action) best_next_q = max([self.get_q_value(next_state, a) for a in range(4)]) td_target = reward + self.discount_factor * best_next_q updated_q = current_q + self.learning_rate * (td_target - current_q) self.q_table[(state, action)] = updated_q def train_agent(agent, episodes=1000): rewards_per_episode = [] for episode in range(episodes): total_reward = 0 state = agent.env.reset() done = False while not done: action = agent.choose_action(state) next_state, reward, done = agent.env.step(action) agent.update_q_table(state, action, reward, next_state) state = next_state total_reward += reward rewards_per_episode.append(total_reward) return rewards_per_episode ``` 此代码展示了如何利用Q-Learning训练一个简单的代理程序来控制AGV的行为[^1]。 #### GitHub资源推荐 GitHub上有许开源项目实现了类似的强化学习应用场景。可以通过关键词搜索找到更具体实现案例,例如“Reinforcement Learning AGV Scheduling”。一些流行的库如Stable-Baselines3也支持更复杂的模型训练过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码丽莲梦露

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值