Vente de blocs de plages horaires

27

Compte tenu de plages horaires que personnes souhaitent acheter. La personne a une valeur pour chaque intervalle de temps . Chaque personne ne peut acheter qu'un seul bloc de créneaux horaires consécutifs, qui peuvent être vides.nkih(i,j)0j

Existe-t-il un algorithme polynomial pour calculer la valeur maximale que le vendeur peut atteindre?

Sans la contrainte de consécutivité, nous pouvons donner chaque créneau horaire à la personne qui l'apprécie le plus. De plus, si nous fixons l'ordre des créneaux horaires des personnes, alors la programmation dynamique peut être utilisée pour résoudre pour la valeur maximale du premier les gens qui achètent le premier temps fentes.k0ik0jn

user11550
la source

Réponses:

9

Étant donné un 3CNF avec les clauses sur les variables . Supposons que et apparaissent dans la formule pour au plus fois respectivement.ϕ1,,ϕkx1,,xnxixi¯ki

Nous concevons un DAG coloré dont les sommets se composent de trois parties:G

  • Sommets "Affectation" et , , . Colorez avec la "couleur" , et avec .vi(j)v¯i(j)1in1jkivi(j)xi(j)v¯i(j)xi¯(j)
  • "Clause" sommets , , . Couleur avec la couleur (ou ) si (ou , resp.) Est le ème littéral de la clause , et il est la clause -ème contenant ce littéral.wi(j)1ikj=1,2,3wi(j)xi(j)xi¯(j)xi¯xijϕij
  • "Couper" les sommets . Coloriez-les avec des couleurs distinctes différentes de celles ci-dessus.s=s0,s1,,sn,sn+1,sn+k=t

Les bords comprennent:

  • si1vi(1) , , ;vi(j)vi(j+1)vi(ki)si
  • si1v¯i(1) , , ;v¯i(j)v¯i(j+1)v¯i(ki)si
  • et , .sn+i1wi(j)wi(j)sn+i

Par exemple, à partir du 3CNF le graphique suivant est construit (les directions des bords sont de gauche à droite). (x1x2x3¯)(x1x2¯x3)entrez la description de l'image ici

Maintenant , il est difficile de ne pas voir que le 3CNF d' origine est satisfiable si et seulement s'il y a un - chemin avec les couleurs des sommets différents dans .stG

(Soit dit en passant, c'est un sous-produit que l’existence de chemin - avec différentes couleurs de sommets dans le DAG coloré est . Je n’ai pas trouvé beaucoup de littératures sur ce problème dans une perspective de calcul. Si vous savez, veuillez commenter!)stNP-hard

Alors, quelle est la relation entre le problème de et OP? Intuitivement, ce que nous allons faire est de concevoir une matrice , de sorte que chaque couleur soit mappée sur une ligne (qui est une personne) et que les bords soient mappés sur des colonnes consécutives (intervalles de temps). Par conséquent, une planification maximale, qui va essentiellement de gauche à droite dans la matrice, correspond à un chemin - .Ghst

Notre matrice a colonnes, avec des indices à partir de . Dans le Constrcution suivant un sont deux valeurs satisfont . Les rapports peuvent être de grandes puissances de et . Soit .h2n+1+i2ki+k0XY1XYX/1,Y/XknKi=2i+2j=1iki

  • Pour chaque , , soit (si la coordonnée existe, idem ci-dessous).si0inh(si,Ki)=h(si,Kiki1)=h(si,Ki+ki+1+1)=Y
  • Pour chaque , soit ; Pour chaque , laissez .xi(j)h(xi(j),Ki1+j)=Xxi¯(j)h(xi¯(j),Ki1+ki+1+j)=X
  • Pour chaque , et un littéral dans la clause , soit .ϕi1ikxϕih(x,Kn+i)=1
  • Toutes les autres entrées sont 0.

Par exemple, pour l'exemple de graphique ci-dessus, la matrice correspondante est entrez la description de l'image ici

Maintenant, nous affirmons: le 3CNF d'origine est satisfiable si et seulement si la valeur maximale est .(2n+1)Y+ikiX+k

Considérez la planification atteignant la valeur maximale. Puisqu'il y a exactement colonnes dans contenant , elles doivent toutes être couvertes. Pour la colonne qui a deux choix de , supposons que l'ordonnancement l'affecte à . Puisque la colonne doit être affectée à , par suite, nous devons perdre les colonnes à . Les mêmes choses se produisent si l'ordonnancement affecte la colonne à .(2n+1)hYKi+ki+1YsiKisiKi+1Ki+kiKi+ki+1si+1

Par conséquent, pour avoir la valeur , nous devons sélectionner tous les autres disponibles dans la matrice, ce qui correspond à une affectation sur des variables. Ainsi, la valeur de repos de est réalisable si et seulement si l'affectation satisfait à chaque clause.ikiXXk

En conclusion, décider de la valeur maximale d'une planification légale se trouve dans . C'est peut-être pour cela que toutes nos tentatives précédentes pour trouver un algorithme ont échoué.NP-hard

Willard Zhan
la source
Mais, dans l'exemple de matrice, si je choisis et je peux toujours atteindre l'objectif. Qu'est-ce que je fais mal? De plus, le dans doit être une colonne à droite et le dans doit être une colonne à gauchex1¯ x2¯x3Xx1¯(1)Xx1¯(2)
rotia
@rotia Oui, et cela signifie qu'à gauche, vous devez sélectionner pour avoir . Cela correspond donc à une affectation satisfaisante . x1,x2,x3¯4Xx1=x2=1,x3=0
Willard Zhan
Pouvez-vous préciser ce que "Supposons plus grand dans les deux nombres d'apparitions des littéraux et ." veux dire? Quel est le nombre d'apparition d'un littéral? Est-ce quelque chose sur l'endroit où il apparaît dans les clauses / formule, ou est-ce le nombre de fois qu'il apparaît dans la formule? est-il un littéral ou un nombre? kixixi¯ki
DW
@DW est un nombre. Mon expression n'était en effet pas tout à fait claire; Je l'ai édité. ki
Willard Zhan
@WillardZhan Oui. Mais si je choisis ces variables, je peux atteindre une valeur plus grande que celle de la formule. Par exemple, je mets et , selon la formule je ne devrais obtenir que 450 points (en supposant que est le nombre de clauses). Mais, en choisissant je peux atteindre 452 points en choisissant les quatre à droiteY=60X=7kx1,x2,x3¯
rotia
3

Cette solution a des problèmes et sera supprimée bientôt; voir le commentaire de templatetypedef.

Vous pouvez résoudre ce problème en temps polynomial en utilisant un flux à coût minimum . Dans ce qui suit, tous les bords ont une capacité unitaire.

  • Créez un sommet source et un sommet cible . Nous enverrons unités de flux de à .stkst
  • Créez sommets pour représenter les points temporels entre les créneaux, et un bord dirigé pour chaque avec un coût 0.n+1v0,,vnvjvj+10j<n
  • Pour chaque personne , créez ce qui suit: i
    • Un sommet de sous-source et un sommet de sous-puits .siti
    • Pour chaque , une arête de à ayant coûté (que nous considérons être 0 si ).0j<nsivjΣk=1jh(i,k)j=0
    • Pour chaque , une arête de à ayant coûté .1jnvjtiΣk=1jh(i,k)
    • Une arête de coût 0.ssi
    • Un bord avec un coût 0.tit

Un flux à coût minimum dans ce réseau aura un coût total égal au négatif du meilleur profit possible. (Ce coût sera négatif, mais ce n'est pas un problème.) Il existe une solution intégrale optimale dans laquelle chaque personne a un seul bord quittant avec un flux de 1 et un seul bord arrivant à avec un flux de 1, et tous les autres bords incidents sur ou ont un flux de 0. Que ces bords d'écoulement 1 pour personne deviendrais et : alors , puisque les seuls chemins entre -vertices sont ceux qui augmentent l'indice. Siisitisitiisivjvktikjvk=j, alors la personne se voit attribuer aucun créneau horaire; sinon, la personne se voit allouer le bloc d'intervalles de temps .iij+1,,k

Intuitivement, chaque personne "obtient" 1 unité de flux de et choisit une heure de début (bord) et une heure de fin (bord); ces bords de début et de fin sont les seuls bords à coût différent de zéro dans le réseau, et nous pouvons représenter la valeur d'un bloc comme la différence de deux sommes de préfixe. Les capacités unitaires sur les bords entre les vertices empêchent 2 personnes d'utiliser le même créneau horaire.sj+1,,kv

Fait intéressant, cette formulation fonctionnera même si les valeurs peuvent être négatives.h(i,j)

j_random_hacker
la source
3
Cela pourrait-il échouer si une personne prend un itinéraire de sa source vers le puits d'une autre personne et vice versa? i
templatetypedef
@templatetypedef: Je pense que vous avez raison; Je supprimerai cette réponse sous peu. Qu'en est-il de cette construction à la place: nous avons les mêmes sommets et arêtes qu'auparavant, mais maintenant nous essayons de "thread" une seule unité de flux à travers un "pipeline" de personnes (ordonné en augmentant la valeur ) en supprimant toutes les arêtes sauf pour et tous les bords exception de , et en ajoutant un bord avec un énorme coût négatif pour chaque . Les forceront l'unité de débit unique à visiter tous les de ces bords de «pipeline» dans n'importe quelle solution optimale. ississ1tittkttisi+1M1i<kMk1
j_random_hacker
@j_random_hacker alors vous forcez une commande des personnes. k
Chao Xu
@ChaoXu: Je ne pense pas: dans toute affectation de blocs à des personnes, l'affectation peut être répertoriée par ordre croissant par personne. (Notez que rien n'interdit à une personne voir attribuer un bloc se terminant par , où est le premier bloc affecté à la personne .) Mais j'ai le sentiment qu'un proche parent du problème qui a affecté mon premier tentative affecte également celui-ci ...i>ij<jji
j_random_hacker
@j_random_hacker Le coût de exigerait que soit la ème personne dans la solution optimale. sivjsii
Chao Xu