Ingeniería Técnica en Informática de Gestión

Documentos relacionados
UNIVERSIDAD MAYOR DE SAN SIMÓN FACULTAD DE CIENCIAS Y TECNOLOGÍA INGENIERÍA DE SISTEMAS BÚSQUEDA PRIMERO EL MEJOR

Ingeniería en Informática

Inteligencia Artificial II Unidad Plan 2010-Ingeniería en Sistemas Computacionales

Búsqueda en e.e. --> reglas para elegir entre las ramas que con más probabilidad lleven a la solución.

Ingeniería Técnica en Informática de Gestión

Procesamiento de documentos XML.

Fila: Es un conjunto de varias celdas dispuestas en sentido horizontal.

Algoritmos genéticos

Operaciones básicas con hojas de cálculo

Generador de actividades

Estructura de Datos: Archivos

Clase adicional 9. Listas enlazadas. Temas. Listas enlazadas Árboles Problemas de la clase adicional Ejercicios de diseño

(b) Cuál es la desventaja principal de una heurística con aprendizaje? es más informada que otra función heurística optimista h 2 *?

Ingeniería en Sistemas Computacionales. Inteligencia Artificial. Ing. Bruno López Takeyas. Algoritmo Hill Climbing

4. DIAGRAMAS DE INTERACCIÓN INTRODUCCIÓN DIAGRAMAS DE SECUENCIA Objetos Mensajes

Universidad de Cantabria. Facultad de Ciencias Ingeniería en Informática. Ingeniería del Software II

La última versión disponible cuando se redactó este manual era la 5 Beta (versión ), y sobre ella versa este manual.

Estado 3.2 (coste = 9)

ARCHIVOS Y CARPETAS 1

Manipulando celdas. Te recomendamos iniciar Excel 2007 ahora para ir probando todo lo que te explicamos.

Variables lógicas y sentencia IF

Algoritmos. Diagramas de Flujo. Informática IV. L. S. C. Heriberto Sánchez Costeira

Las redes semánticas intentan trasladar esa afirmación a un formalismo Una red semántica será un grafo donde:

Centro Asociado Palma de Mallorca. Tutor: Antonio Rivero Cuesta

Ministerio de Educación. Base de datos en la Enseñanza. Open Office. Módulo 4: Diseñador de Consultas (+ info)

CRITERIOS DE SELECCIÓN DE MODELOS

Estructuras de Datos y de la Información Ingeniería Técnica en Informática de Gestión. Curso 2007/2008 Ejercicios del Tema 2

A B MIN C D E F MAX x E.T.S.I. INFORMÁTICA 4º CURSO. INTELIGENCIA ARTIFICIAL E INGENIERÍA DEL CONOCIMIENTO

Manual de usuario (alumno) del aplicativo Segurmed.UB

Representación de Conocimientos

Guía docente: Cómo crear un test y los tipos de preguntas

A l g o r i t m o y E s t r u c t u r a d e D a t o s Ing. en Sistemas de Información - 1º año -

Solución de Examen de Comunicación de Datos

fundamentos de programación (unidad 4) programación estructurada en Java

Redacción del Proyecto Fin de Carrera 1

(d) Puede haber estrategias que funcionan mejor que Minimax si el contrincante es

Examen de Ingeniería del Software / 3º de Informática de Gestión 7 de febrero de 2007

Tema 5. Diagramas de flujo. Computacion - FA.CE.NA.

Ingeniería Técnica en Informática de Gestión

Para definir en formalmente el juego se deberá establecer:

Microsoft Excel 2003 (Completo)

(e) Con la poda alfa-beta se eliminan nodos que nunca serán alcanzados

Microsoft Excel 2003 (Completo)

El TAD Grafo. El TAD Grafo

Práctica 04. Crear un registro de calificaciones

FCS03-3 Manual de Usuario ED. 2 MANUAL DE USUARIO

Repetidores o Hubs. Puentes

DAVID DIAZ VALDIVIA INFORMATICA APLICADA I

CLIPS v6.1 Resumen. Universidad Carlos III de Madrid Departamento de Informática docweb/

como les va con las practicas?

Grandes Compras. Mayo 2013

(e) Con la poda alfa-beta se eliminan nodos que nunca serán alcanzados

Inteligencia Artificial. Integrantes Equipo # 1:

MICROSOFT EXCEL 2010

Unidad II: Análisis semántico

TÉCNICO SUPERIOR UNIVERSITARIO EN TECNOLOGÍAS DE LA INFORMACIÓN Y COMUNICACIÓN

Manual del candidato. Aplicación de Sede electrónica para la convocatoria de interinos

PARCIAL DE INTELIGENCIA ARTIFICIAL

Conector Mensa-Red Informa Manual de usuario

ESCUELA POLITÉCNICA NACIONAL

Grafos. Amalia Duch Brown Octubre de 2007

GUÍA DE USUARIO DEL SAD (SEGUIMIENTO Y EVALUACIÓN DEL DAD Y EL PLAINV)

PROGRAMA DE AYUDA. OTRAS UTILIDADES

Tema 01: Algoritmia y diagramas de flujo. Estructuras de datos (Prof. Edgardo A. Franco)

Convertir un AFND a un AFD

Apuntes elaborados por: Aaron Asencio, Eduardo Quevedo, Raquel López Revisado por: Javier Miranda el???

Es un conjunto de palabras y símbolos que permiten al usuario generar comandos e instrucciones para que la computadora los ejecute.

MÓDULO DIARIO PARA MOODLE

Búsqueda Heurística (1ª parte)

REGISTRO EN EL SISTEMA PARA AUXILIARES DE CONVERSACIÓN EXTRANJEROS Y SOLICITUD DE RENOVACIÓN

FUNDAMENTOS DE INFORMÁTICA

CONTENIDOS MÍNIMOS BLOQUE 2. NÚMEROS

EJERCICIO 11 DE EXCEL EXCEL EJERCICIO 11 GRÁFICOS

BLOQUE Qué productos no encuentra en las tiendas de la localidad? 4. A partir de qué horario le gustaría encontrar abierta una tienda?

PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07

Solución al parcial 14

Complejidad computacional (Análisis de Algoritmos)

Explotación de la Biblioteca de documentos.

Tema 7. Generación de código

Diagramas de secuencia

7ª Práctica. Matlab página 1 EJERCICIO 1. ORDENAR UN VECTOR CON EL MÉTODO DE LA BURBUJA...1

Generación de Código Intermedio

Diapositiva 2 La acción de los circuitos lógicos se puede comprender mediante la lógica booleana. Normalmente usaremos tres de sus elementos. Primero

Revisión Fecha Revisor Aprobador Descripción de los cambios M.L. J.R. Primera emisión del documento

Algoritmos y Estructuras de Datos II, Grado Ingeniería Informática Examen 10 de septiembre de 2011

Ingeniería Técnica en Informática de Gestión

Problemas en circuitos serie

Estatutos de Control C# Estatutos de Decisión (Selección)

La Evaluación Financiera de Proyectos de Informática

Trabajo Final- Construcción de una aplicación RIA

TECNICO SUPERIOR EN INFORMÁTICA EMPRESARIAL MÓDULO INTRUCCIONAL

Manual de ayuda de ATILA.

Curso de Windows 95/98 CTCV

Tema: Estructuras de Selección en C#.

GUÍA BÁSICA DEL VOLUNTARIO

Ataque de texto claro escogido contra la clave de protocolo del cifrado de Doble Criptograma Simétrico

EJERCICIOS EXCEL. Guardar el libro en tu pen drive, con el nombre PRACTICA1_ALUMNO_GRUPO.

Introducción a la programación: Algoritmos

Programación Estructurada

4ta. Práctica. Búsqueda en árbol con contrincante: MiniMax con poda Alfa-Beta. Inteligencia Artificial Prácticas 2004/2005

Transcripción:

Departamento de Informática Universidad Carlos III de Madrid Ingeniería Técnica en Informática de Gestión Inteligencia Artificial Septiembre 2001. 1 a parte Normas generales del examen El tiempo para realizar el examen es de 2 horas No se responderá a ninguna pregunta sobre el examen Si se sale del aula, no se podrá volver a entrar durante el examen No se puede presentar el examen escrito a lápiz Problema 1. (5 puntos Una empresa de transporte de pequeños paquetes desea planificar qué vehículos utilizar en los desplazamientos. Dispone de tres tipos de vehículos de transporte: furgonetas, todo-terreno, y berlinas. En autopistas, las furgonetas gastan 5 litros a los kms. de gasoil, que cuesta pts. el litro; los todo-terreno gastan el doble de litros de gasolina, que cuesta 140 pts. el litro; y las berlinas gastan 7 5 litros a los kms. de gasolina. Por otro lado, cuando el terreno es un camino rural, las furgonetas y las berlinas gastan el doble de lo que gastan en autopistas, mientras que los todo-terreno gastan la mitad de lo que gastan en autopistas. Finalmente, si el consumo es en ciudad, todos gastan dos litros más. Si su objetivo es ahorrar en el gasto en combustible en los desplazamientos de sus vehículos, (1 punto decir qué algoritmo de los estudiados en clase utilizaría y por qué (1 5 puntos describir el espacio de problemas en este dominio (1 5 puntos parametrizar el algoritmo seleccionado (1 punto de acuerdo al algoritmo y parametrización elegidos, generar y evaluar, al menos, un nodo de profundidad 3 del árbol/grafo de búsqueda generado cuando el mundo por el que se deben mover es el representado en la figura adjunta. En ella, los números que aparecen entre los diferentes puntos representan las distancias kilométricas entre ellos. Se trata de llevar el paquete P1 al destino C12 y el paquete P2 al destino C9. C1 B2 P1 7 5 C3 T1 F1 C2 6 P2 20 B1 20 C4 30 6 50 C6 20 C5 70 ciudad terreno montañoso autopista F1: furgoneta B1 y B2: berlinas T1: todo terreno C1 C12: puntos significativos del mundo C7 10 10 10 C8 60 C9 C10 C11 20 20 C12

Departamento de Informática Universidad Carlos III de Madrid Ingeniería Técnica en Informática de Gestión Inteligencia Artificial Septiembre 2001. 2 a parte Normas generales del examen El tiempo para realizar el examen es de 2 horas No se responderá a ninguna pregunta sobre el examen Si se sale del aula, no se podrá volver a entrar durante el examen No se puede presentar el examen escrito a lápiz Problema 1. (5 puntos La empresa BEERSA pretende representar y simular mediante técnicas de inteligencia artificial su proceso de embotellado de cerveza. Este proceso consiste de dos partes: producción y rellenado de botellas y tapado de las mismas. Para producir las botellas: 1. Se crea una unidad de vidrio fundido a partir de una lámina de vidrio utilizando un aparato conocido como fundidora 2. A partir de cada unidad de vidrio fundido se produce una botella utilizando un molde 3. Cada botella se rellena de cerveza utilizando una herramienta conocida como rellenadora También es necesario producir tapones, de la manera siguiente: 1. De una chapa de hojalata se corta un trozo circular utilizando la cortadora 2. Al trozo circular se le da forma de tapón utilizando una prensa Finalmente, la botella rellena se tapa con el tapón por medio de la tapadora. Todas las herramientas (fundidora, molde, rellenadora, cortadora, prensa y tapadora pueden estar o bien en servicio o bien averiadas, aunque normalmente están disponibles. Si están averiadas, no se pueden utilizar. Se pide: 1. (2.5 puntos Representar con un sistema de producción el proceso anterior, de la siguiente manera. En la memoria de trabajo inicial estarán los productos disponibles inicialmente (láminas de vidrio, chapas de hojalata y cerveza. De cada una, habrá tantas instancias como unidades haya (por ejemplo, si hay tres chapas, habrá tres instancias. El sistema de producción contendrá también reglas para transformar unos productos en otros, siguiendo el proceso de fabricación descrito. Una vez el sistema de producción termine su ejecución, deberán aparecer en la memoria de trabajo los productos finales (botellas de cerveza tapadas. Es importante plantear el problema de manera que se minimize el número de reglas. Se utilizará una sintaxis próxima a la de CLIPS vista en clase. El ejercicio consta de dos partes: a (1 punto Plantear una jerarquía de marcos para representar el problema anterior b (1.5 puntos Plantear las reglas de transformación de unos productos en otros

2. (2.5 puntos Resolver el mismo problema utilizando métodos y/o demonios y una jerarquía de marcos similar a la del apartado anterior (aunque se pueden realizar los cambios que se consideren oportunos, para adaptarla. El proceso comenzaría cuando el usuario envía un mensaje a una instancia de lámina de vidrio, otra de chapa y otra de cerveza. Esto debería desencadenar otros mensajes que resultaran en la producción de una unidad de vidrio fundido y así sucesivamente hasta que se produzca en la memoria de trabajo la botella rellena de cerveza y tapada. El paso de mensajes se debe realizar de una manera elegante y natural. Es suficiente con utilizar pseudo-código. Nota: Se puede suponer que se dispone de una función crea-instancia que puede crear instancias de cualquier clase y que devuelve un puntero a la instancia creada. El ejercicio consta de dos partes: a (1 punto Adaptación de la jerarquía de marcos b (1.5 puntos Métodos/demonios necesarios, junto con una descripción general de la secuencia de llamadas

Soluciones del examen de Inteligencia Artificial. Septiembre 2001 Solución al problema 1 1. Dado que no nos piden como objetivo encontrar el mínimo gasto en combustible, si no que se pide ahorrar, valdría cualquier método de búsqueda heurística con un sólo agente. Es decir, escalada, búsqueda en haz o cualquiera de las técnicas de mejor-primero. Elegiremos, por ejemplo, el A. 2. Para describir el espacio de problemas de este dominio, 1 se podría utilizar cualquiera de las técnicas de representación de conocimiento analizadas en clase, como, por ejemplo, marcos y reglas, o lógica. En este caso, utilizaremos lógica de predicados. Las partes de las que consta el espacio de problemas serían: Espacio de estados. Cada estado estará representado por las cosas que sean ciertas en ese momento. Para representar cada estado, se podrían utilizar los predicados: en-paquete(paquete,lugar, en-vehículo(vehículo,lugar y cargado(paquete,vehículo. También se podría añadir otra información relativa al estado como: tipo de vehículo con el predicado: tipo-vehículo(vehículo,tipo-vehículo conexión entre dos puntos con el predicado: conexión(lugar 1,lugar 2,distancia,tipo-terreno litros que consume un vehículo con el predicado: consume(tipo-vehículo,tipo-terreno,litros Este predicado tendría como valores los dados por la siguiente tabla. tipo-vehículo tipo-terreno litros furgoneta autopista 5 furgoneta camino-rural 10 furgoneta ciudad 7 todo-terreno autopista 10 todo-terreno camino-rural 5 todo-terreno ciudad 12 berlina autopista 7 5 berlina camino-rural 15 berlina ciudad 9 5 Como ejemplo, se tendría en cada estado que es cierto consume(furgoneta,autopista,5, que es cierto consume(furgoneta,camino-rural,10, etc. coste de litro de combustible según vehículo con el predicado: coste-combustible(tipo-vehículo,coste Se tendría que decir en el estado que es cierto coste-combustible(furgoneta,, coste-combustible(todo-terreno,140 y coste-combustible(berlina,140. Conjunto de operadores. Se podrían definir tres operadores: cargar(paquete,vehículo,lugar: requeriría que el vehículo y el paquete estuvieran en el mismo lugar y cambiaría a un estado en el que el paquete estaría cargado en el vehículo y ya no estaría en el lugar. descargar(paquete,vehículo,lugar: requeriría que el paquete estuviera cargado en el vehículo y cambiaría a un estado en el que el paquete estaría en el lugar y ya no estaría cargado en el vehículo. ir(vehículo,lugar 1,lugar 2 : si el vehículo está en el lugar lugar 1, cambiaría a un estado en el que el vehículo estaría en el lugar lugar 2. 3. Tendremos que definir la función heurística f(n = g(n + h(n. g(n: suma de los costes k(n 1, n 2 de los nodos del camino mínimo encontrado hasta el momento entre el nodo raíz y el nodo n. Este coste k( va a ser 0 si el operador utilizado para ir desde el nodo n 1 al nodo n 2 ha sido el operador de carga o descarga, dado que no nos dicen cuánto cuestan estas operaciones. Por otro lado, si el operador utilizado ha sido ir(v, l 1, l 2, el coste se calcularía como: donde 1 Originalmente, el problema sólo pedía el espacio de estados. k ir(v,l1,l 2 (n 1, n 2 = d(l 1, l 2 l(l 1, l 2, v c(v

d(l 1, l 2 es la distancia en kilómetros entre l 1 y l 2. Se extraería del tercer argumento del predicado conexión(l 1, l 2, d,tipo-terreno. l(l 1, l 2, v es el consumo en litros del vehículo dado por el tercer argumento del predicado consume(tipo-vehículo,ti donde el tipo de terreno se calcula a partir del cuarto argumento del predicado conexión(l 1, l 2, d,tipo-terreno y el tipo de vehículo se calcula a partir de segundo argumento del predicado tipo-vehículo(v,tipo-vehículo. c(v es el coste del litro de combustible que se extraería del predicado coste-combustible(tipo-vehículo,c donde tipo-vehículo se extraería del predicado tipo-vehículo(v,tipo-vehículo. De manera formal, toda esta información se puede representar dentro de la información del operador, de forma que se deduzca el valor de k( a partir de la información conocida. Por ejemplo, se podría deducir el valor de k( a partir de la información del estado como el cuarto argumento del predicado coste-camino(v, l 1, l 2, k con la implicación: en-vehículo(v, l 1 conexión(l 1, l 2, d, tt tipo-vehículo(v, tv consume(tv, l coste-combustible(tt, c en-vehículo(v, l 2, en-vehículo(v, l 1,k(v, l 1, l 2, d l c h(n: estimación pesimista de lo que le queda por recorrer hasta conseguir un estado final. Una posibilidad sería sumar para cada paquete que no está en su lugar final el mínimo de los costes de mover el paquete a un lugar adyacente. Así, se puede calcular como: donde h(n = p i P [ mín h (l i, l 2 ] l 2 suc(l i l 2 pred(l i P es el conjunto de los paquetes que no están en su posición final l i es donde está situado el paquete p i en el estado actual de la búsqueda y que se extrae del segundo argumento del predicado en-paquete(p i, l i suc(l i es el conjunto de posibles lugares a los que se puede mover un vehículo desde l i en una sola aplicación del operador ir. prec(l i es el conjunto de lugares por los que ya ha pasado el paquete p i en los nodos del árbol/grafo de búsqueda. h (l i, l 2 sería donde h (l i, l 2 = d(l i, l 2 l (l i, l 2 = d(l i, l 2 l (l i, l 2 d(l i, l 2 es la distancia entre ambos lugares l (l i, l 2 sería el mínimo consumo de litros dependiendo del tipo-terreno entre l i y l 2. Así, tipo-terreno l (l i, l 2 autopista 5 camino-rural 5 ciudad 7 4. El nodo (estado inicial del árbol/grafo de búsqueda, n 0 representaría la situación de la figura. Así, sería cierto en-paquete(p1,c1, en-paquete(p2,c3, en-vehículo(f1,c2, en-vehículo(b1,c4, en-vehículo(b2,c1 y en-vehículo(t1,c3. También habría que representar la información relativa a las distancias y tipos de terreno entre cada lugar c i. Por ejemplo, sería cierto distancia(c1,c2,5,ciudad, distancia(c1,c3,7,ciudad hasta distancia(c11,c12,20,camino-rural. Finalmente, el estado también tendría la información estática cierta para cada problema dentro de este dominio, como la representada en las tablas explicadas anteriormente. A partir de este nodo, sus sucesores serían los que se obtuvieran por aplicación de un operador. En este caso, sus sucesores y las evaluaciones correspondientes de la función f(n serían:

Nodo Operador g(n h(n f(n n 1 cargar(p1,b2,c1 0 5 7 + 6 7 = 77 0+77=77 n 2 cargar(p2,t1,c3 0 5 7 + 6 7 = 77 0+77=77 7 12 140 n 3 ir(t1,c3,c1 = 117,6 5 7 + 6 7 = 77 117.6+77=194.6 6 12 140 n 4 ir(t1,c3,c2 =,8 5 7 + 6 7 = 77.8+77=177.8 20 10 140 n 5 ir(t1,c3,c7 = 280 5 7 + 6 7 = 77 280+77=357 5 7 n 6 ir(f1,c2,c1 = 35 5 7 + 6 7 = 77 35+77=112 6 7 n 7 ir(f1,c2,c3 = 42 5 7 + 6 7 = 77 42+77=119 20 5 n 8 ir(f1,c2,c4 = 5 7 + 6 7 = 77 +77=177 20 7,5 140 n 9 ir(b1,c4,c2 = 210 5 7 + 6 7 = 77 210+77=287 30 7,5 140 n 10 ir(b1,c4,c5 = 315 5 7 + 6 7 = 77 315+77=392 6 7,5 140 n 11 ir(b1,c4,c6 = 63 5 7 + 6 7 = 77 63+77=140 50 7,5 140 n 12 ir(b1,c4,c8 = 525 5 7 + 6 7 = 77 525+77=602 5 9,5 140 n 13 ir(b2,c1,c2 = 66,5 5 7 + 6 7 = 77 66.5+77=143.5 7 9,5 140 n 14 ir(b2,c1,c3 = 93,1 5 7 + 6 7 = 77 93.1+77=170.1 Por tanto, al ordenar ABIERTA, quedarían primeros los nodos n 1 y n 2, seguidos por los demás nodos en orden creciente de valor de f(n: ABIERTA= {n 1, n 2, n 6, n 7, n 11, n 13, n 14, n 8, n 4, n 3, n 9, n 5, n 10, n 12 } CERRADA={n 0 } En el siguiente ciclo, se seleccionaría el nodo n 1 (o al azar entre el n 1 y el n 2, se metería en CERRADA, se miraría si es nodo meta (que no es y se generarían los sucesores, metiéndolos en ABIERTA y en el grafo de búsqueda. Estos sucesores serían: Nodo Operador g(n h(n f(n n 15 descargar(p1,b2,c1 0 5 7 + 6 7 = 77 0+77=77 n 16 cargar(p2,t1,c3 0 5 7 + 6 7 = 77 0+77=154 n 17 ir(t1,c3,c1 0 + 7 12 140 = 122,6 5 7 + 6 7 = 77 122.6+77=194.6 n 18 ir(t1,c3,c2 0 + 6 12 140 =,8 5 7 + 6 7 = 77.8+77=177.8 n 19 ir(t1,c3,c7 0 + 20 10 140 = 280 5 7 + 6 7 = 77 280+77=357 n 20 ir(f1,c2,c1 0 + 5 7 = 65 5 7 + 6 7 = 77 65+77=142 n 21 ir(f1,c2,c3 0 + 6 7 = 42 5 7 + 6 7 = 77 42+77=119 n 22 ir(f1,c2,c4 0 + 20 5 = 5 7 + 6 7 = 77 +77=177 n 23 ir(b1,c4,c2 0 + 20 7,5 140 = 210 5 7 + 6 7 = 77 210+77=287 n 24 ir(b1,c4,c5 0 + 30 7,5 140 = 315 5 7 + 6 7 = 77 315+77=392 n 25 ir(b1,c4,c6 0 + 6 7,5 140 = 63 5 7 + 6 7 = 77 63+77=140 n 26 ir(b1,c4,c8 0 + 50 7,5 140 = 525 5 7 + 6 7 = 77 525+77=602 n 27 ir(b2,c1,c2 0 + 5 9,5 140 = 66,5 6 7 + 6 7 = 84 66.5+84=150.5 n 28 ir(b2,c1,c3 0 + 7 9,5 140 = 93,1 6 7 + 6 7 = 84 93.1+84=177.1 Por tanto, al ordenar ABIERTA, quedaría primero el nodo n 2, seguido por los demás nodos en orden creciente de valor de f(n: Solución al problema 2 ABIERTA= {n 2, n 6, n 7, n 21,..., n 26 } CERRADA={n 0, n 1 } Con reglas: En este ejercicio se pedía plantear una jerarquía de marcos de tal manera que se utilicen después un número pequeño de reglas. Para ello había que darse cuenta que, aunque hay muchas actividades distintas que transforman unos productos en otros (fundir moldear rellenar cortar y tapar, la mayor parte de ellas son similares: todas requieren una entrada y tienen una salida. Solo hay una actividad con dos entradas y una salida (tapar. Para ello, basta una jerarquía en la que estén representadas ambos tipos de actividades, y una regla para cada tipo de actividad. Esto era lo más importante del ejercicio, puesto que se pedía explicitamente. Otras

soluciones que habeis propuesto, en las que hay una regla para cada actividad, han obtenido obviamente menor puntuación. Posiblemente, una solución mejor fuera tener una ACTIVIDAD por omisión (de una entrada y otra actividad de dos entradas que fuera la excepción (puesto que sólo hay un caso, el de taponar. Sería equivalente al caso de las aves (que vuelan y el pingüino (que es un ave que no vuela. (defclass ACTIVIDAD (is-a INITIAL-OBJECT (slot id-actividad (type SYMBOL (create-accessor read-write (slot recurso (type SYMBOL (create-accessor read-write (slot numero-entrada (type INTEGER (create-accessor read-write (slot numero-salida (type INTEGER (create-accessor read-write (slot producto-salida (type SYMBOL (create-accessor read-write ;; (allowed-values lamina-vidrio vidrio-fundido botella botella-rellena botella-tapada chapa-hojal (defclass ACTIVIDAD-1-ENTRADA (is-a ACTIVIDAD (slot id-actividad (source composite ;; (allowed-values fundir moldear rellenar cortar (defclass ACTIVIDAD-2-ENTRADA (is-a ACTIVIDAD (slot id-actividad (source composite ;; (allowed-values tapar (slot numero-entrada-2 (type INTEGER (create-accessor read-write (defclass PRODUCTO (is-a INITIAL-OBJECT (slot nombre (type SYMBOL (create-accessor read-write ;; (allowed-values lamina-vidrio vidrio-fundido botella botella-rellena botella-tapada chapa-hojal

(slot situacion (type INTEGER (create-accessor read-write (defclass RECURSO (is-a INITIAL-OBJECT (slot nombre (type SYMBOL (create-accessor read-write ;; (allowed-values fundidora purificadora molde rellenadora envasadora cortadora prensa (slot estado (type SYMBOL (default disponible (allowed-values disponible estropeado (defrule r-actividad-1 (object (is-a ACTIVIDAD-1-ENTRADA (recurso?recurso (numero-entrada?ne (numero-salida?ns (producto-salida?producto-salida (object (is-a RECURSO (nombre?recurso (estado disponible?producto <- (object (is-a PRODUCTO (situacion?ne => (unmake-instance?producto (make-instance of PRODUCTO (nombre?producto-salida (situacion?ns (defrule r-actividad-2 (object (is-a ACTIVIDAD-1-ENTRADA (recurso?recurso (numero-entrada?ne (numero-entrada-2?ne2 (numero-salida?ns (producto-salida?producto-salida (object (is-a RECURSO (nombre?recurso (estado disponible?producto <- (object (is-a PRODUCTO (situacion?ne => (unmake-instance?producto (make-instance of PRODUCTO (nombre?producto-salida (situacion?ns Con mensajes: Básicamente, la solución consiste en que cuando un producto recibe un mensaje de iniciar el proceso, envía otro solicitando proceso a la actividad asociada. Esta a su vez envía otro al recurso para comprobar si está disponible. Si es así, se crea un nuevo producto asociado a la siguiente actividad, se borra el producto de entrada y se envía el mensaje inicia-proceso al nuevo producto. Si la actividad es de dos entradas, se añaden atributos para guardar las sucesivas solicitudes de procesamiento. Una vez que se reciben todas, se hace lo mismo que en el caso anterior. Al modificar la jerarquía, había que añadir atributos que apuntaran de los productos a las actividades que los procesan (o poner esta información en algún lugar, y de cada actividad a la siguiente actividad, de manera que cada actividad sepa donde enviar el siguiente mensajes. Esta es una solución elegante. Otras soluciones también han sido relativamente bien consideradas. Por ejemplo, alguna que no usa punteros para decidir a que instancia enviar el siguiente mensaje. Ese conocimiento está dentro de cada uno de los métodos asociados a cada una de las actividades. Pero esto tiene el inconveniente de que es necesario utilizar un método distinto para cada actividad, mientras que si el conocimiento de donde enviar el mensaje está incluido en la propia instancia, es suficiente con un método para las actividades de una sola entrada y otro para las de dos, como en el caso de las reglas. Puesto que había que reutilizar la jerarquía del apartado anterior, parece lógico que sean las herramientas las

que sepan como fundir, etc los productos, y no que sean los productos mismos quienes tengan ese conocimiento. Es decir, los métodos de transformación de productos debían estar asociados a las herramientas (o actividades y no directamente a los productos (estos simplemente solicitan ser procesados. Muchos habeis ignorado el enunciado en el que se decía claramente que los mensajes se envían al principio a las materias primas y estas deciden a donde enviarlos después. Lo más importante del ejercicio era que se produjera algún tipo de encadenamiento de los mensajes. Esto faltaba en muchos ejercicios. Otros os habeis liado entre métodos y demonios. Clases: clase PRODUCTO (is-a INITIAL-OBJECT nombre SYMBOL actividad MARCO (puntero a ACTIVIDAD metodo inicia-proceso para PRODUCTO enviar?self.actividad procesame(?self clase ACTIVIDAD (is-a INITIAL-OBJECT id-actividad SYMBOL recurso MARCO (puntero a RECURSO salida MARCO (puntero a ACTIVIDAD producto-salida SYMBOL clase ACTIVIDAD-1-ENTRADA (is-a ACTIVIDAD metodo procesame para ACTIVIDAD-1-ENTRADA (?producto BEGIN WHILE NOT (enviar disponible??self.recurso BEGIN END?nuevo-producto=crea-instancia de PRODUCTO nombre=?self.producto-salida, actividad=?self.salida destruye-intancia(?producto enviar inicia-proceso?nuevo-producto END clase ACTIVIDAD-2-ENTRADA (is-a ACTIVIDAD primer-producto MARCO (puntero a PRODUCTO segundo-producto MARCO (puntero a PRODUCTO metodo procesame para ACTIVIDAD-2-ENTRADA (?producto BEGIN IF?self.primer-producto=NIL THEN?self.primer-producto=?producto ELSE BEGIN?self.segundo-producto=?producto WHILE NOT (enviar disponible??self.recurso BEGIN END?nuevo-producto=crea-instancia de PRODUCTO nombre=?self.producto-salida, actividad=?self.salida destruye-instancia(?self.primer-producto destruye-instancia(?self.segundo-producto enviar inicia-proceso?nuevo-producto END END

clase RECURSO (is-a INITIAL-OBJECT nombre SYMBOL estado SYMBOL omisión=disponible metodo disponible? para RECURSO BEGIN devuelve?self.estado END