销售时间段


27

给定个人想要购买的个时隙。人对于每个时隙都有值。每个人只能购买一个连续的时隙块,这可能是空的。nkih(i,j)0j

是否有多项式时间算法来计算卖方可以实现的最大值?

没有连续性约束,我们可以将每个时隙分配给最重视它的人。同样,如果我们固定了个人的时隙顺序,则可以使用动态编程来求解第一个个人购买第一个时间的最大值插槽。k0ik0jn

Answers:


9

给定3CNF,在变量上带有子句。假设和出现在公式中最多次。ϕ1,,ϕkx1,,xnxixi¯ki

我们设计一个有色DAG其顶点包括三个部分:G

  • “赋值”顶点和,,。色与“颜色”,和与。vi(j)v¯i(j)1in1jkivi(j)xi(j)v¯i(j)xi¯(j)
  • “子句”顶点,,。色与彩色或)如果(或,RESP)是个文字的第,它是包含此文字的第个子句。wi(j)1ikj=1,2,3wi(j)xi(j)xi¯(j)xi¯xijϕij
  • “剪切”顶点。用不同于上面的不同颜色为它们上色。s=s0,s1,,sn,sn+1,sn+k=t

边缘包括:

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

例如,从3CNF 构建以下图形(边缘方向从左到右)。 (x1x2x3¯)(x1x2¯x3)在此处输入图片说明

现在,不难看出,当且仅当存在一条具有不同顶点颜色的 -路径时,原始3CNF才可以满足要求。stG

(顺便说一句,彩色DAG中具有不同顶点颜色的 -路径的存在是。从计算角度来看,我没有找到很多有关此问题的文献。您知道的,请发表评论!)NP-硬stNP-hard

那么和OP问题之间有什么关系?直观地,我们要设计一个矩阵,以便将每种颜色映射到一行(是一个人),而将边缘映射到连续的列(时隙)。因此,基本上从矩阵中的左到右进行的最大调度对应于 -路径。ħ 小号Ghst

我们的矩阵有列,索引从开始。在下面的建设必须的两个值满足。比率可以是和大幂。令。2 Ñ + 1 + Σ 2 ķ + ķ 0 X ý 1 « X « ý X / 1 ÿ / X ķ Ñ ķ = 2 + 2 Σ Ĵ = 1 ķ h2n+1+i2ki+k0XY1XYX/1,Y/XknKi=2i+2j=1iki

  • 对于每个,,令(如果该坐标存在,如下所示。 0 Ñ ħ š ķ = H ^ s ^ ķ - ķ - 1 = H ^ s ^ ķ + ķ + 1 + 1 = ÿsi0inh(si,Ki)=h(si,Kiki1)=h(si,Ki+ki+1+1)=Y
  • 对于每个,令;对于每个,让。ħ X Ĵ ķ - 1 + Ĵ = X ‾ X Ĵ ħ ¯ X Ĵ ķ - 1 + ķ + 1 + Ĵ = Xxi(j)h(xi(j),Ki1+j)=Xxi¯(j)h(xi¯(j),Ki1+ki+1+j)=X
  • 对于每个,和子句的文字,令。 1 'ķ X φ ' ħ X ķ Ñ + '= 1ϕi1ikxϕih(x,Kn+i)=1
  • 所有其他条目均为0。

例如,对于上面的示例图,相应的矩阵为 在此处输入图片说明

现在我们声明:且仅当最大值为,原始3CNF才可满足。(2n+1)Y+ikiX+k

考虑达到最大值的调度。由于中恰好有列包含,因此应该全部覆盖它们。对于具有两个选择的列,假设计划将其分配给。由于必须将列分配给,因此必须通过连续性将列丢失为。如果调度将列分配给发生相同的情况。(2n+1)hYKi+ki+1YsiKisiKi+1Ki+kiKi+ki+1si+1

因此,为了具有值,我们必须选择矩阵中所有其余的可用,它们对应于变量的赋值。因此,当且仅当赋值满足每个子句时,的剩余值才可实现。ikiXXk

结论是,确定合法调度的最大值在。也许这就是为什么我们之前所有尝试找到算法的尝试都失败了的原因。NP-hard


但是,在示例矩阵中,如果我选择和我仍然可以达到目标。我做错了什么?另外,在应为一列到右侧和在应该是一个列向左侧x1¯ x2¯x3Xx1¯(1)Xx1¯(2)
rotia

@rotia是的,这意味着您必须在左侧选择才能获得。因此,这对应于令人满意的分配。x1,x2,x3¯4Xx1=x2=1,x3=0
Willard Zhan

您能否澄清一下“假设在文字和的两个出现较大一个”。手段?文字的出现次数是多少?这是关于它出现在子句/公式中的位置,还是出现在公式中多少次?是文字或数字?kixixi¯ki
DW

@DW是一个数字。我的表达确实不十分清楚。我已经编辑了 ki
Willard Zhan

@WillardZhan是的。但是,如果我选择这些变量,则可以得到一个大于公式中值的值。例如,我将设置,将,根据公式,我应该只能得到450点(假设是从句的数量)。但是,通过选择我可以通过在右边选择四个来获得452点Y=60X=7kx1,x2,x3¯
rotia

3

该解决方案有问题,将很快被删除;参见templatetypedef的评论。

您可以使用最小成本流在多项式时间内解决此问题。在下文中,所有边均具有单位容量。

  • 创建一个源顶点和一个目标顶点。我们将从到发送个流量单位。stkst
  • 创建个顶点以表示插槽之间的时间点,并为每个(成本为0)创建有向边。n+1v0,,vnvjvj+10j<n
  • 为每个人,创建以下内容: i
    • 子源顶点和子宿顶点。siti
    • 对于每,从到的边成本为(如果,则取为)。0j<nsivjΣk=1jh(i,k)j=0
    • 对于每,从到的边的成本为。1jnvjtiΣk=1jh(i,k)
    • 成本为0 的边。ssi
    • 成本为0 的边。tit

该网络中的最低成本流将使总成本等于最大可能利润的负数。(此成本为负,但这不是问题。)存在一个最佳积分解决方案,其中每个人都有一条边,而的流量为1,而一条边的流量为1,并且入射到或上的所有其他边沿的流量为0。让这些流1边缘用于人是和:然后,由于中唯一路径 -vertices是那些增加下标。如果isitisitiisivjvktikjvk=j,则没有分配给人任何时隙;否则,给人分配时隙。iij+1,,k

直观地,每个人都从 “获得” 1个流量单位,并选择开始时间(边缘)和结束时间(边缘);这些开始和结束边是网络中唯一具有非零成本的边,我们可以将块的值表示为两个前缀和的差。顶点之间的边缘上的单位容量可防止2个人使用相同的时隙。sj+1,,kv

有趣的是,即使值可能为负,该公式也将起作用。h(i,j)


3
如果某人从其源头到另一个人的接收器进行路由,反之亦然,这可能会失败吗?i
templatetypedef

@templatetypedef:我相信你是对的;我将很快删除此答案。取而代之的是这种结构:我们具有与以前相同的顶点和边,但是现在我们尝试通过删除所有边 ”单个流单位的人员“流水线”(通过增加值排序)。和所有边缘除了以及添加边缘巨大负成本为每个。该旨意迫使流的单个单元访问所有这些“管道”边缘的任何最优解。小号小号小号小号1 ķ小号+ 1 - 中号1 < ķ - 中号ķ - 1ississ1tittkttisi+1M1i<kMk1
j_random_hacker

@j_random_hacker,然后您将强制订购个人。k
徐超

@ChaoXu:我不这么认为:在将区块分配给任何人时,可以按人的升序列出分配。(注意,没有人禁止给人分配一个以结尾的块,其中是分配给人的第一个块。)但是我有一种感觉,这个问题的近亲影响了我的第一个尝试也影响到这一点……j ' < j j ii>ij<jji
j_random_hacker

@j_random_hacker的成本将要求是个人的最佳解决方案。小号sivjsii
徐超
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.