Véletlen bolyongás
A következő példaprogram a véletlen bolyongás megoldási módszereit kívánja szemléltetni. Az egyik módszer a Monte-Carlo, a másik temporális differenciák módszere. A probléma lényege egy dimenzióban, hogy van egy út amelyen X lépést tehetünk, de minden körben csak egyet, előre vagy hátra. Amennyiben ismerjük az előre- és hátralépés valószínűségét, mi a valószínűsége annak, hogy egy adott pontból eljutunk az út jobb oldali végére.
A Monte-Carlo módszer ebben az esetben egy sétát tekint egységnek. Több bolyongást csinálunk, majd átlagoljuk eredményeinket. Ezek hosszútávon megadják valószínűségi változóink várható értékét. A temporális differenciák módszerében bolyongás közben becsüljük minden egyes lépésnél újra, hogy mennyi a valószínűsége a sikeres befejezésnek.
Az alábbi példaprogram ezt hivatott bemutatni azáltal, hogy mindkét módszerrel becsüli az eredményt, melyet végül hozzámérünk, a várt eredményhez. A kombináló függvény kirajzolja a két módszer eredményét, és a két módszer négyzetes eltérését a várt értékhez.
%Random walk solver, Monte-Carlo
%V[k](s) = V[k](s) + alpha*(R[k] - V[k-1](s))
%len: length of the walk
%it: number of iterations
%A: initial V
%a: alpha value
%s0: starting step
function [V,RMSE]=rwMC(len,it,A,a,s0)
l = int32(len + 2);
if (mod(l,2) == 0)
disp('length must be odd')
return
end
%V: expected reward
if (nargin >= 3)
[m,n]=size(A);
if (m ~= 1 || n ~= len)
disp('initial vector dimension mismatch')
return
end
V = [0 A 1];
else
V = ones(1,l) * 0.5;
end
RMSE = zeros(1,it);
%S: final result (to count RMS)
S = (1:len)/(len+1);
%iterations
for i=1:it
%generate walk (starting from the middle)
if (nargin > 4)
t = s0;
else
t = idivide(l,2);
end
T = zeros(1,l);
while (t ~= 1 && t ~= l)
if (rand < 0.5)
t = t - 1;
else
t = t + 1;
end
T(t) = 1; %points stepped on
end
%if the end reached set the reward for all the points stepped on
R = zeros(1,l);
if (t == l)
R = T;
end
%iterative averaging
if (nargin < 4)
a = 1/i;
end
V = V + T .* (R - V) * a;
Vr = V(1,2:l-1);
RMSE(i) = sqrt(sum((Vr-S).*(Vr-S))/len);
end
%remove the two ends
V=V(1,2:l-1);
%Random walk solver - Temporal-Difference
%V[k](s) = V[k-1](s) + alpha*(r + V[k-1](s) - V[k-1](s))
%len: length of the walk
%it: number of iterations
%A: initial V
%a: alpha value
%s0: starting step
function [V,RMSE]=rwTD(len,it,A,a,s0)
l = int32(len + 2);
if (mod(l,2) == 0)
disp('length must be even')
return
end
if (nargin < 4)
a = 0.1;
end
if (nargin >= 3)
[m,n]=size(A);
if (m ~= 1 || n ~= len)
disp('initial vector dimension mismatch')
return
end
V = [0 A 0];
else
V = ones(1,l) * 0.5;
V(1) = 0;
V(l) = 0;
end
R = zeros(1,l);
R(l) = 1;
RMSE = zeros(1,it);
S = (1:len)/(len+1);
%iterations
for i=1:it
if (nargin > 4)
s = s0;
else
s = idivide(l,2);
end
%Vp = V;
while (s ~= 1 && s~= l)
%store previous step
sp = s;
%generate step
if (rand < 0.5)
s = s - 1;
else
s = s + 1;
end
V(sp) = V(sp) + a*(R(s) + V(s) - V(sp));
end
Vr = V(1,2:l-1);
RMSE(i) = sqrt(sum((Vr-S).*(Vr-S))/len);
end
%remove the two ends
V=V(1,2:l-1);
%plot Random walk results
%Random walk: In a sequence one can step forward or backward one step. The
%V function (expected reward) will show what is the probability of reaching
%the rigth end of the path if starting from a given point.
%This function will compare and plot the result of a Monte-Carlo method and
%a Temporal-difference method for the problem.
function [M,T,Md,Td]=rwPlot(len,it,A,a,s0)
if (mod(int32(len),2) == 0)
disp('length must be odd')
return
end
switch nargin
case 2
[Em,Dm]=rwMC(len, it);
[Et,Dt]=rwTD(len, it);
sLm = sprintf('MC');
sLt = sprintf('TD (alpha= 0.1)');
case 3
[m,n]=size(A);
if (m ~= 1 || n ~= len)
disp('initial vector dimension mismatch')
return
end
[Em,Dm]=rwMC(len, it,A);
[Et,Dt]=rwTD(len, it,A);
sLm = sprintf('MC');
sLt = sprintf('TD (alpha= 0.1)');
case 4
[m,n]=size(A);
if (m ~= 1 || n ~= len)
disp('initial vector dimension mismatch')
return
end
[Em,Dm]=rwMC(len, it,A,a);
[Et,Dt]=rwTD(len, it,A,a);
sLm = sprintf('MC (alpha= %f)',a);
sLt = sprintf('TD (alpha= %f)',a);
case 5
[m,n]=size(A);
if (m ~= 1 || n ~= len)
disp('initial vector dimension mismatch')
return
end
[Em,Dm]=rwMC(len, it,A,a,s0);
[Et,Dt]=rwTD(len, it,A,a,s0);
sLm = sprintf('MC (alpha= %f)',a);
sLt = sprintf('TD (alpha= %f)',a);
end
sTitle = sprintf('MC & TD method comparison on Random walk (%d)',len);
figure(1);
plot(1:it, Dm,'b',1:it, Dt,'r');
xlabel('iteration');
ylabel('RMS');
legend(sLm,sLt);
title(sTitle);
figure(2);
plot(1:len, Em, '+b', 1:len, Et, '+r', 1:len, (1:len)/(len+1), 'k', ...
'LineWidth',2);
xlabel('state');
ylabel('value');
legend(sLm,sLt,'real values','Location','NorthWest');
title(sTitle);
M=Em;
T=Et;
Md = Dm(it);
Td = Dt(it);
A forráskód letölthető
Szerző: Koleszár Ádám
Év: 2014
Környezet: MATLAB R2011b
Intervallumfelező módszer
A program az intervallumfelező numerikus gyökkereső módszert
implementálja. A megoldás menetét ábrán szemlélteti.
A program egyesével bekéri a szükséges paramétereit a szabványos
bemenetről. A vizsgált függvényt is így kell megadni, és a program
feltételezi, hogy a függvény egyismeretlenes és ez az ismeretlen az
x. Minden egyes iteráció előtt dönteni lehet a folytatásról vagy a
megállásról.
Megjegyzés: a sym és subs
függvények miatt szükséges a Symbolic Math Toolbox.
Forráskód
Szerző: Poór Artúr
Év: 2014
Környezet: MATLAB R2014a