2017-03-27 6 views
0

それがエラーを示して自分のコードに問題があります:PythonのはIndexError:範囲外のリストインデックス(スイープアルゴリズム)

File "C:\Users\gileu\Google Drive\FIME\Temas Selectos de Optimización\Heuristica de Barridos\Barridos.py", line 85, in <module> 
     elif(datos[j][2] <= ca): 
    IndexError: list index out of range 

私は私は比較になってるの値を表示し、手動でしようと、それが動作しますただし、ifステートメントで使用されると、クラッシュします。

ここでは、コードです:

import sys 
from math import * 
'''Inicialización: Obetener los datos necesarios para la funcionalidad del programa. 
El formato del dato individual debe ser transformado al siguiente formato: 
dato[i] = [x,y,d] donde: 
x = coordenada x del dato 
y = coordenada y del dato 
d = demanda a atender del dato ''' 
datos = [[0,1,33],[1,0,15],[-1,1,10],[-1,-1,10],[1,1,20],[0,-1,17],[1,-1,13],[-1,0,9]] 

#El origen pertenecerá a todos los grupos creados, y se tomará como el origen. 
Or = [0,0] 

#La capacidad de cada grupo debe ser mayor que el máximo de todas las demandas, esto para poder antende las necesidades de todos los datos. 
c = 80 

ang = [] 
angO = [] 
grupos = [] 

print("Paso 1: Conseguir los grados de cada punto.") 
print() 

for i in range(len(datos)): 
    #Cuadrante II: 
    if(datos[i][0] < 0 and datos[i][1] > 0): 
     ang.append(degrees(atan(datos[i][1]/datos[i][0]))+180) 
     angO.append(degrees(atan(datos[i][1]/datos[i][0]))+180) 
    #Cuadrante III: 
    elif(datos[i][0] < 0 and datos[i][1] < 0): 
     ang.append(270-degrees(atan(datos[i][1]/datos[i][0]))) 
     angO.append(270-degrees(atan(datos[i][1]/datos[i][0]))) 
    #Cuadrante IV: 
    elif(datos[i][0] > 0 and datos[i][1] < 0): 
     ang.append(degrees(atan(datos[i][1]/datos[i][0]))+360) 
     angO.append(degrees(atan(datos[i][1]/datos[i][0]))+360) 
    #Eje Y: 
    elif(datos[i][0] == 0 and datos[i][1] > 0): 
     ang.append(90) 
     angO.append(90) 
    #Eje -X: 
    elif(datos[i][0] < 0 and datos[i][1] == 0): 
     ang.append(180) 
     angO.append(180) 
    #Eje -Y: 
    elif(datos[i][0] == 0 and datos[i][1] < 0): 
     ang.append(270) 
     angO.append(270) 
    #Eje X: 
    elif(datos[i][0] > 0 and datos[i][1] == 0 or datos[i][0] == 0 and datos[i][1] == 0): 
     ang.append(0) 
     angO.append(0) 
    #Para cualquier otro ángulo: 
    else: 
     ang.append(degrees(atan(datos[i][1]/datos[i][0]))) 
     angO.append(degrees(atan(datos[i][1]/datos[i][0]))) 

print("Paso 2: Ordenar los ángulos de menor a mayor.") 
print() 
angO.sort() 

print("Coordenadas en posicion original: ", ang) 
print("Coordenadas en posicion ordenada: ", angO) 

print() 
print("Paso 3: Proceso de asignación.") 
print() 

i = 0 
j = 0 
while(angO): 
    grupos.append([]) 
    print(grupos[i]) 
    ca = c 
    print("Capacidad Actual: ", ca) 
    print("Numeros por asignar: ", angO) 
    print("Grupo actual: ", i) 
    print("Numero actual: ", j) 
    print(datos[j][2]) 
    print(ang.index(angO[0])) 
    while(ca>=0): 
     if(ca == 0): 
      i = i + 1 
      break 
     elif(datos[j][2] <= ca): 
      grupos[i].append(ang.index(angO[0])) 
      angO.remove(angO[0]) 
      j = j + 1 
     elif(datos[j][2] > ca): 
      i = i + 1 
      break 

for i in range(len(grupos)): 
    print("Grupo ", i, ": ", grupos[i]) 
+1

ようこそ、Gilberto、ソースコードの場所を含め、完全なエラートレースを投稿するとよいでしょう。あなたはこの標準的な練習に合うようにあなたのポストを親切に更新してもよろしいですか? – user3666197

+0

@ user3666197投稿を更新しました。推薦してくれてありがとう! –

答えて

0

問題は、このコードの一部であるように思わ:

while(ca>=0): 
    if(ca == 0): 
     i = i + 1 
     break 
    elif(datos[j][2] <= ca): 
     grupos[i].append(ang.index(angO[0])) 
     angO.remove(angO[0]) 
     j = j + 1 
    elif(datos[j][2] > ca): 
     i = i + 1 
     break 

あなたは決してありません、このwhileループで80である、ca=cを初期化してきたが、 caを減らすので、これは基本的に無限ループです。 len(datos)の値は有限であるが、すべての値がj,datos[j][2] <= caである場合、jはある時点でdatosの長さを超え、これはIndexError: list index out of rangeのエラーとなる。

jの条件を入力する必要があります。

+0

私は 'ca'を減らすことを忘れました!そのコードが修正されているかどうか確認してください。 –

+1

ありがとうございます! 'if(j

+0

はい、私はそう思っていました。' 'jen''には' 'len (datos) 'または' len(ang0) 'のいずれかになります。 – vish4071

関連する問題