파일:DijkstraDemo.gif

DijkstraDemo.gif (521 × 518 픽셀, 파일 크기: 5.94 MB, MIME 종류: image/gif, 반복됨, 127 프레임, 1 min 4 s)

파일 설명

설명
English: A demo of Dijkstra's algorithm based on Euclidean distance. Red lines are the shortest path covering. Blue lines indicate where relaxing happens.
날짜
출처 자작
저자 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) 

라이선스

나는 아래 작품의 저작권자로서, 이 저작물을 다음과 같은 라이선스로 배포합니다:
w:ko:크리에이티브 커먼즈
저작자표시 동일조건변경허락
이용자는 다음의 권리를 갖습니다:
  • 공유 및 이용 – 저작물의 복제, 배포, 전시, 공연 및 공중송신
  • 재창작 – 저작물의 개작, 수정, 2차적저작물 창작
다음과 같은 조건을 따라야 합니다:
  • 저작자표시 – 적절한 저작자 표시를 제공하고, 라이센스에 대한 링크를 제공하고, 변경사항이 있는지를 표시해야 합니다. 당신은 합리적인 방식으로 표시할 수 있지만, 어떤 방식으로든 사용권 허가자가 당신 또는 당신의 사용을 지지하는 방식으로 표시할 수 없습니다.
  • 동일조건변경허락 – 만약 당신이 이 저작물을 리믹스 또는 변형하거나 이 저작물을 기반으로 제작하는 경우, 당신은 당신의 기여물을 원저작물과 동일하거나 호환 가능한 라이선스에 따라 배포하여야 합니다.

설명

이 파일이 나타내는 바에 대한 한 줄 설명을 추가합니다

이 파일에 묘사된 항목

다음을 묘사함

파일 역사

날짜/시간 링크를 클릭하면 해당 시간의 파일을 볼 수 있습니다.

날짜/시간섬네일크기사용자설명
현재2016년 12월 28일 (수) 21:262016년 12월 28일 (수) 21:26 판의 섬네일521 × 518 (5.94 MB)Shiyu JiUser created page with UploadWizard

다음 문서 1개가 이 파일을 사용하고 있습니다:

이 파일을 사용하고 있는 모든 위키의 문서 목록

다음 위키에서 이 파일을 사용하고 있습니다: