experimento mental sobre estructuras jerárquicas De Wikipedia, la enciclopedia libre
El problema de los generales bizantinos es un experimento mental para plantear, de una forma metafórica, el problema que se da entre un conjunto de sistemas informáticos que tienen un objetivo común. Deben encontrar un plan de acción común a partir de una estructura jerárquica, donde uno de los sistemas que tiene mayor rango proporciona una orden a partir de la cual el resto de sistemas tiene que operar (fijar su decisión). Además es posible que alguno de ellos no sea fiable y provea información falsa de forma intencionada.[1][2]
Supongamos un escenario de guerra en el que tenemos un grupo de m generales bizantinos que están asediando una ciudad desde distintos lugares y tienen que ponerse de acuerdo para atacar o retirarse de forma coordinada. Entre los generales hay solo uno que puede cursar la orden por ser el comandante. El resto se dice que son tenientes.
Los tenientes se comunican entre ellos cuando reciben la orden del comandante y las dos posibles órdenes del comandante son "atacar" y "retirarse".
Uno o más de los generales puede ser un traidor (al resto se les llama leales), por lo que su objetivo es conseguir que todos los generales leales no se pongan de acuerdo. Para ello pueden ofrecer información errónea. Por ejemplo, si el comandante es el traidor, podría mandar órdenes contradictorias a los distintos tenientes. Si el teniente es un traidor podría indicarles a otros tenientes, con el fin de confundirlos y que creyeran que el traidor es el comandante, que el comandante les envió la orden contraria a la que realmente les envió.
Para resolver el problema tenemos que buscar algoritmos que nos permitan conseguir alguno de los siguiente objetivos:[3]
Normalmente para llegar a una solución se suelen hacer las siguientes condiciones adicionales:[3][2]
En 1982 Leslie Lamport, Robert Shostak y Marshall Pease[4] proporcionaron distintos algoritmos de solución en función de condiciones adicionales.
La estrategia se basa, con el fin de detectar si el comandante es el traidor, en que los tenientes se reenvíen entre sí la información que el comandante les ha mandado. Si el teniente es leal la información que transmitirá el teniente será la que le envió el comandante. La consecuencia de usar mensajes orales (no firmados) es que un general traidor puede decir que el comandante le ha mandado cierta información cuando no es así.
Analicemos el caso en el que tenemos tres generales (m=3).
La conclusión es que no existe solución que garantice que se cumplan las condiciones del problema si se permite que con tres generales uno sea un traidor. Esto se debe a que no hay suficientes generales para formar una opinión consensuada.
Si tuviéramos 4 generales (m=4) sí sería posible el acuerdo a través del siguiente algoritmo:
Veamos el esquema si el comandante es leal y un teniente es traidor:
Veamos el esquema si el comandante es traidor y los tenientes leales:
Generalizando a m generales se puede decir que si tenemos t traidores necesitamos que m sea al menos 3t+1. Al algoritmo generalizado se le llama OM(m) (donde las siglas OM vienen del inglés Oral Messages) y viene descrito por usar la siguiente función de mayoría:
En este escenario los mensajes van firmados (se trata de mensajes escritos). Al ir firmados no son modificables y por tanto los traidores no pueden modificarlos y decir que provienen del comandante. En esta situación es posible resolver el problema con sólo tres generales y uno de ellos traidor. El algoritmo de este tipo de problemas se llama SM(m) (donde SM viene del inglés Signed Messages) y es el siguiente:
En este escenario los comandantes traidores son descubiertos inmediatamente ya que han firmado órdenes contradictorias.
Si falta alguno de los caminos de comunicación las cosas se complican. Veamos los requerimientos tanto cuando hay mensajes orales como mensajes firmados.
Seamless Wikipedia browsing. On steroids.