我正在研究相当大的问题而且我遇到了困难。我会在这里尝试简化它,希望有人可以给我一个想法......
假设我们有25个航班(FlightID)在不同时间(TimeIndex)离开,必须分配给10个可用的行李处理工作站(WS),如下所示:
每个航班需要1个,2个或3个行李处理工作站(WS),这些工作站将从StartTime占用到EndTime。每个工作站只能在整个时间段内(StartTime到EndTime)服务一个航班。
到目前为止我的样子是这样的:
首先,我正在从.csv文件中读取我的信息。
from pulp import *
import pandas
#Function to read from csv filename to dictionary dictname
def read_file(filename, dictname):
with open(filename, 'r') as f:
# Get the CSV reader and skip header
reader = csv.reader(f)
next(reader, None)
for row in reader:
#First column is the key, the rest is value
dictname[row[0]] = row[1:]
# Print result
# print(row[0], ':', dictname[row[0]])
# Read flight departures from csv file
flights = {}
flights_csv = '25_busySO.csv'
read_file(flights_csv, flights)
然后我创建了我的10个工作站。
chutes = []
for i in range(1,11):
chutes.append('ws' + str(i))
接下来,我宣布我的决策变量" x" - 以航班,时间,工作站为键,0为1的组合字典。
x = LpVariable.dicts('x', [(f, t, c) for f in flights.keys() for t in \
range(int(flights[f][1]),int(flights[f][2])+1) for c in chutes], 0, 1, LpBinary)
使用虚拟目标函数声明问题。
simploc = LpProblem('simploc', LpMinimize)
simploc += 0
第一个约束强制将所有航班分配到工作站到所需的24个时间。
for f in flights.keys():
simploc += lpSum(x[f, t, c] for t in range(int(flights[f][1]),int(flights[f][2])+1) \
for c in chutes) == 24
这会创建一组唯一的时间,以便仅在需要时创建约束,而不是经历所有可能时间的范围。
times = []
for k in x.keys():
times.append(k[1])
times = sorted(set(times))
下一个约束强制一个工作站仅分配给一个航班 时间。
for t in times:
for f in flights.keys():
try:
simploc += lpSum(x[f, t, c] for c in chutes) <= 1
except KeyError:
pass
只需在.txt中编写模型。
simploc.writeLP('simploc.txt')
simploc.solve()
# print problem status and objective value
print("problem status", LpStatus[simploc.status])
我也在使用pandas来获得&#34; x&#34;。
的可视化# transfer results from x lpvariable dictionary to dataframe for easy reading
result = {}
for k, v in x.items():
result[k] = value(v)
result = pandas.Series(result).unstack()
现在,我的问题是我不知道如何制定第三个约束,以便在该航班所需的所有时间内将一个工作站(WS)分配到同一航班,如下所示:
更准确地说,例如,Flight01应该一直分配给WS1(从116到140)。