У меня к вам следующий вопрос. В следующей программе «самолет» отправляется из стартового аэропорта в различные аэропорты, перевозя 10 человек (переменная: passenger_in_flight) за раз. Потребность в поездке, например, из Берлина (BE) в Мюнхен (MU) составляет 54 человека. Так как он пользуется наибольшим спросом среди всех направлений, самолет будет летать в Мюнхен, а оттуда лететь в Дюссельдорф (DÜ), поскольку этот маршрут также наиболее востребован из всех направлений из Мюнхена. И так далее. В конце концов, самолет должен был перевезти всех в его любимое место назначения
Программа запущена, единственная проблема, которую я получил, состоит в том, что если вы сделаете это более чем за 85 циклов, появится следующее сообщение об ошибке:
Traceback (most recent call last):
File "<ipython-input-46-54a5efde663e>", line 1, in <module>
runfile('C:/Users/Ben/unbenannt4.py', wdir='C:/Users/Ben')
File "C:\Users\Ben\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
execfile(filename, namespace)
File "C:\Users\Ben\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/Ben/unbenannt4.py", line 90, in <module>
main()
File "C:/Users/Ben/unbenannt4.py", line 39, in main
vehicleA.output()
File "C:/Users/Ben/unbenannt4.py", line 61, in output
self.point_in_time = self.point_in_time + i[3]
IndexError: tuple index out of range
Итак, это выражение:
self.point_in_time = self.point_in_time + i[3]
вызывает проблему. Если я меняю стартовую базу («депо»), количество циклов исполняемого файла меняется. В чем причина? Я уже округлил self.point_in_time, потому что подумал, что это может вызвать проблему
Извините за длинное сообщение. С уважением, Бен
data = {}
data["airports"] = ["BE", "BR", "DR", "DÜ", "HAM", "MU"]
data["distance_matrix"] = [
# BE BR DR DÜ HAM MU
# [0] [1] [2] [3] [4] [5]
[ 0, 315, 165, 477, 255, 200],# [0]BE
[ 315, 0, 404, 248, 95, 582],# [1]BR
[ 165, 404, 0, 485, 376, 359],# [2]DR
[ 477, 248, 485, 0, 338, 486],# [3]Dü
[ 255, 95, 376, 338, 0, 612],# [4]HAM
[ 504, 582, 359, 486, 612, 0] # [5]MU
]
data["travel_demand"] = [
# BE BR DR DÜ HAM MU
# [0] [1] [2] [3] [4] [5]
[ 0, 100, 20, 35, 70, 20],# [0]BE
[35, 0, 40, 48, 95, 82],# [1]BR
[15, 4, 0, 45, 24, 59],# [2]DR
[ 47, 70, 12, 0, 33, 86],# [3]Dü
[ 25, 9, 36, 38, 0, 12],# [4]HAM
[ 54, 58, 35, 87, 62, 0] # [5]MU
]
data["num_vehicles"] = 4
data['vehicle_speed'] = 250 #kmh
data["depot"] = 0
data["passenger_in_flight"] = 10
data["starttime"] = 0
data["maintenance"] = []
data["store_index"] = None
store_index = 0
def main():
vehicleA = airplane(data["travel_demand"], data["depot"], data["passenger_in_flight"], data["distance_matrix"], data['vehicle_speed'], data["airports"], data["starttime"], data["store_index"], data["num_vehicles"])
vehicleA.output()
for n in range(len(data["travel_demand"])):
print((data["travel_demand"])[n])
class airplane():
def __init__(self, travel_demand, depot, passengers_in_flight, distance_matrix, vehicle_speed, airports, point_in_time, store_index, num_vehicles):
self.travel_demand = travel_demand
self.depot = depot
self.passengers_in_flight = passengers_in_flight
self.distance_matrix = distance_matrix
self.vehicle_speed = vehicle_speed
self.airports = airports
self.point_in_time = point_in_time
self.store_index = store_index
self.num_vehicles = num_vehicles
def output(self):
for n in range(0, 87):
i = airplane.max_in_row(self)
self.point_in_time = self.point_in_time + i[3]
self.point_in_time = round(self.point_in_time, 4)
print((i[0]), " --> " ,(i[1])," ; ", i[2]," ; ", i[3]," ; ", self.point_in_time)
def max_in_row(self):
b = self.travel_demand # ["travel_demand"] # liste der einzelnen Flughäfen, wieviele dahin wollen
level = [] # von welcher spalte starten wir
for i in range(len(b)):
if self.point_in_time == 0:
store_indexold = self.depot
else:
store_indexold = self.store_index # die reihe wird durchgegangen
level.append(b[i][store_indexold]) # der liste level werden die werte der reihe hinzugefügt, die spalte bleibt gleich
self.store_index = level.index(max(level)) # der index des maxwertes wird übergeben (zeile wird bestimmt, spalte ist gegeben)
#
if b[i][store_index] < 10:
return (store_index, b[i][store_index])
else:
y = max(level) - self.passengers_in_flight #der maxwert selbst wird übergeben
self.travel_demand[self.store_index][store_indexold] = y
traveltime = int(self.distance_matrix[self.store_index][store_indexold])/int(self.vehicle_speed)
airport_last = self.airports[store_indexold]
airport_next = self.airports[self.store_index]
return(airport_last, airport_next, y, traveltime)
if __name__ == "__main__":
main()