Witaj szanowny Gościu na forum Odjechani.com.pl. Serdecznie zachęcamy do rejestracji. Tylko u nas tak przyjazna atmosfera. Kliknij tutaj, aby się zarejestrować i dołączyć do grona Odjechanych!

Strona odjechani.com.pl może przechowywać Twoje dane osobowe, które w niej zamieścisz po zarejestrowaniu konta. Odjechani.com.pl wykorzystuje również pliki cookies (ciasteczka), odwiedzając ją wyrażasz zgodę na ich wykorzystanie oraz rejestrując konto wyrażasz zgodę na przetwarzanie swoich danych osobowych w ramach funkcjonowania serwisu. Więcej informacji znajdziesz w naszej polityce prywatności. Pozdrawiamy!


[Python] Poszukuję czarodzieja!
#1
Witam wszystkich!
Poszukuję kogoś, kto ogarnia język Python. Mam aktualnie kolokwium, przygotowałem program w tymże języki, ale no, nie działa  Puknijsie

Temat zadania - napisz program w języku Python, który wykorzystując algorytm Dijkstry wskaże najkrótszy dystans pomiędzy dwoma.


# -*- coding: utf-8 -*-
"""
Created on Sat Jan 28 14:38:04 2018

@author: paul
"""
import numpy as np
import operator

text = open('dane_wej.txt').read()
count = len(open('dane_wej.txt').readlines())

cities=[]
city_visited = []
                
lines=text.split("\n")
    
datas=[]
i=1
for i in lines:
    line=i.split(";")
    datas.append(line)    


tab = []    
j=0
for i in datas:
    cities.append(datas[j][0])
    cities.append(datas[j][1])    
    j=j+1

city_list = list(set(cities))


for i in city_list:
    init = [i, None, None]        
    tab.append(init)

nr = 0
wejscie = ""
wyjscie = ""
poprawne = False

while (poprawne == False):
    print ("Wybierz z listy miast punkt początkowy: ")            
    for i in city_list:
        nr = nr+1
        print (nr,". ",i)
    
    nr = 0    
    wejscie = input("Napisz miasto: ")
    
    for i in city_list:
        if i == wejscie:
            poprawne = True
    
    if poprawne == False:
        print ("Nie ma takiego miasta! \nSprobuj jeszcze raz. \n")

poprawne = False

while (poprawne == False):
    print ("Wybierz z listy miast punkt koncowy: ")            
    for i in city_list:
        nr = nr+1
        if i == wejscie:
            print (nr,". ",i,"- punkt poczatkowy")
        else:
            print (nr,". ",i)
    
    nr = 0    
    wyjscie = input("Napisz miasto: ")
    
    for i in city_list:
        if i == wejscie:
            poprawne = True
    
    if poprawne == False:
        print ("Nie ma takiego miasta! \nSprobuj jeszcze raz. \n")

print ("Wyszukiwanie najkrotszej trasy ", wejscie, "-" , wyjscie, "....")

for i in range(len(tab)):
    if tab[i][0] == wejscie:
        tab[i][1] = 0
        tab[i][2] = 0

city_list.remove(wejscie)
city_visited.append(wejscie)
print (city_list)
print (city_visited)

operacje = 0

for i in range(len(datas)):
    datas[i][2]=int(datas[i][2])

sortowanie = sorted(datas, key=operator.itemgetter(2))
#print (sortowanie)


while (operacje < (len(tab)-1)):
    search=True
    flag = 0 
    droga = 0
    print ("Operacja nr: ", operacje)
    while (search == True):
        print ("linijka obslugiwana: ", datas[flag][:])         
        if ((sortowanie[flag][0] in city_visited) and (not(sortowanie[flag][1] in city_visited))):
                       
            poprzednik = sortowanie[flag][0]
            cel = sortowanie[flag][1]
            for i in range(len(tab)):
                if tab[i][0] == poprzednik:
                    droga = int(tab[i][1])
                                    
            for j in range(len(tab)):
                if tab[j][0] == cel:
                    tab[j][1]=droga+int(sortowanie[flag][2])
                    tab[j][2]=poprzednik
            
            operacje = operacje + 1            
            search = False
            city_visited.append(sortowanie[flag][1])
            
            print ("Zmiana odwiedzonych miejsc", city_visited)
            sortowanie.remove([sortowanie[flag][0], sortowanie[flag][1], sortowanie[flag][2]])
            print ("Datas po usunieciu")
            print(sortowanie)            
            
        else:
            print ("Nic się nie dzieje")
           
        flag = flag + 1
        print ("zmiana flagi na ", flag)
        print("\n", tab)

print(sortowanie)
        

Dane:

Szczecin;Poznan;30
Poznan;Katowice;80
Szczecin;Olsztyn;260
Gdansk;Szczecin;210
Olsztyn;Gdansk;100
Szczecin;Wroclaw;300
Wroclaw;Olsztyn;90
Wroclaw;Katowice;120
Olsztyn;Katowice;40

Ktoś gdzieś widzi jakąś literówkę, etc.? :D
  Odpowiedz
#2
Nie jestem pewien czy dobrze myślę, ale po przejrzeniu kodu na szybko podejrzewam, że warunek
if ((sortowanie[flag][0] in city_visited) and (not(sortowanie[flag][1] in city_visited))):
albo nigdy się nie wykona, albo wykona się zbyt późno. Problem, który wywołuje crash programu jest odwołanie się do nieprawidłowego indeksu tablicy "sortowanie" w tymże warunku. Indeks ten jest zależny od zmiennej "flag", która się zwiększa tak długo, aż zostanie spełniony ten warunek. Więc według mnie najpierw powinieneś zobaczyć czy wczytałeś do tablic to co trzeba oraz czy warunek jest prawidłowy. Niestety żadnym czarodziejem nie jestem, więc nic więcej nie umiem powiedzieć :D
  Odpowiedz


Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości