Classement topologique positif

45

Supposons que j'ai un graphe acyclique dirigé avec des pondérations en nombre réel sur ses sommets. Je souhaite trouver un ordre topologique du groupe de disponibilité de base de données dans lequel, pour chaque préfixe de cet ordre topologique, la somme des poids est non négative. Ou si vous préférez la terminologie théorique, j'ai un ordre partiel pondéré et je souhaite une extension linéaire telle que chaque préfixe ait un poids non négatif. Que sait-on de ce problème? Est-ce NP-complet ou soluble en temps polynomial?

David Eppstein
la source
4
Essayez l’algorithme glouton sur ce graphique: 1 -> 2 -> 3, 1 -> 4 -> 5, les poids au sommet sont 1: +2, 2: -2, 3: +3, 4: -1 , 5: -2. L'algorithme glouton commencerait par v1, choisirait v4 et resterait bloqué. Le bon ordre est v1, v2, v3, v4, v5.
Robin Kothari
2
"Certains des problèmes de distance de Frechet que JeffE et d'autres ont examinés" - Belle abstraction! Pour le bénéfice des autres, voici une version: supposons que vous receviez un graphe plan G, et deux sommets s et tn sur la face externe. Vous voulez transformer un chemin frontière de s en t en un autre par une séquence de mouvements élémentaires. Chaque déplacement remplace le tracé actuel par sa différence symétrique par une limite de face. Combien de temps pouvons-nous trouver la même séquence qui minimise la longueur maximale du chemin en évolution?
Jeffε
3
Tsuyoshi, désolé pour ça, j'ai essayé d'ajouter une nouvelle ligne tout en commentant et cela a coupé mon commentaire. Donc, l’idée est que vous avez une ficelle étroitement attachée autour de votre poignet et que vous voulez savoir si vous pouvez la détourner. Votre poignet est représenté sous la forme d'un maillage polygonal dont les cellules sont des éléments d'un ordre partiel (plus proche de la chaîne plus tôt, plus proche de plus tard dans l'ordre). Le poids d'une cellule est la différence de longueur entre ses limites interne et externe.
David Eppstein le
1
@ David: Merci pour l'explication. Cette fois, je peux comprendre le lien entre cela et la question actuelle, et c'est intéressant!
Tsuyoshi Ito
3
Observation peu utile, mais amusante: ce problème est équivalent au problème de séquencement d'une seule machine avec des délais et des contraintes de priorité dans lesquels le temps de traitement de chaque travail peut être négatif . Avec un temps de traitement non négatif, ce problème est en P (Lawler et Mooer 1969 jstor.org/stable/2628367 ), et si une solution existe, il existe alors une solution indépendante du temps de traitement. Cela s’efface clairement si certaines tâches ont un temps de traitement négatif.
Tsuyoshi Ito

Réponses:

18

Ce problème semble être très similaire à SEQUENCER POUR MINIMISER LE COÛT CUMULATIF MAXIMAL, problème [SS7] dans Garey & Johnson . En être témoin:

INSTANCE: Set des tâches, ordre partiel sur T , un "coût" c ( t ) Z pour chaque t T (si c ( t ) < 0 , il peut être considéré comme un "profit"), et constante K Z .TTc(t)ZtTc(t)<0KZ

QUESTION: Existe-t-il une planification à processeur unique pour T qui respecte les contraintes de priorité et qui a pour propriété que, pour chaque tâche t T , la somme des coûts de toutes les tâches t avec σ ( t ) σ ( t ) est au plus K ?σTtTtσ(t)σ(t)K

Je suis certain que le problème reste NP-complet quand est fixé à 0. mention G & J que le problème reste NP-complet si c ( t ) { - 1 , 0 , 1 } pour tout t T .Kc(t){1,0,1}tT

mhum
la source
7
Cela semble bon. Ensuite, je pense que l'on peut prendre sans perte de généralité, sinon ajouter un travail non contraint avec c -valeur - K (ou K jobs de c -valeur - 1 ). K=0cKKc1
daveagp
@mhum: Je travaille sur un rapport technique sur les résultats obtenus et j'aimerais vous citer. Voulez-vous me donner votre vrai nom? Si vous le souhaitez, vous pouvez me l'envoyer par e-mail ou simplement rester ...
domotorp
9

Eh bien, ma réponse est ma question à partir de laquelle il s'avère que si vous pouviez résoudre ce problème en P, vous pourriez également résoudre un autre problème ouvert: l' ordre topologique positif, prenez 3

Édition: Ce problème s’est également avéré être NP-complet; votre problème est donc déjà complet si votre DAG n’a que deux niveaux, c’est-à-dire s’il n’existe aucun chemin dirigé à deux arêtes.

Domotorp
la source
3

Si je comprends bien le problème, je pense que le problème de planification lié à une seule machine contraint par la priorité afin de minimiser la somme pondérée des temps d’exécution (1 | prec | \ sum wc) peut être réduit au problème qui vous intéresse. Dans le problème 1 | prec | \ sum wc, nous avons n emplois, chacun avec un poids non négatif et un temps de traitement, un poset sur les emplois et nous souhaitons une extension linéaire des emplois telle que la somme pondérée des temps de réalisation des emplois minimisé. Le problème est NP-complet même si nous supposons que le temps de traitement de chaque travail est égal à 1. Cela a-t-il un sens?

Monaldo
la source
C'est certainement une possibilité intéressante. Mais comment faire la réduction de telle sorte que le critère d'optimisation (minimiser la somme des délais d'exécution) soit transformé en contraintes (préfixes non négatifs)?
David Eppstein
Je ne connais pas le résultat du problème de l'achèvement de la NP, mais je pense qu'il fait référence au problème de décision consistant à décider s'il existe une extension linéaire telle que la somme pondérée des temps de réalisation des travaux soit au plus égale à K, donc je ne pense pas. la distinction entre un critère d'optimisation et une contrainte est importante ici. Cependant, je n’ai pas compris comment représenter la contrainte sur la somme pondérée des délais d’exécution dans le problème actuel.
Tsuyoshi Ito
Je pense que la réduction n’est pas aussi facile que je le pensais au début. Je ne suis plus sûr de ma réponse.
Monaldo
Je viens de me rendre compte d'une erreur dans mon précédent commentaire. Lorsque je l'ai posté, je pensais qu'il était facile de représenter une contrainte sur la somme non pondérée (d'où l'importance de pondérer ), mais c'était complètement faux.
Tsuyoshi Ito
2

Et si nous prenions toujours l'élément maximal (dans l'ordre partiel) avec le moins de poids. Après avoir épuisé les éléments, nous les renvoyons dans l'ordre inverse.

Daniel Martin
la source
Le problème est invariant lorsque la transformation consiste à inverser l’ordre partiel et à annuler tous les poids. Donc, je ne vois pas en quoi cela peut être différent de l'algorithme d'avant-goût que Robin K a donné à un contre-exemple dans les commentaires.
David Eppstein
Mais cette méthode fonctionne pour son exemple: d'abord, le sommet 5 serait choisi, puis le sommet 4, puis 3, 2 et enfin 1. L'ordre final serait donc 1, 2, 3, 4, 5. En fait, je ne 'pense pas qu'il est difficile de prouver que cette méthode fonctionne. Supposons que vous ayez une solution qui ne comporte pas d'élément maximal (évier) de poids minimal dans la dernière position. Ensuite, vous pouvez trouver une autre solution qui possède cette propriété, simplement en modifiant la position d’un tel élément pour durer et en préservant le reste tel qu’il est. Procédez par induction sur ce qui reste et vous obtenez une preuve formelle.
Daniel Martin
Ouais ... ça ne marche pas ... 1 -> 2 -> 3, 1 -> 4 avec des poids de 4, -7, 6, 3 respectivement.
Daniel Martin
1

Ce problème me rappelle beaucoup d'arbres de décision. Je considérerais ce type de solution, qui essaie toujours de choisir le chemin le plus prometteur, mais en regardant le sous-graphique entier:

En partant de nœuds de puits, avancez vers les sources, un niveau à la fois. Pendant que vous faites cela, donnez un poids à chaque bord. Ce poids doit représenter le montant minimum que vous devrez "payer" ou "gagner" en parcourant le sous-graphe en partant du nœud vers lequel pointe le bord. Supposons que nous sommes au niveau i + 1 et que nous progressons vers le niveau i. Voici ce que je ferais pour attribuer un poids à une arête pointant vers un nœud de niveau i:

  1. edge_weight = pointing_node_weight.
  2. Trouver le bord à partir du "noeud de pointage" avec le poids maximal. Laissez ce poids être next_edge_weight.
  3. edge_weight + = next_edge_weight

Ensuite, construisez la commande comme suit:

  1. Soit S la frontière de recherche, c’est-à-dire l’ensemble des nœuds à sélectionner dans la suite.
  2. Sélectionnez le noeud pour que (node_weight + maximum_edge_weight) soit maximisé.
  3. Supprimez le nœud du graphique et S. Ajoutez les «enfants» du nœud à S.
  4. Si le graphique n'est pas vide, passez à l'étape 1.
  5. Arrêt.

L'idée est de parcourir ces sous-graphes qui donneront le plus grand gain possible en premier, afin de pouvoir supporter le coût des sous-graphes de poids négatif plus tard.

chazisop
la source