next up previous contents
Next: Redes de Petri con Up: Posibles extensiones de PetrA Previous: Posibles extensiones de PetrA

Redes de Petri con capacidad finita

Una red de Petri limitada es una red de Petri que mantiene una restricción sobre el número de tokens que puede haber en cada lugar. Como es de imaginarse la solución obvia sería modificar la clase Place, incorporarle el atributo que establesca el límite, con sus respectivos métodos para modificar este atributo y para presentar su valor. Y, finalmente, modificar la clase Transaction para se contemple esta condición cuando se ejecuta su hilo de control.

Sin embargo podemos aprovechar la orientación a objetos para facilitarnos un poco la tarea y para ilustrar como agregar un nuevo objeto gráfico a la red de Petri.

La estrategia será la siguiente: crear una subclase de Place llamada PlaceLimited con el nuevo atributo, insertarla en el panel Tools, para que el usuario pueda utilizarla. Después, se deberá modificar, inevitablemente, el código del método de instancia conditionsOK, de los objetos Transition.

1.
El usuario debe tener una imagen que haga referencia a un lugar con un límite de tokens y que se llame PlaceLimited. Esta imagen debe insertarse en el archivo de interfaz principal de PetrA (Petra.nib) con ayuda de la aplicación InterfaceBuilder6.1.

2.
Una vez que la imagen está insertada en el archivo de interfaz, se coloca, en el botón que contiene la imagen Place, la imagen PlaceLimited como la imagen principal de ese botón. Y se salva el archivo de interfaz.

3.
Ahora que se tiene la imagen, se procede a crear la clase PlaceLimited e integrarla al proyecto PetrA con ayuda de la aplicación ProjectBuilder6.2. La clase debe quedar como sigue:
#import "Place.h"
@interface PlaceLimited : Place
{
   int maxTokens;
}
- (id)initWithFrame:(NSRect)frameRect inView:(id)contentView;
- (int)maxTokens;
- (void)setMaxTokens:(int)n;
@end
y su archivo de implantación quedaría:
#import "PlaceLimited.h"
@implementation PlaceLimited
- (id)initWithFrame:(NSRect)frameRect inView:(id)contentView {
   self=[super initWithFrame:frameRect: inView: contentView]; 
   return self; 
}
- (int)maxTokens {
    return maxTokens; 
}
- (void)setMaxTokens:(int)n {
    maxTokens=n;
}
- (void)encodeWithCoder:(NSCoder *)aCoder {
    [super encodeWithCoder: aCoder];
    [aCoder encodeValuesOfObjCTypes: "i", &maxTokens];
}
- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder: aDecoder];
    [aDecoder decodeValuesOfObjCTypes: "i", &maxTokens];
    return self;
}
@end

Se puede observar que la clase PlaceLimited, es una subclase de Place, maneja un solo atributo (maxTokens), y tiene cinco métodos --uno de ellos es de inicialización, dos para accesar al atributo macToken y los métodos del protocolo <NSCoding>--.

4.
Se procede a modificar a el método instancia conditionsOK del la clase Transition. En realidad se agrega código para verificar que el número de tokens de los lugares de salida, resultado de la ejecución de la transición, no excederán el límite de tokens.
- (BOOL)conditionsOK {
    int i, l, t, w;
    id cTemp;
    l = [[ioConnections inputs] count];
    for (i=0; i<l; i++) {
        cTemp = [[ioConnections inputs] objectAtIndex: i];
        w = [cTemp weight];
        t = [[cTemp startGraph] tokens];
        if (w>t) return NO;
    }
    // inicia parte agregada
    l = [[ioConnections outputs] count];
    for (i=0; i<l; i++) {
        cTemp = [[ioConnections outputs] objectAtIndex: i];
        w = [cTemp weight];
        w+= [[cTemp endGraph] tokens];
        t = [[cTemp endGraph] maxTokens];
        if (w>t) return NO;
    }
    // termina parte agregada
    return YES;
}

5.
Se agrega un objeto TextField, al grupo de objetos gráficos que presentan los atributos de la clase Place, para que represente el límite superior de tokens de un lugar. Después se define su identificador en el la clase PNInspectorController y cuando se deba presentar o actualizar la información, se utiliza este identificador y los llamados maxTokens y setMaxTokens del objeto PlaceLimited.

6.
Compilar y ejecutar.

Evidentemente el usuario debe tener conocimiento de las herramientas de desarrollo de OpenStep/Mac OS X para realizar estos pasos sin problemas. Sin embargo se tiene la confianza de que los desarrolladores futuros comprendan que la programación en esta plataforma de desarrollo es poderosa y muy conveniente.


next up previous contents
Next: Redes de Petri con Up: Posibles extensiones de PetrA Previous: Posibles extensiones de PetrA
Amilcar Meneses
2002-11-08