如何使用python优化基于时间序列的资源分配

问题描述

我有 n 个进程需要分配给未知数量的资源。 输入数据格式为:

Start Time-Stop Time-LocationProcessstart-LocationProcessEnd

我也有基于时间和位置的资源限制,例如两个进程之间的最短时间或基于位置的限制。

是否有任何优化模型技术可以优化资源数量及其利用率。 如果需要,我会发布数据,但我正在寻找使用 Python 的方法。 作为参考,我的数据类似于公交车的时间表,我需要遵守一些工作规则。 所以如果有人能帮助我,那就太好了。

--编辑 1-- 虚拟数据

Dummy

我只有这个数据,有很多限制,比如总工作时间、总运行时间、休息时间等。 我需要包括所有约束,我需要找到承载所有行程所需的最小资源量,我见过优化模型,但我们知道资源数量,而在这里我们需要找到并优化它。

--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

这种排序是按照开始时间的升序进行的,因为车站签到时间提前了几分钟,其余代码块与检查取货位置相同。

这是输出:-

Output1

看起来不错,但看到 SignOff 和上次旅行的时间以及总运行时间之间的差异,这会在我们稍后移动时产生问题,例如:

Last Trips

资源每天最多可以运行 5:30 小时,如果需要,可以延长一点,例如 20 分钟但不超过 SignOff 时间。

也有一些不错的作业,但这是随机的,所以我需要找出更好的方法

Ideal Case

期待我可以尝试的替代品......!

--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 (将#修改为@)