python - 更改周期数时“元组索引超出范围”
问题描述
我为你准备了以下问题。在下面的程序中,一架“飞机”从起始机场发送到各个机场,一次运送 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()
解决方案
通过查看您的代码,您在 max_in_row 方法中有一个额外的返回,它返回一个长度为 2 的元组。然后您尝试访问索引 3,这导致超出范围。
推荐阅读
- javascript - 用于匹配域名的 JavaScript 正则表达式 (FQDN)
- boost - SOLR FL 和 Boost 参数计算
- javascript - 目录中的安全 Flask 文件夹
- angular - 测试组件加载条 Angular
- javascript - 使用 HTML 中的按钮更改 SVG 圆圈的颜色
- javascript - TypeError:axios.request 不是函数
- javascript - 如何知道何时已使用 jQuery 取消选择元素
- android - 观察另一个 ViewModel 的 ViewModel
- mysql - 是否可以在 Go 中设置 SQL 连接字符串?
- powershell - 如何将值从 Get-WMIObject Win32_Printer 中的值转换为 ToUpper