用python写出生成车间调度问题甘特图的代码
时间: 2023-05-23 07:04:52 浏览: 130
遗传算法 车间调度 甘特图 代码.zip_officerf89_understandingapr_调度_调度 甘特图_遗传
5星 · 资源好评率100%
下面是用Python生成车间调度问题甘特图的代码:
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import datetime
# 创建数据
orders = pd.DataFrame({'order_id': [1, 2, 3, 4, 5], 'start': ['2022-12-01 00:00:00', '2022-12-01 00:00:00', '2022-12-01 00:00:00', '2022-12-02 00:00:00', '2022-12-02 00:00:00'], 'end': ['2022-12-02 00:00:00', '2022-12-02 00:00:00', '2022-12-02 00:00:00', '2022-12-03 00:00:00', '2022-12-03 00:00:00'], 'process_time': [24, 36, 48, 24, 48]})
# 转换时间格式
orders['start'] = pd.to_datetime(orders['start'], format='%Y-%m-%d %H:%M:%S')
orders['end'] = pd.to_datetime(orders['end'], format='%Y-%m-%d %H:%M:%S')
# 计算任务的开始和结束时间
tasks = []
for index, row in orders.iterrows():
task_start = row['start']
task_end = row['start'] + datetime.timedelta(hours=row['process_time'])
tasks.append((row['order_id'], task_start, task_end))
orders.loc[index, 'start'] = task_start
orders.loc[index, 'end'] = task_end
# 将任务转换为DataFrame
tasks_df = pd.DataFrame(tasks, columns=['order_id', 'start', 'end'])
tasks_df = tasks_df.sort_values(by='start')
# 计算目标日期范围
start_date = tasks_df['start'].min()
end_date = tasks_df['end'].max()
# 创建日期范围
dates = pd.date_range(start=start_date, end=end_date, freq='H')
# 创建甘特图数据
gantt_data = {}
for order_id, df in tasks_df.groupby('order_id'):
gantt_data[order_id] = np.zeros(len(dates))
for index, row in df.iterrows():
start_index = dates.get_loc(row['start'])
end_index = dates.get_loc(row['end'])
gantt_data[order_id][start_index:end_index] = 1
# 创建甘特图
fig, ax = plt.subplots(figsize=(10, 5))
for order_id, data in gantt_data.items():
y = [order_id + 0.5, order_id + 0.5]
x = [dates[0], dates[-1] + pd.Timedelta(hours=1)]
ax.plot(x, y, color='black')
ax.fill_between(dates, y[0], y[1], where=data == 1, color='green')
# 设置横轴和纵轴
ax.set_yticks(range(1, len(orders) + 1))
ax.set_yticklabels(orders['order_id'].values)
ax.set_xlabel('时间')
ax.set_ylabel('订单编号')
plt.show()
```
在上面的代码中,我们首先创建了一个数据框,其中包含每个订单的开始时间、结束时间和加工时间。我们将开始时间和结束时间的格式转换为datetime,以便我们可以更容易地进行计算。
接下来,我们计算每个任务的实际开始时间和结束时间,并将其存储在一个名为tasks的列表中。我们还在orders数据帧中更新了开始和结束时间的值。
然后,我们将任务转换为名为tasks_df的数据框,该数据框包含每个任务的订单号、开始时间和结束时间。我们按开始时间对任务数据框进行了排序,并计算了目标日期范围。
我们使用pandas.date_range函数创建了一个日期时间范围以表示甘特图中的时间轴。然后,我们循环每个任务,创建名为gantt_data的字典来存储甘特图数据,其中键是订单编号,值为一个长度为时间轴长度的numpy数组,该数组表示任务在该小时是否正在进行。最后,我们创建了一个甘特图,该图表使用matplotlib填充了灰色矩形来表示任务持续时间,并使用黑色线段表示订单之间的分界线。
运行此程序后,将生成一张甘特图,用于可视化车间调度问题。
阅读全文