====== Úkol 4 ======
Nastin reseni: -uzijte si jarniho slunicka-
dykstar.m:
Nezlobte se, ale on to fakt neopsal :)
%% funkce dyckstar
% implementace Dijkstrova algoritmu
% INput: r... starting point
% W(i,j)... weight matrix (distances between cities i->j)
% OUTput: dist(i)..distances from start point to other vertices (city i),
% U in slides
% track(i)..bactracking the route, to city i we got from
% track(i), ODKUD in slides
function [track,dist] = dyckstar(r,W)
noV=size(W,2); % pocet vrcholu v grafu
V=[1:noV]; % vrcholy v grafu
dist=ones(1,noV).*inf; % init..distances are unknown
dist(r)=0; % dist r=0
track=ones(1,noV).*inf;
track(r)=-1; % pomocna ukoncovaci podminka
done=[]; % already finished (fixed) vertices) , D in slides
nehotove=setdiff(V,done); % nehotove ..indexy V\done : nejsou inf
while sum(dist(nehotove) ~=inf) > 0
[bla,zpracovat]=min(dist(nehotove)); % zpracovat ..index minima z dist(nehotove)
v = nehotove(zpracovat); % hodnota toho vrcholu
done = [done v]; % uzel 'v' ted udelame a pridame proto k hotovym
% pres vsechny vystupni hrany z 'v' :
koncoveBody= V(W(v,:)~=inf); % vrcholy, pro ktere vede hrana z 'v'
for y = koncoveBody
if dist(v) + W(v,y) < dist(y) % update na kratsi cestu
dist(y) = dist(v) + W(v,y);
track(y)=v;
end
end
nehotove=setdiff(V,done);
end
end
createApproxMatrix.m:
%% createApproxMatrix - vytvari matici pouzitou pro aproximaci
%% funkce/obrazku
% W .. vysledna matice vah
% x,f .. data na ose x, a f(x)(resp. y)
% vrcholy [x(i),f(x(i))] predstavuji uzly,
% graf obsahuje hranu pro kazdou dvojici uzlu i,j: i
approxFce.m:
%% ukol na cv 6 z A4M33KO - hledani nejkratsi cesty, Dijkstruv alg,
%% aproximace fce a obrazku
clc;
clear;
close all;
% koeficienty pro pocet vrcholu a odchylky
alpha = 1;
beta = 1;
% vstupni data
x = [ 0 1.26 2.51 3.77 5.03 6.28];
f = [ 0.01 1.16 0.70 -0.34 -0.80 0.2100];
W = createApproxMatrix(x,f,alpha,beta);
'matice vzdalenosti: ',W
% Dijkstruv algoritmus
[track,dist]=dyckstar(1,W)
% vyberu vrcholy po nejkratsi ceste
q = size(W,2);
cesta = q;
while track(1,q) ~= -1
q = track(1,q);
cesta = [cesta q];
end
cesta = sort(cesta);
% vykresleni
plot(x,f,'g')
hold on;
plot(x(cesta),f(cesta),'r')
approxObrazku.m:
PS: 1)u slidu pisi neco o jinem vypoctu vah nez u fce, ale to je imho zbytecne.
2)orezal jsem data kvuli rychlosti (netbook:P)
%% ukol na cv 6 z A4M33KO - hledani nejkratsi cesty, Dijkstruv alg,
%% aproximace fce a obrazku
%clc;
%clear;
%close all;
% koeficienty pro pocet vrcholu a odchylky
alpha = 1;
beta = 1;
% vstupni data
load czechRepublic.mat
% whos
%% zrychleni pro ukazku: udelejme si mensi republiku
x=x(1:end/5);
y=y(1:end/5);
W = createApproxMatrix(x',y',alpha,beta);
'matice vzdalenosti: ',W;
% Dijkstruv algoritmus
[track,dist]=dyckstar(1,W)
% vyberu vrcholy po nejkratsi ceste
q = size(W,2);
cesta = q;
while track(1,q) ~= -1
q = track(1,q);
cesta = [cesta q];
end
cesta = sort(cesta);
% vykresleni
plot(x,y,'g')
hold on;
plot(x(cesta),y(cesta),'r')
~~DISCUSSION~~