首页 > 解决方案 > 更改周期数时“元组索引超出范围”

问题描述

我为你准备了以下问题。在下面的程序中,一架“飞机”从起始机场发送到各个机场,一次运送 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()

标签: pythontuplesindexoutofrangeexception

解决方案


通过查看您的代码,您在 max_in_row 方法中有一个额外的返回,它返回一个长度为 2 的元组。然后您尝试访问索引 3,这导致超出范围。


推荐阅读