Programmering

HVORDAN LAVER JEG ET FLOWCHART?!!!

26. maj kl. 18:15 af lepidoptera

Hejsa sidder fast i et flowchart - håber at der er nogen der kan hjælpe hurtigst muligt...

Har også vedlagt et billede af koden.

Nedstående er koden:
import heapq

def dijkstra(graph, start, end):
    # Initialiserer afstanden til alle lyskryds til uendelig
    distance = {vertex: float('infinity') for vertex in graph}
    distance[start] = 0  # Afstanden til startpunktet er 0
    # Opretter en prioritetskø til at holde styr på de lyskryds, vi skal besøge
    pq = [(0, start)]
    # Opretter en dictionary til at spore de lyskryds, der udgør den korteste rute
    previous_vertex = {}
    while pq:
        current_distance, current_vertex = heapq.heappop(pq)
        # Hvis vi allerede har behandlet denne lyskryds, fortsætter vi
        if current_distance > distance[current_vertex]:
            continue
        # Går gennem naboerne til det aktuelle lyskryds
        for neighbor, weight in graph[current_vertex]:
            distance_to_neighbor = current_distance + weight
            # Hvis vi har fundet en kortere vej til naboen, opdaterer vi afstanden
            if distance_to_neighbor < distance[neighbor]:
                distance[neighbor] = distance_to_neighbor
                heapq.heappush(pq, (distance_to_neighbor, neighbor))
                previous_vertex[neighbor] = current_vertex
    # Når vi har gennemgået alle lyskrydsene, har vi den korteste afstand til slutpunktet
    shortest_path = []
    current_vertex = end
    while current_vertex != start:
        shortest_path.append(current_vertex)
        current_vertex = previous_vertex[current_vertex]
    shortest_path.append(start)
    shortest_path.reverse()
    return distance[end], shortest_path
typografi = {
    'start': [('A', 5)],
    'A': [('B', 60), ('E', 20)],
    'B': [('C', 50), ('F', 5), ('A', 60)],
    'C': [('D', 40), ('B', 50)],
    'D': [('H', 30), ('C', 40)],
    'E': [('F', 40), ('I', 20), ('A', 20)],
    'F': [('G', 35), ('J', 40), ('E', 40), ('B', 5)],
    'G': [('H', 35), ('K', 15), ('F', 35)],
    'H': [('K', 20), ('D', 30), ('G', 35)],
    'I': [('J', 20), ('L', 20), ('E', 20)],
    'J': [('F', 40), ('I', 20), ('M', 40), ('N', 60)],
    'K': [('G', 15), ('H', 20), ('N', 10)],
    'L': [('I', 20), ('M', 50)],
    'M': [('L', 50), ('J', 40), ('N', 20)],
    'N': [('M', 20), ('J', 60), ('K', 10), ('slut', 5)],
    'slut': [('N', 5)]
}
startpunkt = 'start'
slutpunkt = 'slut'
korteste_afstand, korteste_rute = dijkstra(typografi, startpunkt, slutpunkt)
print("Antal lyskryds på ruten:", len(korteste_rute) - 1)
korteste_rute = dijkstra(typografi, startpunkt, slutpunkt)
print("Den korteste rute med færrest lyskryds er:", korteste_rute)
 


Brugbart svar (0)

Svar #1
26. maj kl. 22:37 af Martin2Holte

Hvorfor kalder du dijkstra funktionen to gange ?
Den anden gang, du kalder den, overskriver den den korteste rute.
Når du printer ruten, skal du hellere ikke kalde funktionen igen. Du burde kunne bruge den allerede beregnede værdi.

Sig til hvis du oplever andre problemer.


Brugbart svar (0)

Svar #2
26. maj kl. 22:48 af Martin2Holte

Jeg får denne løsning:

Antal lyskryds på ruten: 6
Den korteste rute med færrest lyskryds er: ['start', 'A', 'E', 'I', 'J', 'N', 'slut']

Her er en grafisk repræsentation af løsningen, se koden nedenunder:


Brugbart svar (0)

Svar #3
26. maj kl. 22:49 af Martin2Holte

Her er koden:

import heapq
import networkx as nx
import matplotlib.pyplot as plt

def dijkstra(graph, start, end):
    distance = {vertex: float('infinity') for vertex in graph}
    distance[start] = 0
    pq = [(0, start)]
    previous_vertex = {}
    while pq:
        current_distance, current_vertex = heapq.heappop(pq)
        if current_distance > distance[current_vertex]:
            continue
        for neighbor, weight in graph[current_vertex]:
            distance_to_neighbor = current_distance + weight
            if distance_to_neighbor < distance[neighbor]:
                distance[neighbor] = distance_to_neighbor
                heapq.heappush(pq, (distance_to_neighbor, neighbor))
                previous_vertex[neighbor] = current_vertex
    shortest_path = []
    current_vertex = end
    while current_vertex != start:
        shortest_path.append(current_vertex)
        current_vertex = previous_vertex[current_vertex]
    shortest_path.append(start)
    shortest_path.reverse()
    return distance[end], shortest_path

def draw_graph(graph, shortest_path):
    G = nx.DiGraph()
    for vertex in graph:
        for neighbor, weight in graph[vertex]:
            G.add_edge(vertex, neighbor, weight=weight)

    pos = nx.spring_layout(G)  # positions for all nodes
    edge_labels = nx.get_edge_attributes(G, 'weight')

    # Draw the nodes and edges
    nx.draw(G, pos, with_labels=True, node_color='lightblue', node_size=500, font_size=10, font_weight='bold')
    nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_size=10)

    # Highlight the shortest path
    path_edges = list(zip(shortest_path, shortest_path[1:]))
    nx.draw_networkx_edges(G, pos, edgelist=path_edges, edge_color='r', width=2)

    plt.show()

# Eksempel graf repræsentation
typografi = {
    'start': [('A', 5)],
    'A': [('B', 60), ('E', 20)],
    'B': [('C', 50), ('F', 5), ('A', 60)],
    'C': [('D', 40), ('B', 50)],
    'D': [('H', 30), ('C', 40)],
    'E': [('F', 40), ('I', 20), ('A', 20)],
    'F': [('G', 35), ('J', 40), ('E', 40), ('B', 5)],
    'G': [('H', 35), ('K', 15), ('F', 35)],
    'H': [('K', 20), ('D', 30), ('G', 35)],
    'I': [('J', 20), ('L', 20), ('E', 20)],
    'J': [('F', 40), ('I', 20), ('M', 40), ('N', 60)],
    'K': [('G', 15), ('H', 20), ('N', 10)],
    'L': [('I', 20), ('M', 50)],
    'M': [('L', 50), ('J', 40), ('N', 20)],
    'N': [('M', 20), ('J', 60), ('K', 10), ('slut', 5)],
    'slut': [('N', 5)]
}

startpunkt = 'start'
slutpunkt = 'slut'
korteste_afstand, korteste_rute = dijkstra(typografi, startpunkt, slutpunkt)

print("Antal lyskryds på ruten:", len(korteste_rute) - 1)
print("Den korteste rute med færrest lyskryds er:", korteste_rute)

# Tegn grafen og den korteste rute
draw_graph(typografi, korteste_rute)


Brugbart svar (0)

Svar #4
26. maj kl. 23:04 af Martin2Holte

Den tidligere graf var ikke tegnet proportional med længden.

Her er en version som viser længden proportional:


Svar #5
27. maj kl. 06:34 af lepidoptera

Tak for hjælpen

Skriv et svar til: HVORDAN LAVER JEG ET FLOWCHART?!!!

Du skal være logget ind, for at skrive et svar til dette spørgsmål. Klik her for at logge ind.
Har du ikke en bruger på Studieportalen.dk? Klik her for at oprette en bruger.