Fil:DijkstraDemo.gif
Fra Wikisida.no
Hopp til navigering
Hopp til søk
DijkstraDemo.gif (521 × 518 piksler, filstørrelse: 5,94 MB, MIME-type: image/gif, gjentas, 127 rammer, 1 min 4 s)
Merk: På grunn av tekniske begrensninger vil ikke miniatyrbilder av høyoppløselige GIF-bilder, slik som denne, bli animert.
Denne filen er fra Wikimedia Commons og kan brukes av andre prosjekter. Beskrivelsen fra filbeskrivelsessida vises nedenfor.
Beskrivelse
BeskrivelseDijkstraDemo.gif |
English: A demo of Dijkstra's algorithm based on Euclidean distance. Red lines are the shortest path covering. Blue lines indicate where relaxing happens. |
Dato | |
Kilde | Eget verk |
Opphavsperson | Shiyu Ji |
Python 3 Code
'''
Dijkstra's shortest path covering (SVG) using priority queue.
Firstly use this code to generate SVG frames.
Then transform to bitmaps and convert to GIF.
'''
# range size
N = 500
margin = 20
def norm(px, py):
return ((px[0]-py[0])**2+(px[1]-py[1])**2)**.5
def saveToSVG(nFrames, points, edges, firmed, relaxing):
f = open('demo_'+'0'*(3-len(str(nFrames)))+str(nFrames)+'.svg', 'w')
f.write("<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">\n")
for p in points:
f.write("<circle cx=\"" +str(p[0]+margin)+ "\" cy=\""+ str(N-p[1]+margin) +"\" r=\"5\" fill=\"white\" stroke=\"black\"/>\n")
for i in range(len(edges)):
for j in edges[i]:
f.write("<line x1=\"" +str(points[i][0]+margin)+ "\" y1=\""+ str(N-points[i][1]+margin) +"\" x2=\"" + str(points[j][0]+margin) + "\" y2=\"" + str(N-points[j][1]+margin) + "\" stroke=\"grey\" stroke-width=\".5\"/>\n")
for L in firmed:
f.write("<line x1=\"" +str(L[0][0]+margin)+ "\" y1=\""+ str(N-L[0][1]+margin) +"\" x2=\"" + str(L[1][0]+margin) + "\" y2=\"" + str(N-L[1][1]+margin) + "\" stroke=\"red\" stroke-width=\"5\"/>\n")
for L in relaxing:
f.write("<line x1=\"" +str(L[0][0]+margin)+ "\" y1=\""+ str(N-L[0][1]+margin) +"\" x2=\"" + str(L[1][0]+margin) + "\" y2=\"" + str(N-L[1][1]+margin) + "\" stroke=\"blue\" stroke-width=\"5\"/>\n")
f.write("</svg>\n")
f.close()
def generatePoints(n):
import random as r
r.seed(10)
res = []
for i in range(n):
pt = [r.randint(0,N) for _ in [0, 1]]
if pt not in res:
res += [pt]
return res
# heuristic: neighbor with radius e.g. N/3
def generateEdges(n, points):
import random as r
r.seed(10)
edges = []
for i in range(n):
dst = []
for j in range(n):
if i!=j and norm(points[i], points[j]) < N/3:
dst.append(j);
edges.append(dst)
return edges
def dijkstra(n, points, edges):
nframe = 0
dist = [float("inf") for i in range(n)]
prev = [-1 for _ in range(n)]
cover = []
import heapq
dist[0] = 0.0
heap = [[dist[i], i] for i in range(n)]
while len(heap)>0:
u = heap[0][1]
if prev[u]!=-1:
cover.append([points[prev[u]], points[u]])
saveToSVG(nframe, points, edges, cover, [])
nframe+=1
heapq.heappop(heap)
for i in edges[u]:
if i!=u and dist[i] > dist[u] + norm(points[i], points[u]):
dist[i] = dist[u] + norm(points[i], points[u])
prev[i] = u
for j in range(len(heap)):
if heap[j][1] == i:
heap[j][0] = dist[i]
break
heapq.heapify(heap)
saveToSVG(nframe, points, edges, cover, [[points[u], points[i]]])
nframe+=1
return dist, prev
# test 50 points temporarily
n = 50
pts = generatePoints(n)
es = generateEdges(n, pts)
dijkstra(n, pts, es)
Lisensiering
Jeg, rettighetsinnehaver av dette arbeidet, publiserer det herved under følgende lisens:



Denne filen er lisensiert under lisensen Creative Commons Navngivelse-DelPåSammeVilkår 4.0 Internasjonal.
- Du står fritt:
- til å dele – til å kopiere, distribuere og overføre verket
- til å blande – til å endre verket
- Under de følgende betingelsene:
- navngivelse – Du må kreditere verket på passende vis, lenke til lisensen og indikere hvorvidt det har blitt gjort endringer. Du kan gjøre det på enhver rimelig måte, men ikke på en måte som antyder at lisensgiveren støtter deg eller din bruk av verket.
- del på samme vilkår – Dersom du remikser, omarbeider eller på annen måte bygger på dette verket, må du kun distribuere resultatet under den samme eller en samsvarende lisens som denne.
Bildetekster
Legg til en kort forklaring på hva filen representerer
Elementer som er med i denne fila
motiv
En verdi uten element på Wikidata
28. des. 2016
image/gif
Filhistorikk
Klikk på et tidspunkt for å vise filen slik den var på det tidspunktet.
Dato/klokkeslett | Miniatyrbilde | Dimensjoner | Bruker | Kommentar | |
---|---|---|---|---|---|
nåværende | 28. des. 2016 kl. 14:26 | ![]() | 521 × 518 (5,94 MB) | wikimediacommons>Shiyu Ji | User created page with UploadWizard |
Filbruk
Den følgende siden bruker denne filen: