Problem z dodawaniem kolejnych elementów do tablicy oraz jej rozszerzaniem funkcją .append

Odpowiedz Nowy wątek
2017-12-13 12:14
0

Dzień dobry.

Cały kod jest długi, dlatego wklejam tylko wycinek. Macierz wierzchołków jest to macierz, która jeżeli wierzchołek jest połączony z innym przypisuje na skrzyżowaniu losową wartość z przedziału, mówiącą o maksymalnej przepustowości tego połączenia. Dodaje element do tablicy tras jeżeli znajdzie połączenie pomiędzy wierzchołkami. Tablica tras ma finalnie wypisać wszystkie możliwe trasy pomiędzy wierzchołkami w grafie spójnym nieskierowany. Stan, który jest pokazany poniżej pokazuje, że znalazł na wierzchołka nr 4 połączenia z nr 0 i nr 3. Teraz chciałbym, żeby poszukał połączeń dla wierzchołków 0 i 3 oraz zapisywał to to tablicy tras jak poniżej. Tu akurat sytuacja tylko dla wierzchołka nr 0, ponieważ nie potrafię jeszcze tego iterować.
Kod dobrze wyszukuje, z którymi się łączy, ale źle zapisuje wyniki do tablicy tras, jak poniżej.

print(tablica_tras) 

iteracja_tras=0
iteracja_macierz=0
iteracja_while=0
nr_wierzcholka_sprawdzanego_w_tabblicy_tras=1

while iteracja_while < liczba_wierzcholkow:
    if (macierz_wierzcholkow[tablica_tras[iteracja_tras][nr_wierzcholka_sprawdzanego_w_tabblicy_tras],iteracja_macierz] > 0):
        tablica_tras.append(tablica_tras[iteracja_tras])
        tablica_tras[len(tablica_tras)-1].append(iteracja_macierz)
        iteracja_while = iteracja_while + 1
        iteracja_macierz = iteracja_macierz + 1
    else:
        iteracja_while = iteracja_while + 1
        iteracja_macierz = iteracja_macierz + 1

print(tablica_tras)

w wyniku działania kodu j.w. dostaję

[[4, 0], [4, 3]] -> to jest pierwotna tablica tras

[[4, 0, 1, 2, 4], [4, 3], [4, 0, 1, 2, 4], [4, 0, 1, 2, 4], [4, 0, 1, 2, 4]] -> to jest tablica wynikowa

nie rozumiem dlaczego modyfikuje np. element tablica_tras[0] i dlaczego nie wygląda to tak jak bym chciał, żeby po prostu skopiowało tablica_tras[0] x 3, wstawiło na koniec tablicy oraz dodało do każdego wierzchołek, z którym się łączy. Ja sobie to wyobrażałem tak jak poniżej.

[[4, 0], [4, 3], [4, 0, 1], [4, 0, 2], [4, 0, 4]]

Poniżej skrócony problem, możliwy do uruchomienia, ale tożsamy z moim problemem:

tablica_tras=[[4, 0], [4, 3]]
print(tablica_tras) 

iteracja_tras=0
iteracja_macierz=0
iteracja_while=0
nr_wierzcholka_sprawdzanego_w_tabblicy_tras=1

while iteracja_while < 3:
        tablica_tras.append(tablica_tras[iteracja_tras])
        tablica_tras[len(tablica_tras)-1].append(iteracja_macierz)
        iteracja_while = iteracja_while + 1
        iteracja_macierz = iteracja_macierz + 1

print(tablica_tras)

ponieważ wynik tego, że modyfikuje wszystkie elementy tablicy

[[4, 0], [4, 3]]
[[4, 0, 0, 1, 2], [4, 3], [4, 0, 0, 1, 2], [4, 0, 0, 1, 2], [4, 0, 0, 1, 2]]

Męczę się z tym od dłuższego czasu, czy ktoś mógłby mi pokazać gdzie popełniam błąd? Z góry dziękuję.

edytowany 5x, ostatnio: Zacharael, 2017-12-13 13:06
Nie da się zreprodukować Twojego wyniku, co to macierz wierzchołków?. Opisz szczegółowo co ma robić ten program. A Jakbyś zmienił nazwy w kodzie na angielskie to byłoby super, bo się oczopląsu od czytania tego dostaje. - lion137 2017-12-13 12:27
dodatkowo polecam znacznik ```python \n (twoj_kod) \n ``` bo wtedy działa podkreślenie składni - to też na pewno przyspieszy odpowiedź. Bo niektórym się nawet nie chce patrzeć na ściane tekstu by rozszyfrować elementy. I opisanie zasady wyrzucenia rezultatów także się przyda, bo wynik zreprodukować się da, ale bezsensownym rozwiązaniem działającym dla wybranych przykładów - jest nielogiczne. - Guaz 2017-12-13 12:42
"Macierz wierzchołków jest to macierz, która jeżeli wierzchołek jest połączony z innym przypisuje na skrzyżowaniu losową wartość z przedziału" dalej nie Pomagasz, jak ta macierz wygladąda, dalej nie można odtworzyć algorytmu. - lion137 2017-12-13 20:48

Pozostało 580 znaków

2017-12-13 21:16
1
tablica_tras=[[4, 0], [4, 3]]
print(tablica_tras) 

iteracja_tras=0
iteracja_macierz=0
iteracja_while=0
nr_wierzcholka_sprawdzanego_w_tabblicy_tras=1

while iteracja_while < 3: #Pierwszy przelot pętli
----------------------
        tablica_tras.append(tablica_tras[iteracja_tras]) #dodajesz do tablicy_tras kolejny element będący już w niej pod indeksem 0. czyli tablica_tras[[4,0], [4,3], [4,0]]
        tablica_tras[len(tablica_tras)-1].append(iteracja_macierz) #dodajesz do ostatniego elementu [4,0] będącego równocześnie pierwszym elementem(referencja) iteracje macierz, czyli przybiera postać [4, 0, 0]
        iteracja_while = iteracja_while + 1 #Zwiększasz iteracje_while, teraz jest równa 1
        iteracja_macierz = iteracja_macierz + 1 #zwiększasz iteracje macierz, teraz jest równa 1
---------------------- #Drugi przelot pętli
        tablica_tras.append(tablica_tras[iteracja_tras]) #dodajesz do tablicy_tras kolejny element będący już w niej pod indeksem 0. czyli tablica_tras[[4,0,0], [4,3], [4,0,0], [4,0,0]]
        tablica_tras[len(tablica_tras)-1].append(iteracja_macierz) #dodajesz do ostatniego, przedostatniego i pierwszego elementu [4,0,0] wartość z iteracja_macierz, czyli przybiera postać [4, 0, 0, 1] 
#Daje nam to znów [[4, 0, 0, 1], [4, 3], [4, 0, 0, 1], [4, 0, 0, 1]
        iteracja_while = iteracja_while + 1 #Zwiększasz iteracje_while, teraz jest równa 1
        iteracja_macierz = iteracja_macierz + 1 #zwiększasz iteracje macierz, teraz jest równa 1
---------------------- # Itd. aż zakończy się pętla while.
print(tablica_tras)

Problemem jest tu wiele rzeczy.
Pierwsze to że działasz na zmiennych globalnych.
Drugie, że nie widzę tu twojej losowości.
Trzecie - debug programu ci potrzebny. Albo bawisz się z printami w pętlach co krok i analizujesz. Albo korzystasz z narzędzi - obie praktyki przydatne w szczególnych problemach.
Wygodniejsze i lepsze dla większości krótkich funkcji to
http://pythontutor.com/visual[...]B%5D&textReferences=false

To ci przedstawi krok po kroku co się dzieje w twoim programie.
Natomiast chyba rozumiem już co chcesz osiągnąć. Jako argument podajesz dwa wierzchołki macierzy i chcesz dodać pozostałe w formie dwie wartości wychodzące i wartości do których prowadzi druga wartość nie będące tą w drugim argumencie.
Rozwiązać to można prościej:

data = [[4,0], [4,3]]
wierzcholki = 5 # 0, 1, 2, 3, 4 => Łącznie to 5 wierzchołków, 
#Jeśli źle rozumiem i 5 również powinno być zawarte w for podmień wierzcholki na wierzcholki+1
for val in range(data[0][1], wierzcholki):
    data.append(data[0]+[val]) if val != data[1][1] and val != data[0][1] else None
print(data)

Polecam sprawdzić jak działa kod który podesłałem powyżej, w linku który zawiera twoją "metodę".


Linux Mint
Arduino / Python 3.5.2
edytowany 3x, ostatnio: Guaz, 2017-12-13 21:18

Pozostało 580 znaków

2017-12-14 08:22
0

Poniżej jest to co napisałem do tej pory. Dziękuję za uwagi. Twoje rozwiązanie tworzy tą tablicę w pożądany przeze mnie sposób. Tylko u mnie problemem jest to, że on startuje od pierwszego wierzchołka i szuka wierzchołków z nim połączonych. Potem od tych co znalazł szuka kolejnych, żeby finalnie stworzyć tablicę wszystkich dostępnych tras pomiędzy początkiem i końcem. Nie pisałem nigdy wcześniej w Pythonie stąd te moje złe praktyki. Uczę się go na bieżąco podczas pisania i staram się dużo czytać. Problemem w tych trasach jest to, że on musi sprawdzać czy przypadkiem się nie cofa do wierzchołka, w którym już był. Jest tutaj mnóstwo rzeczy do ogarnięcia.

import numpy as np
import random

liczba_wierzcholkow=5
liczba_dodanych_polaczen_wierzcholkow = round((liczba_wierzcholkow*0.4),0)
print('liczba dodanych=', liczba_dodanych_polaczen_wierzcholkow)
iteracja = 0
poprzedni_wierzcholek_ptw = 0
kolejny_wierzcholek_ptw = 1
macierz_wierzcholkow = np.zeros((liczba_wierzcholkow,liczba_wierzcholkow))
tablica_wierzcholkow = np.arange(liczba_wierzcholkow)

np.random.shuffle(tablica_wierzcholkow)
print(tablica_wierzcholkow)

while iteracja<(liczba_wierzcholkow-1):
    pierwsza_wspolrzedna_mw  = (tablica_wierzcholkow[poprzedni_wierzcholek_ptw])
    druga_wspolrzedna_mw = (tablica_wierzcholkow[kolejny_wierzcholek_ptw])
    macierz_wierzcholkow[pierwsza_wspolrzedna_mw,druga_wspolrzedna_mw]=random.randint(50,100)
    print('przypisuje do pustego wierzcholka (', pierwsza_wspolrzedna_mw, druga_wspolrzedna_mw, ') wartosc=', macierz_wierzcholkow[pierwsza_wspolrzedna_mw,druga_wspolrzedna_mw])
    macierz_wierzcholkow[druga_wspolrzedna_mw,pierwsza_wspolrzedna_mw]=macierz_wierzcholkow[pierwsza_wspolrzedna_mw,druga_wspolrzedna_mw]
    iteracja = iteracja + 1
    poprzedni_wierzcholek_ptw = poprzedni_wierzcholek_ptw + 1
    kolejny_wierzcholek_ptw = kolejny_wierzcholek_ptw + 1

print(macierz_wierzcholkow)

iteracja=0
while iteracja<=liczba_dodanych_polaczen_wierzcholkow:
    pierwszy_losowy_wierzcholek=random.choice(tablica_wierzcholkow)
    drugi_losowy_wierzcholek=random.choice(tablica_wierzcholkow)
    print('(',pierwszy_losowy_wierzcholek,drugi_losowy_wierzcholek,')')
    print(macierz_wierzcholkow[pierwszy_losowy_wierzcholek,drugi_losowy_wierzcholek]) 
    if (macierz_wierzcholkow[pierwszy_losowy_wierzcholek,drugi_losowy_wierzcholek])==0 and pierwszy_losowy_wierzcholek != drugi_losowy_wierzcholek:
        macierz_wierzcholkow[pierwszy_losowy_wierzcholek,drugi_losowy_wierzcholek]=random.randint(50,100)
        macierz_wierzcholkow[drugi_losowy_wierzcholek,pierwszy_losowy_wierzcholek]=macierz_wierzcholkow[pierwszy_losowy_wierzcholek,drugi_losowy_wierzcholek]
        iteracja=iteracja + 1
        print('jest wolny i nie laczy sie sam ze soba, przypisuje do pustego wierzcholka wartosc =', macierz_wierzcholkow[pierwszy_losowy_wierzcholek,drugi_losowy_wierzcholek]) 
    else:
        print('byl juz zajety lub wymaga polaczenia semego ze soba')

print()
print(macierz_wierzcholkow)

iteracja=0
while iteracja<liczba_wierzcholkow:
    tablica_wierzcholkow[iteracja]=random.randint(50,100)
    iteracja = iteracja + 1

iteracja_for=0
poczatek=4
koniec=0
tablica_tras = [[poczatek for col in range(1)] for row in range(1)]
kolejny_element_tablicy_tras=0

print()
print(tablica_tras)

for iteracja_for in range(liczba_wierzcholkow):
    if (kolejny_element_tablicy_tras==0) and (macierz_wierzcholkow[poczatek,iteracja_for]) > 0:
        tablica_tras[kolejny_element_tablicy_tras].append(iteracja_for)
        print('jestem if, a iteracja=', iteracja_for)
        iteracja_for = iteracja_for + 1
        kolejny_element_tablicy_tras = kolejny_element_tablicy_tras + 1
        print()
        print(tablica_tras)
        print()

    elif (iteracja_for > 0) and (macierz_wierzcholkow[poczatek,iteracja_for]) > 0:
        tablica_tras.append([poczatek])
        tablica_tras[kolejny_element_tablicy_tras].append(iteracja_for)
        print('jestem elif, a iteracja=', iteracja_for)
        iteracja_for = iteracja_for + 1
        kolejny_element_tablicy_tras = kolejny_element_tablicy_tras + 1
        print()
        print(tablica_tras)
        print()

    else:
        print('jestem else, a iteracja=', iteracja_for)
        iteracja_for = iteracja_for + 1

    iteracja_for=0

print()
print(tablica_tras) 

iteracja_tras=0
iteracja_macierz=0
iteracja_while=0
nr_wierzcholka_sprawdzanego_w_tabblicy_tras=1

while iteracja_while < liczba_wierzcholkow:
    if (macierz_wierzcholkow[tablica_tras[iteracja_tras][nr_wierzcholka_sprawdzanego_w_tabblicy_tras],iteracja_macierz] > 0):
        tablica_tras.append(tablica_tras[iteracja_tras])
        tablica_tras[len(tablica_tras)-1].append(iteracja_macierz)
        iteracja_while = iteracja_while + 1
        iteracja_macierz = iteracja_macierz + 1
    else:
        iteracja_while = iteracja_while + 1
        iteracja_macierz = iteracja_macierz + 1

print(tablica_tras)
edytowany 1x, ostatnio: Zacharael, 2017-12-14 09:04
if val != data[1][1] and val != data[0][1] else None to wyrażenie neguje to o czym piszesz. Bo dodaje nam rekord tylko gdy nasze val nie jest równe wartością (w przykładzie 0 i 3) będącym w argumentach mu zadanych :). Myślę że jakbyś się tym pobawił, przerobił na funkcje i zadał drugą pętlę, uzyskałbyś zamierzony efekt, gdy tak patrzę na twój cały kod. Niemniej powodzenia :d - Guaz 2017-12-14 16:52

Pozostało 580 znaków

2017-12-15 06:45

A nie jest tak, że po prostu wstawiasz tablicę (czyli referencję) zamiast ją kopiować?
https://4programmers.net/Foru[...]zacji_tablic_wielowymiarowych

To też mniej-więcej było zapisane w komentarzach do programu będącego w poście nr. 1 :). - Guaz 2017-12-15 09:05
@Guaz -- a to sorry. :) - koszalek-opalek 2017-12-15 09:28
miałeś rację, korzystając z copy.deepcopy powoli dochodzę do pożądanych efetów - Zacharael 2017-12-15 14:09

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0