-
Notifications
You must be signed in to change notification settings - Fork 0
/
path.m
130 lines (120 loc) · 3.03 KB
/
path.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
%sirve para dibujar un camino aleatorio en 2D de forma que no
%se pueda volver a pisar un punto que ya se pisó
%otra cosa que se puede hacer es ver la facilidad con que se
%atasca ejecutando el programa N veces
%con un nf (número máximo de pasos) alto, guardando los t
%en los que no se puede avanzar y haciendo la media
%también se podría ir dibujando como en una película
%con el comando drawnow, paso por paso
%% Para elegir un punto inicial
% m0=input('Elige el límite de la abscisa del punto inicial');
% n0=input('Elige el límite de la ordenada del punto inicial');
%
% i0=floor((m0+1)*rand(1));
% j0=floor((n0+1)*rand(1));
%% Para empezar en el origen
i0=0; j0=0;
%número de pasos que vamos a dar
nf = input('Elige el número máximo de pasos: nf =');
%defino ya el lugar de guardado
V=zeros(nf,2);
V(1,1)=i0;
V(1,2)=j0;
t=2;
while t<=nf
A=rand(1,2);
if A(1)<0.5 && A(2) < 0.5
%hacia abajo
i1=i0;
j1=j0-1;
elseif A(1)< 0.5 && A(2) >= 0.5
%hacia la derecha
i1=i0+1;
j1=j0;
elseif A(1) >= 0.5 && A(2) < 0.5
%hacia la izquierda
i1=i0-1;
j1=j0;
elseif A(1) >= 0.5 && A(2) >= 0.5
%hacia arriba
i1=i0;
j1=j0+1;
end
%no pisar lo pisado (se puede quitar esta condición)
%la B es para esto; las E son para el atasco
B=zeros(t,2);
E1=zeros(t,2);
E2=zeros(t,2);
E3=zeros(t,2);
E4=zeros(t,2);
B(:,1)=i1;
B(:,2)=j1;
E1(:,1)=i0-1;
E1(:,2)=j0;
E2(:,1)=i0+1;
E2(:,2)=j0;
E3(:,1)=i0;
E3(:,2)=j0-1;
E4(:,1)=i0;
E4(:,2)=j0+1;
D=0;
F=0;
for a = 1:t-1
C = B(a,:) == V(a,:);
if C == [1,1]
D = 1;
end
end
for a = 1:t-1
%condición de atasco: ya hemos pisado lo de alrededor
F1 = E1(a,:) == V(a,:);
F2 = E2(a,:) == V(a,:);
F3 = E3(a,:) == V(a,:);
F4 = E4(a,:) == V(a,:);
if F1 == [1,1]
F = F+1;
%fprintf('F1 \n para a =')
%disp(a)
end
if F2 == [1,1]
F = F+1;
%fprintf('F2 \n para a =');
%disp(a);
end
if F3 == [1,1]
F = F+1;
%fprintf('F3 \n para a =');
%disp(a);
end
if F4 == [1,1]
F = F+1;
%fprintf('F4 \n para a =');
%disp(a);
end
end
if F == 4
fprintf('No se puede avanzar más. \n Nos hemos quedado en t = %d \n', t)
break
elseif D == 0
V(t,1)=i1;
V(t,2)=j1;
i0=i1; j0=j1;
t=t+1;
F=0;
else
i0=V(t-1,1);
j0=V(t-1,2);
F=0;
end
end
hold off %si no quieres que pinte un camino sobre otro
plot (V(1,1),V(1,2),'*r')
hold on
if F == 4
plot(V(1:t-1,1),V(1:t-1,2))
plot(V(t-1,1),V(t-1,2),'*y')
else
plot(V(:,1),V(:,2))
plot(V(nf,1),V(nf,2),'*g')
end
legend('origen','camino','extremo')