タイムスロットのブロックを売る


27

与えられたのタイムスロットがあることk個の人々が購入したいです。人が私は値有するH I J 0を各タイムスロットのためにJ。各ユーザーは、空の可能性があるタイムスロットの連続したブロックを1つしか購入できません。nkih(i,j)0j

売り手が達成できる最大値を計算する多項式時間アルゴリズムはありますか?

連続性の制約がなければ、各タイムスロットを最も価値のある人に与えることができます。我々はのタイムスロットの順序固定場合にも、人々を、次いで、動的プログラミングは、最初の最大値を求めるために使用することができる0 I Kの最初の購入人0 J N個のタイムスロット。k0ik0jn

回答:


9

句で3CNFを考えるとの変数上のx 1... X nは。両方が仮定xはI及び¯は、xはiは高々ための式に現れるのk i個のそれぞれの時間。ϕ1,,ϕkx1,,xnxixi¯ki

頂点が3つの部分で構成される色付きのDAG を設計します。G

  • "割り当て"頂点はˉ V IJ 1 I nは1 jはk個のI。カラーV IJ 、 "色"とは、xはIJ 、およびˉ V IJ ¯ X IJ vi(j)v¯i(j)1in1jkivi(j)xi(j)v¯i(j)xi¯(j)
  • "句"頂点1 I 'KJ ' = 1 2 3。色W I 'J 'の色でxはIJ (または¯ X Ijで場合)¯ xはI(またはxはiは、RESPは。)であり、J 'wi(j)1ikj=1,2,3wi(j)xi(j)xi¯(j)xi¯xij番目のリテラル句の、そして、それはだJこのリテラルを含む番目の句。ϕij
  • "カット"頂点。上記とは異なる明確な色でそれらを着色します。s=s0,s1,,sn,sn+1,sn+k=t

エッジは次のとおりです。

  • V IJ 、V IJ + 1 V iはkはiはIsi1vi(1)vi(j)vi(j+1)vi(ki)si
  • ˉ V IJ ˉ V IJ + 1 ˉ V iがkはiはIsi1v¯i(1)v¯i(j)v¯i(j+1)v¯i(ki)si
  • そしてwはI 'J 'N + I 'sn+i1wi(j)wi(j)sn+i

例えば、3CNFから 以下のグラフが構築される(エッジ方向が左から右にあります)。 (x1x2x3¯)(x1x2¯x3)ここに画像の説明を入力してください

Gに異なる頂点カラーを持つ - tパスがある場合にのみ、元の3CNFが満足できることを確認するのは難しくありません。stG

(ところで、色付きDAGの異なる頂点カラーを持つ - tパスの存在はNP困難であることが副産物です。計算の観点からこの問題に関する多くの文献は見つかりませんでした。コメント!)stNP-hard

それでは、とOPの問題の関係は何ですか?直観的には、マトリックスhを設計して、各色が行(人)にマッピングされ、エッジが連続した列(タイムスロット)にマッピングされるようにします。したがって、基本的にマトリックス内で左から右に向かう最大スケジューリングは、s - tパスに対応します。Ghst

行列は、インデックスが0から始まる2 n + 1 + i 2 k i + k列があります。以下constrcutionのにX Y二つの値を満足している1 « X « Y。比率X / 1 Y / Xknの大きなべき乗になる可能性があります。レッツK 私は = 2 I + 2 Σ I jはh2n+1+i2ki+k0XY1XYX/1,Y/XknKi=2i+2j=1iki

  • 0 I N、聞かせてH sはiはK 、I= H sはIKはI - kはiは - 1 = H sはiはK iが + kをI + 1 + 1 = Y(座標が存在する場合、以下と同じ)。si0inh(si,Ki)=h(si,Kiki1)=h(si,Ki+ki+1+1)=Y
  • について、h x ij K i 1 + j = X ; 毎¯ X IJ 、聞かせてH ¯ X IJ K I - 1 + kはI + 1 + J = Xxi(j)h(xi(j),Ki1+j)=Xxi¯(j)h(xi¯(j),Ki1+ki+1+j)=X
  • それぞれについて、1 I 'KとリテラルX句におけるφ I '、聞かせてH X K 、N + I '= 1ϕi1ikxϕih(x,Kn+i)=1
  • 他のすべてのエントリは0です。

たとえば、上のグラフの例では、対応する行列は ここに画像の説明を入力してください

ここで、最大値が場合にのみ、元の3CNFが満たされると主張します。(2n+1)Y+ikiX+k

最大値を達成するスケジューリングを検討してください。hにYを含む正確な列があるため、すべてカバーする必要があります。Yの 2つの選択肢がある列K i + k i + 1について、スケジューリングがそれをs iに割り当てると仮定します。コラム以来K 私はに割り当てる必要がありますsの私は、連続性により、私たちは列を失うする必要がK I + 1K I + K(2n+1)hYKi+ki+1YsiKisiKi+1。スケジューリングが列 K i + k i + 1 s i + 1に割り当てる場合も同じことが起こります。Ki+kiKi+ki+1si+1

したがって、値を持つためには、変数の割り当てに対応する、マトリックス内の残りの利用可能なXをすべて選択する必要があります。したがって、kの残りの値は、割り当てがすべての句を満たす場合にのみ実現可能です。ikiXXk

結論として、法的スケジューリングの最大値の決定はます。これが、アルゴリズムを見つけるための以前の試みがすべて失敗した理由かもしれません。NP-hard


しかし、例の行列では、私が選ぶ場合 ¯ X 2及びX 3、私はまだ客観的に得ることができます。私が間違っているのは何ですか?また、X¯ X 11 右に1列であるべきであるX¯ X 12 左側になければならない一つの列x1¯ x2¯x3Xx1¯(1)Xx1¯(2)
rotia

上の手段は、あなたが選択する必要があります左はい@rotia、およびという持っている4 Xを。したがって、これは満足のいく割り当てx 1 = x 2 = 1 x 3 = 0に対応します。x1,x2,x3¯4Xx1=x2=1,x3=0
ウィラードチャン

あなたは「と仮定を明確することができ大きなリテラルの出現二つの数字の1が、xは私をして¯ xは、私を。」手段?リテラルの出現回数は?それは句/式のどこに現れるのか、それとも式の何回目に現れるのか?さkはリテラルまたは数?kixixi¯ki
DW

@DW は数値です。私の表現は確かに明確ではありませんでした。編集しました。ki
ウィラードチャン

@WillardZhanはい。しかし、これらの変数を選択すると、式の値よりも大きい値を取得できます。たとえば、式iに従っておよびX = 7に設定すると、iは450ポイントになります(kは節の数であると仮定)。しかし、選択することで、X 1xは2を¯ X 3、私は右の4つのものを選ぶことにより、452ポイントを得ることができますY=60X=7kx1,x2,x3¯
rotia

3

このソリューションには問題があり、すぐに削除されます。templatetypedefのコメントを参照してください。

最小コストのflowを使用して、多項式時間でこれを解決できます。以下では、すべてのエッジにユニット容量があります。

  • ソース頂点とターゲット頂点tを作成します。k単位のフローをsからtに送信します。stkst
  • 作成頂点V 0... VをNスロット間の時間ポイントを表すために、および有向エッジのV j個のV J + 1それぞれについて0 J < Nコスト0を有します。n+1v0,,vnvjvj+10j<n
  • 各個人について、以下を作成します。 i
    • 副ソース頂点は、及びサブシンク頂点T Isiti
    • すべてのための、からエッジIのV jのコストを有するΣのjはK = 1つの H I K (我々は場合は0であることを取るJ = 0)。0j<nsivjΣk=1jh(i,k)j=0
    • すべてのための、からエッジのV jのためのt iのコストを有する- Σ jはkが= 1つの H I K 1jnvjtiΣk=1jh(i,k)
    • コスト0 エッジssi
    • コスト0 のエッジtit

このネットワークの最小コストフローの総コストは、可能な限り最高の利益のマイナスに等しくなります。(このコストは負になりますが、それは問題ではありません。)すべての人が単一のエッジを持ち、s iをフロー1で、単一のエッジがt iにフロー1で到着する最適な統合ソリューションがあります。、およびs iまたはt iのいずれかに入射する他のすべてのエッジには0のフローがあります。人のためにこれらのフロー-1のエッジがしてみましょう、私はあることのV JV K T Iその後:K Jisitisitiisivjvktikj頂点間の唯一のパスは添え字を増やすパスであるためです。場合K = jの場合、人私は何のタイムスロットを割り当てられていません。それ以外の場合、個人iにはタイムスロットj + 1 kのブロックが割り当てられます。vk=jiij+1,,k

直感的に、各人はから1単位のフローを「取得」し、開始時間(エッジ)と終了時間(エッジ)を選択します。これらの開始エッジと終了エッジは、ネットワーク内でゼロ以外のコストを持つ唯一のエッジであり、ブロックj + 1 kの値を2つのプレフィックス合計の差として表すことができます。v頂点間のエッジのユニット容量は、2人が同じタイムスロットを使用するのを防ぐように機能します。sj+1,,kv

興味深いことに、値が負の場合でも、この定式化は機能します。h(i,j)


3
一部の人がソースから別の人のシンクへ、またはその逆にルートを取る場合、これは失敗する可能性がありますか?i
templatetypedef

@templatetypedef:あなたは正しいと思う。この回答はすぐに削除します。代わりにこの構造はどうですか:以前と同じ頂点とエッジがありますが、すべてのエッジs s iを削除することにより、人々の「パイプライン」(値が増加する順)に単一のフロー単位を「スレッド」しようとします以外S S 1とすべてのエッジT I Tを除くT K、T、およびエッジを追加することをt iは、sのI + 1巨大な負のコストで- Mそれぞれについて1 I < Kississ1tittkttisi+1M1i<k Sはすべて訪問する流れの単一ユニットを強制的にK - 1これらの「パイプライン」のエッジのいずれか最適解です。Mk1
j_random_hacker

@j_random_hackerその後、人の順序付けを強制します。k
チャオ徐

@ChaoXu:私はそうは思いません:人へのブロックの割り当てでは、割り当て人ごとに昇順でリストできます。(jが人iに割り当てられた最初のブロックであるj ' < jで終わるブロックが割り当てられている人禁止するものはないことに注意してください。)しかし、私は最初の人に影響を与えた問題の親relativeが...また、このいずれかを影響しようi>ij<jji
j_random_hacker

sivjsii
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.