python Dijkstra 정적 길 찾기 알고리즘 실현
디 코스 처 알고리즘 은 그림 이나 그림 이 없 는 단일 소스 의 최 단 경로 문 제 를 광범 위 하 게 검색 하여 해결 하고 알고리즘 은 최종 적 으로 최 단 경로 트 리 를 얻 었 습 니 다.이 알고리즘 은 루트 알고리즘 이나 다른 그림 알고리즘 의 하위 모듈 로 자주 사용 된다.
물론 이 를 물류 처리 에 사용 해 대가 가 가장 적은 운송 방안 을 얻 는 사람 도 있다.
알고리즘 사고
Dijkstra 알고리즘 은 욕심 많은 전략 을 채택 했다.
1.우선,원점 에서 각 정점 까지 의 최 단 거리 와 저장 이 가장 짧 은 경 로 를 찾 은 정점 의 집합 T 를 저장 하기 위해 배열 dis 를 설명 합 니 다.
2.그 다음 에 원점 s 의 경로 가중치 가 0(dis[s]=0)으로 부 여 됩 니 다.만약 에 정점 s 에 직접 도착 할 수 있 는 변(s,m)이 존재 한다 면 dis[m]를 w(s,m)로 설정 하고 모든 다른(s 가 직접 도착 할 수 없 는)정점 의 경로 길 이 를 무한대 로 설정 합 니 다.처음에 집합 T 는 정점 s 만 있 었 다.
3.dis 배열 에서 최소 값 을 선택 하면 이 값 은 원점 s 에서 해당 하 는 정점 까지 의 가장 짧 은 경로 이 고 이 점 을 T 에 넣 으 면 정점 을 완성 합 니 다.
4.새로 추 가 된 정점 이 다른 정점 에 도달 할 수 있 는 지,그리고 이 정점 을 통 해 다른 점 에 도달 하 는 경로 의 길이 가 원점 보다 직접 짧 은 지,그렇다면 이 정점 이 dis 에 있 는 값 을 교체 합 니 다.
5.마지막 으로 dis 에서 최소 값 을 찾 아 상기 동작 을 반복 하고 T 에 그림 의 모든 정점(도착 할 수 있 는)이 포 함 될 때 까지 합 니 다.
알고리즘 그래 픽 데모
현재 그림 은 다음 과 같다.
각 선의 가중치 와 표 지 는 그림 과 같다.
첫 번 째 단계:
dis 배열 과 T 배열 을 만 듭 니 다.
먼저 출발점 A 부터 A 가 직접 도달 할 수 있 는 정점 의 가중치 를 dis 배열 에 기록 하고 직행 할 수 없 는 기록 은 무한대(현재 FFFF 를 사용 하여 무한대)입 니 다.
현재 선택 한 정점 을 배열 T 에 추가 하기:
두 번 째 단계:
dis 배열 에서 T 배열 의 정점 이 아 닌 최소 가중치 의 정점 을 선택 하 십시오.현재 B 정점 으로 선택 하고 B 가 직접 도착 할 수 있 는 정점 의 관련 가중치 와 현재 dis 의 가중치 를 비교 합 니 다.현재 dis 가중치 가 크 면 교체 합 니 다.
B 를 배열 T 에 추가 하기:
세 번 째 단계:
정점 C 순서대로 선택:
C 를 배열 T 에 추가 하기:
네 번 째 단계:
정점 D 순서대로 선택:
D 를 배열 T 에 추가 하기:
다섯 번 째 단계:
정점 E 순서대로 선택:
E 를 배열 T 에 추가 하기:
여섯 번 째 단계:
정점 F 순서대로 선택:
F 를 배열 T 에 추가 하기:
모든 정점 이 T 배열 에 있 기 때문에 알고리즘 이 끝 났 습 니 다.
이렇게 하면 A 점 에서 각 정점 까지 의 최 적 화 를 구 할 수 있다.
A 정점 을 볼 수 있 고 F 정점 까지 갈 수 없습니다.
코드 표시:
(코드 에 999 대표 FFF 사용)
#encoding:utf-8
import copy
"""
999
"""
tuG=[[0, 10, 20, 999, 999, 999],
[999, 0, 999, 20, 70, 999],
[999, 999, 0, 50, 30, 999],
[999, 999, 999, 0, 999, 999],
[999, 999, 999, 10, 0, 999],
[999, 999, 999, 20, 20, 0]];
tuX = 6;
#
dis = copy.deepcopy(tuG[0]);
def Dijkstra(G,v0):
"""
Dijkstra v0 G
INF
"""
t = [];
minv = v0;
while len(t) <= tuX:
t.append(minv);
#
for w in range(0, tuX):
if dis[minv] + G[minv][w] < dis[w]:
dis[w] = dis[minv] + G[minv][w]
tmp = 1000;
for i in range(0, tuX):
tmpFlag = False;
for j in range(0, len(t)):
if i == t[j]:
tmpFlag = True;
break;
if tmpFlag == True:
continue;
if tmp > dis[i]:
tmp = dis[i];
minv = i;
if __name__ == '__main__':
Dijkstra(tuG,0);
print dis;
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.