«Индекс кортежа вне диапазона» при изменении количества циклов - PullRequest
0 голосов
/ 10 января 2020

У меня к вам следующий вопрос. В следующей программе «самолет» отправляется из стартового аэропорта в различные аэропорты, перевозя 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()

1 Ответ

2 голосов
/ 10 января 2020

Посмотрев на ваш код, вы получите дополнительный результат в методе max_in_row, который возвращает кортеж длины 2. Вы пытаетесь получить доступ к индексу 3, который вызывает выход за пределы допустимого диапазона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...