130 likes | 379 Views
PRIM 알고리즘. n=input(' 노드의 갯수를 입력하세요 .'); A = randint(n,n,[1,100]);
E N D
n=input('노드의 갯수를 입력하세요.');A = randint(n,n,[1,100]); for a1=1:n for a2=a1+1:n % if A(a1,a2)>=60 A(a1,a2)=inf; end A(a2,a1)=A(a1,a2); end A(a1,a1)=0; end disp('인접행렬 생성!')Adisp('유망한 집합 P1생성!')P1=ones(1,n) P2=ones(1,n); P3=ones(1,n); P4=ones(1,n-1); for c=1:n-1 min1=inf; for b1=1:n if (A(1,b1)~=0)&&(min1>A(1,b1)) min1=A(1,b1); inx=b1; end end disp('유망한 집합 P1!') P1(1,c+1)=inx for b2=1:n if (A(1,b2)==inf)&&(A(inx,b2)==inf) A(1,b2)=inf; else if A(1,b2)>A(inx,b2) A(1,b2)=A(inx,b2); inx if b2~=inx P2(1,b2)=inx end end end end P3(1,c:n-1)=P2(1,c:n-1); disp('연결노드 P4!') P4(1,c)=P3(1,inx) disp('합친행렬표시') Aend 짜쟌
전반적 디자인 • 준비 • 인접행렬 생성 • 결과값을 출력할 행렬 생성 • 최소비용 신장 트리 구하기 • 출발점에서 비용이 가장 적게 드는 노드 찾기 • 찾은 노드를 해집합에 합치기
준비 - 인접행렬 생성 n=input('노드의 갯수를 입력하세요.'); A = randint(n,n,[1,100]); 힘들었다! 노드수가 증가하면 수 범위를 넓히는 것이 좋다. 그렇지 않으면, 같은 비용을 가지는 이음선이 많아져서 후반부에는 노드가 순차적으로 나열되게 된다.
준비 - 인접행렬 생성 for a1=1:n for a2=a1+1:n if A(a1,a2)>=60 A(a1,a2)=inf; end A(a2,a1)=A(a1,a2); end A(a1,a1)=0; end disp('인접행렬 생성!') A
준비 - 결과값을 출력할 행렬 생성 • 처음 시작은 노드1이므로 초기값은 1 • P1: 1xn 행렬 (노드 추가 순서) • P2: 1xn 행렬 (해집합 안의 어느 노드에서 연결하는지) • P3: 1xn 행렬 (유망한 노드에 최소비용으로 연결하는 노드) • P4: 1x(n-1) 행렬 (어느 노드에서 연결하는지 최종적으로 나타낸다)
MST구하기 –출발점에서비용이 가장 적게 드는 노드 찾기 • 단순한 2중 for문 사용 • 찾은 최소비용 노드의 인덱스는 P(1,2)부터 차례로 저장된다 - P(1,1)은 1로 초기화 되어 있다
MST구하기 –출발점에서비용이 가장 적게 드는 노드 찾기 disp('유망한 집합 P1생성!') P1=ones(1,n) P2=ones(1,n); P3=ones(1,n); P4=ones(1,n-1);
MST구하기 –출발점에서비용이 가장 적게 드는 노드 찾기 for c=1:n-1 min1=inf; for b1=1:n if (A(1,b1)~=0)&&(min1>A(1,b1)) min1=A(1,b1); inx=b1; end end disp('유망한 집합 P1!') P1(1,c+1)=inx
MST구하기 –찾은 노드를 해집합에 합치기 • 해집합에 들어간 노드는 검색할 노드에서는 뺀다(순환이 생기지 않게). • 추가하려는 노드에 연결된 노드가 여러 개일 때 최소 가중치로 연결된 것 선택 • 그 노드에 연결되어있고, 해집합에 들어있는 노드의 가중치를 비교해서 작은 값을 취하게 하면 위 두 문제를 해결
MST구하기 –찾은 노드를 해집합에 합치기 for c=1:n-1 최소 비용 노드 찾기 for b2=1:n if (A(1,b2)==inf)&&(A(inx,b2)==inf) A(1,b2)=inf; else if A(1,b2)>A(inx,b2) A(1,b2)=A(inx,b2); inx if b2~=inx P2(1,b2)=inx end end end end
MST구하기 –찾은 노드를 해집합에 합치기 P3(1,c:n-1)=P2(1,c:n-1); disp('연결노드 P4!') P4(1,c)=P3(1,inx) disp('합친행렬표시') A end 끝