在Python / PuLP中分配到行李处理工作站的航班

时间:2016-05-16 14:07:31

标签: python pulp

我正在研究相当大的问题而且我遇到了困难。我会在这里尝试简化它,希望有人可以给我一个想法......

假设我们有25个航班(FlightID)在不同时间(TimeIndex)离开,必须分配给10个可用的行李处理工作站(WS),如下所示:

Flights information

每个航班需要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)分配到同一航班,如下所示:

Result so far.

更准确地说,例如,Flight01应该一直分配给WS1(从116到140)。

0 个答案:

没有答案