lunes, 28 de octubre de 2013

Protección de Agentes

Desde el punto de vista del usuario final, según Lange y Oshima, en el libro escrito el año 1998 titulado “Programación e implementación de agentes móviles Java con aglets”, se menciona que los agentes pueden ser: “Programas que asisten y actúan a favor del usuario final”, en este caso se refuerza la idea de la delegación en los agentes de las tareas de usuario. Sobre el concepto de agente, se puede hablar de sus características, diciendo que un agente autónomo, para empezar, no es un programa, o al menos es algo más que un programa, al fin y al cabo, todo lo que se ejecuta en una computadora es un programa; es decir, no se suele llamar programa por el mismo motivo que un sistema operativo no se suele llamar un programa a pesar de que no pueda ser otra cosa. Una de las características que distingue los agentes de los programas sencillos es la autonomía de acción. Los agentes son más que activos, es decir, que no sólo actúan en respuesta a una acción directa del usuario, sino que también actúan siguiendo los objetivos que tienen marcados, bien por el usuario bien por su propia construcción. Además, son persistentes, aún cuando el usuario no interactúa con ellos siguen funcionando, recolectando información, aprendiendo y comunicándose con otros agentes.

Cuando se transfiere código ejecutable a través de la red, existe la posibilidad de un ataque. En palabras de los investigadores Jansen y Karygiannis, en el artículo escrito el año 2000 titulado “Seguridad en agentes móviles”, los agentes al igual que ocurre con los programas usados en redes, pueden ser susceptibles a alteraciones, ataques, espionaje, y clonaciones. Es importante ser conscientes de que siempre existe la posibilidad de que un intruso intente afectar la integridad de un sistema y por tanto llevar a cabo las medidas de prevención adecuadas ayuda a minimizar los riesgos. Algunos de los ataques que son ejecutados en contra de agentes son: Espionaje de código, espionaje de información, manipulación de código y de información, ejecución incorrecta del código, identidad falsa de un host y negación de ejecución. Un agente puede llevar consigo información confidencial, por lo que se debe prevenir en todo momento la modificación del código ejecutable. Es posible asegurar la integridad de un agente que proviene de otro host utilizando la firma digital o el cifrado. Sin embargo, es difícil detectar o prevenir los ataques que pueda realizar un host mientras se ejecuta un agente. Los hosts pueden intentar sacar provecho del agente modificando el código, los datos, las comunicaciones o incluso los resultados, ya que, como se mencionaba, tienen control total sobre la ejecución del agente. A este problema se le conoce como el de los “Hosts maliciosos”, este es considerado por muchos autores el más difícil de resolver en lo relacionado con la seguridad en sistemas de agentes móviles.

Para prevenir una alteración en el código y en la información, los agentes se pueden proteger, al igual que muchos programas informáticos, utilizando métodos criptográficos. De forma similar los agentes pueden ser autenticados con un host o incluso con otros agentes, mediante métodos de clave pública como es la firma digital. Según Chess, en el artículo escrito el año 1996 titulado “Consideraciones de seguridad en sistemas basados en agentes”, tomando en cuenta que los agentes se pueden ejecutar en hosts con diversos grados de confianza, sería ingenuo no esperar un comportamiento malicioso por su parte. Los hosts pueden sacar provecho del agente modificando el código, los datos, el modo de ejecución, el estado, las comunicaciones, el itinerario o incluso los resultados, ya que tienen control total sobre la ejecución. Precisamente esta es la razón por la cual no se pueden evitar ataques de denegación de servicio, puesto que el host tiene en sus manos el código del agente para ejecutarlo a placer, forzándolo a terminar antes de tiempo o incluso a migrar a otro destino. Para un agente móvil es imposible almacenar en claro una clave secreta, puesto que el host tiene acceso de lectura y modificación a la misma, para esto es imprescindible disponer de un entorno confiable para realizar las operaciones criptográficas.

lunes, 21 de octubre de 2013

Segunda parte Búsqueda heurística


En palabras de Fuentetaja, en la tesis doctoral escrita el año 2010 titulada “Búsqueda heurística en planificación basada en costes”, en planificación mediante búsqueda heurística se han aplicado heurísticas de muy diversos tipos y naturaleza. A grandes rasgos las heurísticas se pueden dividir en dos categorías: Heurísticas dependientes del dominio y heurísticas independientes del dominio. Con heurísticas independientes del dominio se hace referencia a aquellas cuyo proceso de cálculo es el mismo para todos los dominios. Las heurísticas dependientes del dominio, pueden ser muy útiles para guiar la búsqueda, sin embargo, no se pueden aplicar a problemas con estructura distinta a aquellos para los que se generaron. Estas heurísticas requieren de un trabajo adicional en cada dominio para generar la información, o la función, que permite calcular la heurística. Cuando este trabajo se puede realizar de forma automática, se acercan más a las heurísticas independientes del dominio, que son aquellas que no requieren de ninguna información adicional al propio dominio o problema. Estas últimas están acordes con la idea de la planificación como un proceso general de resolución de problemas y han tenido un gran auge en los últimos años. Las heurísticas independientes del dominio más comunes en planificación mediante búsqueda heurística se pueden clasificar en función de su objetivo como: (1) Heurísticas numéricas. Aquellas que estiman numéricamente la distancia entre dos estados, un estado fuente y un estado destino. (2) Heurísticas de poda u ordenación. Aquellas que sirven para podar el espacio de estados, o para ordenar ciertos nodos. (3) Heurísticas con vistas futuras. Aquellas que permiten generar rápidamente estados profundos mediante la aplicación, total o parcial, de una política.

Fuentetaja, en la tesis doctoral citada anteriormente, continúa mencionando que los algoritmos de búsqueda progresiva que se han venido utilizando en planificación clásica se pueden dividir en dos grupos: (1) Aquellos que aplican algoritmos de búsqueda local, y (2) Aquellos que aplican algoritmos de tipo mejor primero. La búsqueda local funciona de la siguiente forma: de entre la vecindad de un único nodo actual, elige un nodo que pasa a ser el nuevo nodo actual y el proceso se repite de forma iterativa hasta que se cumpla un criterio de terminación. La búsqueda local se caracteriza porque no tiene memoria y no revisa las decisiones una vez que estas se han tomado, es decir, es un procedimiento irrevocable. El criterio de terminación normalmente se cumple cuando se ha encontrado una solución, cuando se ha realizado un determinado número de iteraciones y aparentemente el proceso de búsqueda está estancado o cuando no se puede continuar a partir el nodo actual. A continuación se mencionan algunos tipos de búsqueda local que se han aplicado en planificación, como la búsqueda de ascenso de colinas y la búsqueda forzada de ascenso de colinas, complementándose esta descripción con el algoritmo de búsqueda mejor primero.

La búsqueda de ascenso de colinas o búsqueda en escalada, es uno de los procedimientos más conocidos de búsqueda local. En este caso, el siguiente nodo de cada iteración se elige de entre los que tienen una mejor evaluación heurística de entre todos los sucesores. En caso de que el nodo elegido tenga una evaluación heurística peor que el padre, la búsqueda termina. El funcionamiento de la búsqueda en escalada depende de la topología del espacio de búsqueda. Cuando se encuentra un óptimo local, es decir, un estado para el que todos los sucesores tienen peor evaluación, la búsqueda termina sin encontrar solución alguna. La búsqueda de ascenso de colinas forzada es una variante del ascenso de colinas en la que se generan sucesores utilizando búsqueda en amplitud, hasta encontrar un sucesor, que puede ser indirecto, con una evaluación heurística mejor que el nodo actual. En este caso el nuevo nodo actual es este sucesor. La búsqueda mejor primero constituye un esquema de búsqueda global, que se caracteriza por elegir el siguiente nodo a expandir basándose en una función de evaluación. Normalmente se consideran mejores los nodos con un menor valor para la función de evaluación. La búsqueda mejor primero se suele implementar utilizando una lista ordenada en orden creciente respecto a la función de evaluación, la lista abierta, de manera que el siguiente nodo a expandir es siempre el primer elemento de la lista. Cuando un nodo se expande, se generan todos sus sucesores, y éstos se introducen en la lista abierta. El nodo expandido se introduce en una lista cerrada. El algoritmo analiza cuando el nodo que se extrae de la lista abierta es un nodo solución.

lunes, 14 de octubre de 2013

Búsqueda heurística

Al interior de las nuevas teorías sobre el juicio humano y gracias, fundamentalmente, al trabajo realizado por Kahneman, Slovic y Twersky desde principios de la década de los setenta, reportados en el libro publicado el año 1982 titulado “Juicio bajo incertidumbre: Heurística y prejuicios”, se han reconocido una serie de reglas de decisión denominadas “heurísticas”. Una heurística puede definirse como la estrategia utilizada por las personas para emitir un juicio, realizar una estimación, tomar una decisión, etc., basándose en componentes limitados de la información disponible. De esta manera, estas reglas han recibido la denominación de “atajos mentales” o “reglas de sentido común”, dando origen a gran cantidad de investigaciones y experimentación. Realizar un juicio heurístico puede considerarse como una manera bastante eficiente de llegar a una solución a un problema debido fundamentalmente a su rapidez y consistencia con las propias creencias. Sin embargo, las soluciones ofrecidas pueden ser inexactas, pudiendo conducir a errores. A modo de ejemplo, un juicio consistente con una heurística de representatividad, sería “Juzgar un libro por su portada”. Las heurísticas han sido frecuentemente descritas como estrategias que la gente utiliza de manera deliberada en orden de simplificar los problemas, que de otra manera serían difíciles de solucionar por la mente humana. La discusión corriente en ámbito académicos argumenta que una descripción de ese tipo, conlleva a que los errores producidos por su uso tienen su origen en una mente no suficientemente atenta, lo cual es inconsistente con el planteamiento propuesto por Kahneman, Slovic y Twersky, que establecen que las heurísticas se acercan a la denominación de “juicios naturales”, pudiendo influir en la tarea de decisión o estimación sin ser usadas de manera estratégica o deliberada.

Por otra parte, en palabras de Ramos, en los apuntes escritos el año 2007 con el título “Heurísticas y problemas combinatorios”, con el fin de resolver problemas complicados con eficiencia, en ocasiones es necesario comprometer algunos requisitos de optimalidad y construir una estructura de control que no garantice encontrar la mejor respuesta pero que casi siempre encuentre una buena solución. De esta forma, surge la idea de heurística. La palabra heurística viene de la palabra griega heuriken que significa “descubrir”, que es también origen de eureka, derivado de la famosa exclamación de Arquímedes, heurika “lo encontré”. Los investigadores Bartholdi y Platzman, en el artículo escrito el año 1988 titulado “Heurística basada en curvas espaciales y compactas para problemas combinatorios en el espacio euclidiano”, definieron heurística de la siguiente manera: “Una heurística puede verse como un procesador de información que, deliberadamente, peor juiciosamente, ignora cierta información. Ignorando información, una heurística se libra de gran parte del esfuerzo que debió haberse requerido para leer los datos y hacer cálculos con ellos. Por otra parte, la solución producida por tal heurística, es independiente de la información ignorada, y de este modo no se ve afectada por cambios en tal información. Idealmente, se busca ignorar información que resulta muy caro colectar y mantener, esto es, computacionalmente caro de explotar y mantener, y que contribuye en poco a la precisión de la solución.” Se puede definir una heurística como una técnica que aumenta la eficiencia de un proceso de búsqueda, posiblemente sacrificando demandas de completitud. Las heurísticas son como los guías de turismo: Resultan adecuadas en el sentido de que generalmente suelen indicar las rutas interesantes; son malas en el sentido de que pueden olvidar puntos de interés para ciertas personas. Al usar buenas heurísticas se pueden expresar buenas, aunque posiblemente no óptimas, soluciones a problemas difíciles, como el problema del viajante de comercio. Una función heurística es una correspondencia entre las descripciones de estados del problema hacia alguna medida de deseabilidad, normalmente representada por números. Quiere decir que mensura cada estado del problema y dice qué tan cerca de la solución óptima está. El propósito de una función heurística es el de guiar el proceso de búsqueda en la dirección más provechosa sugiriendo qué camino tomar cuando hay más de uno disponible. Cuanto más exactamente estime la función heurística los méritos de cada nodo del grafo que representa al problema, más directo será el proceso de solución. En general, hay que hacer una ponderación entre el costo de evaluación de una función heurística y el ahorro de tiempo de búsqueda que proporciona la función.