Dependency Algorithm - find a minimum set of packages to install

前端 未结 10 1904
别那么骄傲
别那么骄傲 2021-02-02 17:23

I\'m working on an algorithm which goal is to find a minimum set of packages to install package \"X\".

I\'ll explain better with an example:



        
相关标签:
10条回答
  • 2021-02-02 17:42

    Another (fun) way to solved this issue is to use a genetic algorithm.

    Genetic Algorithm is powerful but you have to use a lot of parameters and find the better one.

    Genetic Step are the following one :

    a . Creation : a number of random individual, the first generation (for instance : 100)

    b. mutation : mutate of low percent of them (for instance : 0,5%)

    c. Rate : rate (also call fitness) all the individual.

    d. Reproduction : select (using rates) pair of them and create child (for instance : 2 child)

    e. Selection : select Parent and Child to create a new generation (for instance : keep 100 individual by generation)

    f. Loop : Go back to step "a" and repeat all the process a number of time (for instance : 400 generation)

    g. Pick : Select an individual of the last generation with a max rate. Individual will be your solution.

    Here is what you have to decide :

    1. Find a genetic code for your individual

    You have to represent a possible solution (call individual) of your problem as a genetic code.

    In your case, it could be a group of letter representing the node which respect constraint OR and NOT.

    For instance :

    [ A E B Y ], [ A C K H ], [A E Z B Y] ...

    1. Find a way to rate individual

    To know if an individual is a good solution, you have to rate it, in order to compare it to other individual.

    In your case, it could be pretty easy : individual rate = number of node - number of individual node

    For instance :

    [ A E B Y ] = 8 - 4 = 4

    [ A E Z B Y] = 8 - 5 = 3

    [ A E B Y ] as a better rate than [ A E Z B Y ]

    1. Selection

    Thanks to individual's rate, we can select Pair of them for reproduction.

    For instance by using Genetic Algorithm roulette wheel selection

    1. Reproduction

    Take a pair of individual an create some (for instance 2) child (other individual) from them.

    For instance :

    Take a node from the first one and swap it with a node of the second one.

    Make some adjustment to fit "or, and" constraint.

    [ A E B Y ], [ A C K H ] => [ A C E H B Y ], [ A E C K B Y]

    Note : that this is not the good way to reproduct it because the child are worth than the parent. Maybe we can swap a range of node.

    1. Mutation

    You have just to change genetic code of select individual.

    For instance :

    • Delete a node

    • Make some adjustment to fit "or, and" constraint.

    As you can see, it's not hard to implements but a lot of choice has to be done for designing it with a specific issue and to control the different parameters (percent of mutation, rate system, reproduction system, number of individual, number of generation, ...)

    0 讨论(0)
  • 2021-02-02 17:49

    "I dint get the problem with "or" (the image is not loading for me). Here is my reasoning . Say we take standard shortest route algo like Dijkstras and then use equated weightage to find the best path . Taking your example Select the best Xr from below 2 options

    Xr= X+Ar+Er
    Xr= X+Ar+Cr
    

    where Ar = is the best option from the tree A=H(and subsequent child's) or A=Y(and subsequent childs)

    The idea is to first assign standard weight for each or option (since and option is not a problem) . And later for each or option we repeat the process with its child nodes till we reach no more or option .

    However , we need to first define , what best choice means, assume that least number of dependencies ie shortest path is the criteria . The by above logic we assign weight of 1 for X. There onwards

    X=1
    X=A and E or C hence X=A1+E1 and X=A1+C1
    A= H or Y, assuming H and Y are  leaf node hence A get final weight as 1
    hence , X=1+E1 and X=1+C1
    
    Now for E and C
    E1=B1+Z1 and B1+Y1 . C1=A1 and C=K1.
    Assuming B1,Z1,Y1,A1and K1 are leaf node 
    
    E1=1+1 and 1+1 . C1=1 and C1=1
    ie E=2 and C=1
    
    Hence
    X=1+2 and X=1+1 hence please choose X=>C as the best route
    

    Hope this clears it . Also we need to take care of cyclical dependencies X=>Y=>Z=>X , here we may assign such nodes are zero at parent or leaf node level and take care of dependecy."

    0 讨论(0)
  • 2021-02-02 17:49

    I would suggest you to first transform the graph in a AND-OR Tree. Once done you can perform a search in the tree for the best (where you can choose what "best" means: shortest, lowest memory occupation of packages in nodes, etc...) path.

    A suggestion I'd make, being that the condition to install X would be something like install(X) = install(A) and (install(E) or install(C)), is to group the OR nodes (in this case: E and C) into a single node, say EC, and transform the condition in install(X) = install(A) and install(EC).

    In alternative, based on the AND-OR Tree idea, you could create a custom AND-OR Graph using the grouping idea. In this way you could use an adaptation of a graph traversal algorithm, which could be more useful in certain scenarios.

    Yet another solution could be to use Forward Chaining. You'd have to follow these steps:

    1. Transform (just re-writing the conditions here):

      A and (E or C) => X

      E and (H or Y) => A

      B and (Z or Y) => E

    into

    (A and E) or (A and C) => X
    (E and H) or (E and Y) => A
    (B and Z) or (B and Y) => E
    
    1. Set X as goal.
    2. Insert B, H, K, Y, Z as facts.
    3. Run Forward chaining and stop on the first occurrence of X (the goal). That should be the shortest way to achieve the goal in this case (just remember to keep track of the facts that have been used).

    Let me know if anything is unclear.

    0 讨论(0)
  • 2021-02-02 17:53

    To add to Misandrist's answer: your problem is NP-complete NP-hard (see dened's answer).

    Edit: Here is a direct reduction of a Set Cover instance (U,S) to your "package problem" instance: make each point z of the ground set U an AND requirement for X. Make each set in S that covers a point z an OR requirement for z. Then the solution for package problem gives the minimum set cover.

    Equivalently, you can ask which satisfying assignment of a monotone boolean circuit has fewest true variables, see these lecture notes.

    0 讨论(0)
提交回复
热议问题