3

私はかなり大きな問題に取り組んでおり、立ち往生しています。誰かが私にアイデアをくれることを期待して、ここでそれを単純化しようとします...

以下に示すように、異なる時間 (TimeIndex) に出発する 25 のフライト (FlightID) があり、10 の利用可能な手荷物処理ワークステーション (WS) に割り当てる必要があるとします。

フライト情報

各フライトには、StartTime から EndTime まで占有される 1 つ、2 つ、または 3 つの手荷物処理ワークステーション (WS) が必要です。各ワークステーションは、全期間 (StartTime から EndTime まで) で 1 つのフライトのみを提供できます。

私がこれまでに持っているものは次のようになります。

まず、.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))

次の制約は、1 つのワークステーションが一度に 1 つのフライトにのみ割り当てられるように強制します。

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

また、パンダを使用して「x」を視覚化しています。

# 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()

さて、私の問題は、以下に示すように、1 つのワークステーション (WS) がそのフライトに必要なすべての時間に同じフライトに割り当てられるように、3 番目の制約を作成する方法がわからないことです。

これまでの結果。

より正確には、たとえば、Flight01 は、常に (116 から 140 まで) WS1 に割り当てられる必要があります。

4

0 に答える 0