如何解决有约束的航班到插槽的分配问题?
我无法为到达机场的航班分配舱位(分配问题)。
我有以下信息:
time_slots = ['4:45','5:00','5:15','5:30','5:45','6:00']
(这表示广告位1:“ 4:45”到“ 4:59”的时间间隔)
Capacity_each_slot = [1,2,1,3]
(我们可以为每个广告位分配多少航班)
flights_arrivals = ['4:47','5:02','5:10','5:12','5:14','5:33','5:48','5:50','5:58']
Duration_flights = [500,400,1200,350,1000,250,300]`
我已经计算出:
Indices_for_arrivals = [0,3,4,4]
(表示每个航班属于哪个插槽)`
因此,我需要在容量限制下将每个航班分配到各个广告位。例如,广告位1(4:45)不能乘坐超过一次航班,广告位2(5:00)不能乘坐超过两次航班。.etc。
在上面刚说明的约束下,我设法使用以下代码为每个航班分配了插槽:
def ration_by_schedule(flight_times,capacity,T):
num_sched_flights = [0 for i in range(T)] # list to keep track of number of flights scheduled in each interval
new_flight_schedule = [] # list to store new flight times
for t in flight_times:
for s in range(t,T):
if num_sched_flights[s] < capacity[s]:
new_flight_schedule.append(s)
num_sched_flights[s] += 1
break
else:
raise RuntimeError ("Not enough capacity to schedule all flights")
return new_flight_schedule
schedule = ration_by_schedule(Indices_for_arrivals,Capacity_each_slot,9)
print(schedule)
Output : [0,4]
我的问题是我想向另一个飞行时间超过10小时(Duration_flights> 1000)的航班实施优先级方案的约束。
我想我可以从豁免开始,并首先使用它们的索引将它们分配为:
exempted_flights_indices = [2,6]
在这种情况下,我的结果将是:
new_flight = [0,4]
如何在我的代码中添加持续时间约束?
解决方法
这不是您问题的解决方案,但这是一种使代码更清晰的方法(也适用于其他约束)。
使用字典,而不是(计算出的)索引-创建索引非常简单:
time_slots = ['4:45','5:00','5:15','5:30','5:45','6:00']
capacity_each_slot = [1,2,1,3]
capacities = dict(zip(time_slots,capacity_each_slot))
flights_arrivals = ['4:47','5:02','5:10','5:12','5:14','5:33','5:48','5:50','5:58']
duration_flights = [500,400,1200,350,1000,250,300]
durations = dict(zip(flights_arrivals,duration_flights))
(我将您的大写字母名称更改为所有小写字母-参见PEP 8 - Function and Variable Names。)
所以您将获得字典
capacities = {'4:45': 1,'5:00': 2,'5:15': 1,'5:30': 1,'5:45': 2,'6:00': 3}
和
durations = {'4:47': 500,'5:02': 400,'5:10': 1200,'5:12': 350,'5:14': 1000,'5:33': 350,'5:48': 1000,'5:50': 250,'5:58': 300}
此外,与其使用字符串表示时间,不如使用内置模块datetime
-您将可以比较时间:
import datetime
slot0 = datetime.time(4,45) # 4:45
slot1 = datetime.time(5) # 5:00 (or datetime.time(5,0))
...
time_slots = (slot0,slot1,...)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。