Autor Tema: Algoritmo para generar una relación transitiva

0 Usuarios y 1 Visitante están viendo este tema.

07 Junio, 2018, 02:12 pm
Leído 2760 veces

Zrig

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 43
  • Karma: +0/-0
  • Sexo: Masculino
Quiero generar aletoriamente relación transitiva entre los primeros n números naturales. Para ello, primero creo una matriz triangular \( A = (a_{ij})_{0\leq i < j < n} \) y le asigno aleatoriamente valores verdadero/falso, de forma que \( a_{ij} \) = verdadero sii i está relacionado con j.
Para asegurarme que sea transivita, aplico el siguiente algoritmo:

FOR i=0 TO n-1
   FOR j=i+1 TO n-1
      FOR k=j+1 TO n-1
         IF \( a_{ij} \) AND \( a_{jk} \) THEN \( a_{ik} \) = TRUE

Juraría que es correcto, pero no lo es porque me ha generado (para n=6) una relación que no es transitiva.
¿Dónde está el error y cómo puede solucionarse?

07 Junio, 2018, 02:59 pm
Respuesta #1

Masacroso

  • “Lo que oigo, lo olvido; lo que veo, lo recuerdo; lo que hago, lo aprendo” (antiguo proverbio chino)
  • Moderador Global
  • Mensajes: 5,485
  • País: es
  • Karma: +0/-0
Creo que el error está en que la rutina FOR cuando termina genera nuevos puntos los cuales deben volver a ser pasados por la rutina FOR, es decir, los \( a_{i,k} \) generados pueden no ser transitivos con otros puntos.

08 Junio, 2018, 10:04 am
Respuesta #2

Zrig

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 43
  • Karma: +0/-0
  • Sexo: Masculino
Gracias por la respuesta Masacroso. La solución, entonces, es recomenzar el algoritmo cuando se cambia \( a_{ik} \). No parece muy eficiente pero al menos así tienes que salir sí o sí  ::) .

08 Junio, 2018, 10:48 am
Respuesta #3

Masacroso

  • “Lo que oigo, lo olvido; lo que veo, lo recuerdo; lo que hago, lo aprendo” (antiguo proverbio chino)
  • Moderador Global
  • Mensajes: 5,485
  • País: es
  • Karma: +0/-0
Gracias por la respuesta Masacroso. La solución, entonces, es recomenzar el algoritmo cuando se cambia \( a_{ik} \). No parece muy eficiente pero al menos así tienes que salir sí o sí  ::) .

No eficiente no es, habría que pensar otra solución. En programación la eficiencia es fundamental, habría que buscarse un procedimiento más lineal o directo.

08 Junio, 2018, 11:55 am
Respuesta #4

Luis Fuentes

  • el_manco
  • Administrador
  • Mensajes: 58,907
  • País: es
  • Karma: +0/-0
Hola

 En este documento se sugiere generar aleatoriamente una matriz de incidencia (complejidad \( O(n^2) \))

 Y luego hacer su clausura transitiva. En este otro documento se indican algortimos para hacer tal clausura de orden \( O(n^3) \).

http://cs.winona.edu/lin/cs440/ch08-2.pdf

Saludos.