2010-01-14 6 views
5

dado una lista de clases que heredan de esta base:¿Algún algoritmo de limpieza para clasificar objetos según las dependencias definidas?

class Plugin(object): 
    run_after_plugins =() 
    run_before_plugins =() 

... y las siguientes reglas:

  • Los complementos pueden proporcionar una lista de plugins que deben ejecutarse después.
  • Los complementos pueden proporcionar una lista de complementos que deben ejecutarse antes.
  • La lista de complementos puede contener o no todos los complementos que se han especificado para ordenar restricciones.

¿Alguien puede proporcionar un buen algoritmo de limpieza para ordenar una lista de complementos? Será necesario para detectar dependencias circulares, así ....

def order_plugins(plugins): 
     pass 

que he llegado con algunas versiones, pero nada particuarlly ordenada: Estoy seguro de que algunos de ustedes Art of Computer Programming tipos disfrutarán el reto :)

[nota: pregunta dada en Python, pero es evidente que no es sólo una cuestión de Python: pseudocódigo en cualquier idioma haría]

Respuesta

8

Esto se llama topological sorting.

La aplicación canónica de clasificación topológica (topológico orden) es en programar una secuencia de trabajos o tareas; clasificación topológica algoritmos se estudiaron por primera vez en el principios de 1960 en el contexto de la técnica PERT para la programación en el proyecto gestión (Jarnagin 1960). Los trabajos están representados por los vértices, y hay es una arista de x a y si el trabajo x debe ser completado antes del trabajo y puede ser iniciado (por ejemplo, cuando se lava ropa, la lavadora debe acabado antes de poner la ropa a seca). Luego, un tipo topológico da un orden en el que realizar los trabajos.

+0

@Eli: Encontré esta pregunta (http://stackoverflow.com/questions/952302/how-to-sort-based-on-dependencies) que mencionaba ese tipo de ordenamiento ahora pero el ejemplo dado no tener dos tipos separados de dependencias para ser ordenadas: ¿puede eso algo tratar también con este caso? – jkp

+2

@jkp: se puede convertir a esa representación. es decir, A dice que B debe ejecutarse antes que él, pero C después de él. Entonces, con solo restricciones "después", decimos que A está detrás de B, y C está detrás de A. –

+0

@Eli: ¡jaja! Sí, supongo que cuando lo enciendes, su cabeza se aplica limpiamente. Una restricción anterior en un complemento es solo una restricción posterior para otro :) – jkp

1

Esto se llama topological sorting.

Hacer esto implica varios pasos:

En primer lugar construir un gráfico de todos los plugins seleccionadas como vértices y sus dependencias como bordes. Ejecutar antes/después de los deps se reducen al mismo tipo de bordes.

Próxima compilación de un casco transitiv: Mire todos los complementos y agregue todas las dependencias faltantes. Repita esto hasta que el conjunto no cambie más.

Último paso: elija un vértice sin bordes entrantes y realice una búsqueda DFS (o BFS). Estos algoritmos se pueden enriquecer con la detección de ciclos.

0

Si define el __lt__ y los métodos asociados en el Plugin en función de si deben ejecutarse antes o después, entonces podría ser posible encontrar un orden correcto con sorted(). Sin embargo, los ciclos aún serían un problema.

2

Here es un código de Python que realiza la clasificación topológica.

+0

@ ΤΖΩΤΖΙΟΥ: Sí, eso también lo encontré. Fue un poco largo para lo que quería: mi versión coincidía estrechamente con el ejemplo dado en la publicación que relacioné en los comentarios de Eli. Aprendí un nuevo truco de todos modos, que es lo principal :) – jkp

Cuestiones relacionadas