问题描述
我有 n 个进程需要分配给未知数量的资源。 输入数据格式为:
Start Time-Stop Time-LocationProcessstart-LocationProcessEnd
我也有基于时间和位置的资源限制,例如两个进程之间的最短时间或基于位置的限制。
是否有任何优化模型技术可以优化资源数量及其利用率。 如果需要,我会发布数据,但我正在寻找使用 Python 的方法。 作为参考,我的数据类似于公交车的时间表,我需要遵守一些工作规则。 所以如果有人能帮助我,那就太好了。
--编辑 1-- 虚拟数据
我只有这个数据,有很多限制,比如总工作时间、总运行时间、休息时间等。 我需要包括所有约束,我需要找到承载所有行程所需的最小资源量,我见过优化模型,但我们知道资源数量,而在这里我们需要找到并优化它。
--EDIT2--
while finaldata.size !=0:
x=0
y=0
print('Creating Duty :',1 if duty.size==0 else (duty['Duty_No'].max() + 1))
finaldata.sort_values('Trip_Start',inplace=True)
finaldata.reset_index(drop=True,inplace=True)
while x < len(finaldata.index):
finaldata.sort_values('Trip_Start',inplace=True)
finaldata.reset_index(drop=True,inplace=True)
duty2 = pd.DataFrame()
if (finaldata['LocationPick'][x] == 'SHD') | (finaldata['LocationPick'][x] == 'DSG'):
trip = finaldata.iloc[x].copy()
trip['Duty_No'] = 1 if duty.size==0 else (duty['Duty_No'].max() + 1)
trip['Sign_On'] = finaldata['Trip_Start'][x] - datetime.timedelta(minutes=15)
trip['Sign_Off'] = finaldata['Trip_Start'][x] + datetime.timedelta(hours=7,minutes=45)
trip['Total_Run'] = finaldata['Trip_Duration'][x]
finaldata.drop(finaldata.index[x],inplace=True)
finaldata.reset_index(drop=True,inplace=True)
finaldata.sort_values(['Trip_Start'],inplace=True)
duty2 = duty2.append(trip)
y=0
#rest = datetime.timedelta(minutes=55)
rest = random.choice([datetime.timedelta(minutes=55),datetime.timedelta(minutes=25)])
ass=0
while y < len(finaldata.index):
ass=0
if (finaldata['LocationRelieve'][y] != 'SHD') & ((duty2['Total_Run'].max() + finaldata['Trip_Duration'][y]) <= datetime.timedelta(hours=3,minutes=30)):
y=y+1
continue
if (finaldata['Trip_Start'][y] - trip['Trip_End'] >= rest) & (finaldata['LocationPick'][y]==trip['LocationRelieve']) & ((duty2['Total_Run'].max() + finaldata['Trip_Duration'][y]) <= datetime.timedelta(hours=5,minutes=50)) & ((trip['Sign_Off']-finaldata['Trip_End'][y]) >= datetime.timedelta(minutes=10)):
trip = finaldata.iloc[y].copy()
trip['Total_Run'] = finaldata['Trip_Duration'][y]
trip['Sign_On'] = duty2['Sign_On'].max()
trip['Sign_Off'] = duty2['Sign_Off'].max()
trip['Duty_No'] = duty2['Duty_No'].max()
duty2['Total_Run'] = duty2['Total_Run'] + trip['Total_Run']
finaldata.drop(finaldata.index[y],inplace=True)
finaldata.reset_index(drop=True,inplace=True)
finaldata.sort_values(['Trip_Start'],inplace=True)
duty2 = duty2.append(trip)
ass = 1
#rest = datetime.timedelta(minutes=25)
rest = datetime.timedelta(minutes=25) if rest==datetime.timedelta(minutes=55) else datetime.timedelta(minutes=55)
y=(y+1) if ass==0 else 0
duty2['Total_Run'] = duty2['Total_Run'].max()
duty=duty.append(duty2)
del duty2
break
x=x+1
这种排序是按照开始时间的升序进行的,因为车站签到时间提前了几分钟,其余代码块与检查取货位置相同。
这是输出:-
看起来不错,但看到 SignOff 和上次旅行的时间以及总运行时间之间的差异,这会在我们稍后移动时产生问题,例如:
资源每天最多可以运行 5:30 小时,如果需要,可以延长一点,例如 20 分钟但不超过 SignOff 时间。
也有一些不错的作业,但这是随机的,所以我需要找出更好的方法。
期待我可以尝试的替代品......!
--EDIT3--
Train_No LocationPick Trip_Start TrainSBC LocationRelieve Trip_End Trip_Duration
101 DEPOT 04:25 0 SHD 06:24 01:59
104 DEPOT 04:44 0 SHD 06:39 01:55
102 SHDSDG 04:53 0 SHD 07:09 02:16
105 RISDG 05:00 0 SHD 07:09 02:09
109 DEPOT 05:00 0 SHD 06:55 01:54
106 NBAASDG 05:05 0 SHD 07:23 02:18
103 DEPOT 05:09 0 SHD 07:16 02:07
107 DEPOT 05:15 0 SHD 06:34 01:19
110 NBAASDG 05:20 0 SHD 07:38 02:18
108 DEPOT 05:25 0 SHD 06:41 01:16
111 DEPOT 05:30 0 SHD 06:48 01:18
118 DEPOT 05:34 0 SHD 07:30 01:56
112 DEPOT 05:35 0 SHD 06:55 01:20
114 NBAASDG 05:35 0 SHD 07:52 02:17
113 DEPOT 05:40 0 SHD 07:45 02:05
115 DEPOT 05:45 0 SHD 07:02 01:17
117 DEPOT 05:57 0 SHD 07:17 01:20
119 RISDG 05:57 0 SHD 08:00 02:02
116 RI 06:07 0 SHD 07:45 01:37
120 DEPOT 06:12 0 SHD 07:31 01:19
101 SHD 06:24 0 SHD 08:49 02:24
121 DEPOT 06:31 122 SHD 08:53 02:22
123 SHDSDG 06:34 121 SHD 08:46 02:12
107 SHD 06:34 0 SHD 08:57 02:23
122 DEPOT 06:38 124 SHD 08:46 02:07
104 SHD 06:39 0 SHD 09:04 02:24
108 SHD 06:41 0 SHD 09:04 02:23
124 DEPOT 06:45 125 SHD 08:53 02:07
111 SHD 06:48 0 SHD 09:13 02:25
125 DEPOT 06:53 126 SHD 09:00 02:07
109 SHD 06:55 0 SHD 09:18 02:23
112 SHD 06:55 0 SHD 09:18 02:23
126 DEPOT 07:00 127 SHD 09:07 02:07
115 SHD 07:02 0 SHD 09:26 02:23
122 DSG 07:07 0 SHD 08:38 01:31
127 DEPOT 07:07 128 SHD 09:14 02:07
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)