of the Board of Directors
2. Internal control
2.1. Organisation of the internal control function
2.1.1. Role of the internal control function and general architecture of the internal
Para implementar este tipo de retardo hay que asegurar no sólo que los lugares cuentan con el número de marcas suficientes, sino además que lo hacen desde hace cierto tiempo, es decir, que las últimas filas de la matriz Y (en las columnas que correspondan a la transición) lo cumplen.
La forma de implementarlo consiste simplemente en sustituir en la condición de disparo de cada transición de las que teníamos en la Figura 2 (if Y(i, le1)>= pe1 & ... & Y(i,
lea)>= pea & Y(i, li1)< pi1 & ... & Y(i, lib)< pib & evento) las comparaciones escalares de
los arcos no inhibidores por comparaciones vectoriales, es decir: la comparación: Y(i, lex)>= pex
pasa a: Y(i-tim/paso:i, lex)
>= pex * ones(tim/paso+1,1) (1)
donde lx es un lugar incidente a la transición (con arco no inhibidor), px es el peso de su
arco, y tim es el valor de la temporización.
Para el caso frecuente de arcos con peso unitario, esa expresión se reduce considerablemente:
la comparación: Y(i, lex)>= 1
donde all es una función booleana que se cumple cuando todos los elementos de una matriz son no nulos.
Hay que tener en cuenta que las matrices no pueden tener índices negativos o cero (para que no dé error el programa en su funcionamiento). Por lo tanto, se debe impedir que en las primeras iteraciones el valor i-tim/paso dé errores por ese concepto. Eso se puede impedir de dos formas:
1) Indicando en vez del valor i-tim/paso el valor max([1 i-tim/paso]). De esta
manera siempre será un valor positivo no nulo, como pretendíamos. En este caso, si el peso del arco es distinto de cero (el caso primero estudiado, según las ecuaciones (1)) hay que tener en cuenta que la matriz debe tener las mismas dimensiones que la matriz con la que se compara, por lo cual también hay que sustituir ones(tim/paso,1) por ones(min([1 i-tim/paso]) , 1). Con todo esto una comparación queda de la
siguiente forma:
if Y(max([1 i-tim/paso]):i,le1)>=
pe1*ones(min([i tim/paso+1]),1)&... (3)
y para arcos con peso unitario queda:
if all(Y(max([1 i-tim/paso]):i, l e1))&... (4)
2) Imponiendo como condición al disparo de la transición, que haya pasado el tiempo mínimo. Para ello se incluye inmediatamente después del if (en las transiciones con
temporización) como primera condición booleana:
i>tim/paso . (5)
De esta manera, antes de que pase el tiempo de la temporización, sigue siendo negativo o nulo el valor i-tim/paso pero deja de ser problema porque en esos casos la
condición anterior en el if (la que acabamos de introducir) ha resultado falsa y ya no se
sigue evaluando. Evidentemente la condición indicada anteriormente debe ser la primera dentro de la instrucción if que testea si debe efectuarse el disparo de la
transición con retardo.
4.3.1.1.
Ejemplo
Como ejemplo veamos la realización de una RdP sencilla, como la que se muestra en la Figura 4.
Tim Tim (1 seg) t1 p1 t2 p2 2 2
Figura 4: RdP con retardo en la sensibilización de la transición.
La traducción, según el primer método, se debe realizar según el algoritmo de la Figura 2, iterando con los parámetros temporales de la Figura 3 y de (1) (ó (2) si los arcos son de peso unitario), y sustituyendo las condiciones correspondientes a los arcos no inhibidores de incidencia previa a las transiciones con temporización de acuerdo a (3) en los casos generales y de acuerdo a (4) cuando los arcos tienen peso unitario.
Con todo ello la simulación es la que se presenta en la Figura 5.
close; hold off; t0=0; tf=10; paso=0.1; tspan=t0:tf/paso-1; tim=1; Y=[2 0]; for i=2:tf/paso Y(i,:)=Y(i-1,:); if Y(i,1)>=1 Y(i,1)=Y(i,1)-1; Y(i,2)=Y(i,2)+1; end
if Y(max([1 i-tim/paso]):i, 2) >=2*ones(min([i tim/paso+1]),1) Y(i,2)=Y(i,2)-2; Y(i,1)=Y(i,1)+2;
end end
subplot(2,1,1), plot(tspan/10,Y(:,1),'r'); subplot(2,1,2), plot(tspan/10,Y(:,2),'b');
Figura 5: Programa correspondiente a la red de la Figura 4 según la forma primera. . La traducción según el segundo método se debe realizar también según el algoritmo de la Figura 2, iterando con los parámetros temporales de la Figura 3 y de (1) (ó (2) si los arcos son de peso unitario), y poniendo como primera condición de la evaluación de las transiciones temporizadas la indicada en (5).
La simulación está representada en la Figura 6.
close; hold on; t0=0; tf=10; paso=0.1;
tspan=t0:tf/paso-1; tim=1; Y=[2 0]; for i=2:tf/paso Y(i,:)=Y(i-1,:); if Y(i,1)>=1 Y(i,1)=Y(i,1)-1; Y(i,2)=Y(i,2)+1; end
if i>tim/paso & Y(i-tim/paso:i, 2) >=2*ones(tim/paso+1,1) Y(i,2)=Y(i,2)-2; Y(i,1)=Y(i,1)+2;
end end
subplot(2,1,1), plot(tspan/10,Y(:,1),'r'); subplot(2,1,2), plot(tspan/10,Y(:,2),'b');
Figura 6: Programa correspondiente a la red de la Figura 4 según la forma segunda.
4.3.1.2.
Coherencia
Ambos métodos analizados y empleados en el ejemplo anterior han de ser coherentes con el caso de que una transición sin temporizar es lo mismo que otra con tim=0. Efectivamente, en esos casos la aplicación de las ecuaciones (3), (4) y (5) no tiene ningún efecto:
- Con tim=0 la expresión (3) queda así:
if Y(max([1 i]):i,le1)>= pe1*ones(min([i 1]),1)&...
y como i≥1, max([1 i]=i y min([i 1]=1, con lo que ones(min([i 1]),1)=1, y por tanto la expresión queda:
if Y(i,le1)>= pe1&...
que corresponde a la condición para una transición no temporizada - Con tim=0 la expresión (4) queda así:
if all(Y(max([1 i]):i, l e1))&...
y como i≥1, max([1 i]=i, con lo que all(Y(max([1 i]):i, l e1)) es equivalente a
if Y(i,le1)~= 0 &...
y como Y es una matriz de términos no negativos, el que sea distinto de cero es porque es mayor que cero, y por tanto de nuevo corresponde a la condición para una transición no temporizada.
- Con tim=0 la expresión (5) queda
que es algo que siempre se da por definición de i, con lo cual la condición que se ha añadido respecto a la transición sin temporizar no afecta, y por tanto son equivalentes. Evidentemente esta coherencia en las ecuaciones (3), (4) y (5) es necesaria (aunque no suficiente) para comprobar que son correctas. Este tipo de comprobaciones resulta muy interesante para detectar equivocaciones en los índices o en las desigualdades, cosa relativamente frecuente si no se comprueba.
Esta coherencia permite además considerar el método con transiciones temporizadas (y peso de los arcos en general distinto de 1) como un caso general, en el que las transiciones sin temporización simplemente tendrán valor nulo de la constante de temporización. Esto hace que sea más sencillo para implementar de forma automática, puesto que no hay que distinguir entre tipos de transiciones, aunque el programa será algo menos eficiente (cosa poco importante en general, puesto que se emplea off-line).