一群人互相购买礼物的最低购物次数


10

我们有个人。我们列出了谁必须为组内谁购买礼物的清单。每个人可能需要购买/接收任意数量的礼物,或者根本不需要。在购物旅行中,一部分人会一起前往同一家商店,并为不在商店中的任何人购买礼物。他们可能不会在同一购物之旅中为其他人购买礼物,因为那样就不会感到惊讶。一个人可能会进行多次购物旅行。我们希望最大程度地减少每个人购买所需礼物所需的购物行程总数。ñn

例如,假设有5个人,每个人都必须为组中的其他每个人购买礼物。让人们从1到5进行编号。这可以在4个购物行程中完成,如下所示:

  • 行程1、1、2、3去购物

  • 行程2:1、4、5去购物

  • 旅程3:2、4去购物

  • 行程4:3、5购物

我将如何解决这个问题?很明显,输入可以用有向图表示,但是我不知道从那里去。有人提出了biclique覆盖问题,但尽管类似,却无法回答这个问题。

我们可以将输入视为个顶点上的有向图,其中边表示人u必须为人v购买礼物。的目标是找到一组bicliques的小号1Ť 1... 小号ķŤ ķ使得ķ是最小的,并且边集Ë图的的一个子集š × Ť G Gn nu v (u,v)uv(S1,T1),,(Sk,Tk)kEi(Si×Ti)。同样,在将双斜线的定义扩展到有向图时,双斜线S iT i(Si,Ti)仅包含将S i映射SiT i的边Ti。这不同于biclique覆盖问题中,我们不要求每个biclique是的一个子图G ^G(我们不要求小号 × Ť ËSi×TiE每个i)。

具体来说,我会接受以下任一答案:

  • 证明此问题是NP难题
  • 提出了多项式时间算法,可以准确回答此问题(无近似值或上限)

记录下来,我在任何地方都没有看到这个问题,我只是出于好奇而想知道。

Answers:


2

这个问题很困难。为了说明这一点,我首先将这个(优化)问题重新构成为决策问题。然后,我重新制定这个问题成等价的一个,从它是相当简单的获得从一个还原ķk -coloring问题,这是NP-hard的任何ķ 3k3

问题的简短表述如下:

给定nn个人和一个编码其“馈赠”关系的图表GG,找到所需的最少行程,以便可以购买所有礼物而不会造成任何意外。

但是,这是一个优化问题。NP类通常是为决策问题定义的(每个实例的答案为是或否)。一个决策变体是:

给定n个人和一个编码其“馈赠”关系和整数t的图形G,最多进行t次旅行就足以购买所有礼物而不会破坏任何惊喜?nGtt

我定义查找的问题正确定向 -multicoloringt一些图的G ^ = V ê 作为查找多色功能Ç V PC ^ 这是适当的,其中Ç是某组 “颜色”(即| C ^ | = )和PC ^ 是功率设定的ç(即该组的所有子集的çG=(V,E) c:VP(C)Ct|C|=tP(C)CC)。多色的功能是正确的,当且仅当每一个边缘ü v Ë,我们有Ç ü Ç v (uv)Ec(u)c(v)

我声称购物旅行问题等同于确定相同图形的有向彩t存在的问题。 ģG

证明:如果我们有一个适当的定向 -multicoloring为,在那里我们重新命名的颜色,使得然后考虑该序列的跳闸,其中一个当且仅当顶点在旅行购物。然后,对于每个边,由于,所以存在一个行程,使得和。因此,行程Ç ģ c ^ = { 1 ... } Ť 1... Ť v Ť Ç v Û v Ë Ť Ü Ť v Ť Ç Û ç v Ť tcGC={1,,t}tT1,,TtvTiic(v)(uv)ETiuTivTic(u)c(v)Ti 足以购买所有礼物。

如果我们有行程,则在颜色集上构造多色函数,使得。然后,对于每一个边缘,存在一个行程使得和(因为可以买本为一些跳闸),这意味着,和,因此。Ť 1... Ť Ç Ç = { 1 ... } Ç Û = { Ñ | ü Ť } Ú v Ë Ť Ü Ť v Ť Ü v Ç Û Ç T1,,TtcC={1,,t}c(u)={iN|uTi}(uv)ETiuTivTiuvic(u)v Ç Û Ç v ic(v)c(u)c(v)

找到合适的有向色着色基本上是对色特定情况的一种怪异的重新表述。因此,我可以显示着色问题的多项式时间减少:给定无向图,首先将该图转换为有向图,使得和且仅当或(换句话说,我们将无向边更改为两个有向边。ķ tk/ 2 ģ'=V'È'ģ=VêV=V'ÚvÈÛvÈ'vÛË'(tt/2)G=(V,E)G=(V,E)V=V(uv)E(u,v)E(v,u)E

考虑最大集合,使得不存在,,因此。的所有子集的集合,大小为,其中,就是这样一套。因此,此类子集的最大大小为。ķ PÇ 一个b ķ 一个b 一个b ç / 2 = | C | KP(C)a,bKababCt/2t=|C|/ 2 (tt/2)

如果对于存在适当的多色,则存在一种适当的着色,其使用的来自(*)的不相等元素,因此这是有效的 -为着色。ģ tG/ 2 PÇ(tt/2) P(C) / 2 ģ'(tt/2)G

如果对于存在适当的着色,则存在一个集合,,使得并且,中不存在任何,因此。因此,具有适当的有向多色。/ 2 ģ'ķPC ^| C| =t| K| t(tt/2)GKP(C)|C|=t/ 2 一个bķ一个b一个bģ|K|(tt/2)a,bKababGt

因此,这是从着色到行程的当前购物问题的有效多项式时间减少,这意味着当前的购物问题是NP难的。请注意,当前的购物问题是NP完全的,因为我们可以轻松地验证给定的最多次旅行清单是否可以使我们购买所有礼物而不会破坏惊喜。/ 2 (tt/2)tt


(*):如果某些多色比最大的“非子集”多色使用更多的颜色集,我们可以“重命名”这样它是的超集。保持适当的,因为没有一个元素从相邻于从一个不同的元素是一个问题,并且没有颜色组被相邻-其他在原始。因此,在不失一般性的前提下,我们可以假定。c ^ c ^ * c ^ c ^ * c ^ c ^ * c ^ * c ^ c ^ *ÇCCCCCCCCCC

然后,注意'改名'到的任何子集不会破坏颜色集节点之间的边缘,因为包含作为另一个子集的元素。剩下的唯一事情就是确保和之间的边缘不会“破坏”着色。CCCCCCCCCCCCCCCCCC

考虑以下关系在上的颜色集:两种颜色集和被连接,当且仅当存在一对顶点,使得具有颜色设定和颜色集合和。此关系可以由无向图。ř ÇÇ *一个b 一个b b Ë ģ = çÇ *- [R RCCABa,baAbB(a,b)EG=(CC,R)

首先,我们可以通过用单个颜色集替换中没有边的任何对来'减少'。着色是正确的,因为将根本不相邻的两个色集更改为相同的颜色不会引入任何无效的边缘。结果,我们将简化为一个完整的图。CCG GCCGG

这意味着如果与具有较少或相等的颜色集,则存在所需的颜色。否则,由于是最大的“非子集”集,因此根本不存在正确的多色设置,因此我们无法为该集团着色。因此,必然存在所需的多种颜色。G | C * | C *G|C|C


作为对完全图节点是颜色能够当且仅当我们至少有颜色,我们有人可以去对方逛街呈现跳闸当且仅当。这尤其意味着,如果,则仅进行次跳闸就足够了。如果要购买的礼物较少,则不需要更多的旅行,因此这是每种解决方案的普遍上限。n K n n n t tnKnnnt/ 2 ÑÑ1287016(tt/2)nn1287016


下面是我较早的“答案”,它给出了一种启发式算法,该算法不能保证获得最优值,但是可以在多项式时间内进行计算。

解决此问题的另一种方法是,针对具有节点的某些有向图,在分区上找到二部图的覆盖,因此分区(即行程)的数量(此处)最小。C = { S 1T 1S mT m} S iT iG n mC={(S1,T1),,(Sm,Tm)}(Si,Ti)Gnm

首先,一些观察,部分来自其他答案:

  • 贪婪策略选择了一个且带有二分图的图,其中与共有的边的数量最大,这并不会导致最优解(一个很强的反例是具有节点的完整图,无论选择了哪个最大二部图,该策略都会失败。)S iT iG 6(Si,Ti)G6
  • 对于任意非循环图,贪婪策略不是最佳选择,请考虑以下图: 硬非循环 对于和,二部图都删除了边,但仅是最佳的。小号 = { 3 5 6 } š = { 1 3 6 } 4 { 3 5 6 }Si={3,5,6}Si={1,3,6}4{3,5,6}
  • 任何(最佳)贪婪算法都不能比分区“删除” 的周期数(任何大小)更喜欢所选分区的大小。要看到这一点,请考虑具有节点的图,其中有一个节点的周期,并且该周期中的每个节点都具有额外的输出边缘,朝向其他节点没有输出边缘(请参见下图)的示例)。倾向于在长度为循环中最大化边的数量的贪婪选择将在第一次行程中发送循环中的所有顶点。这是次优的,因为它不会删除循环的任何边沿,而只是忽略n + 2 n 2 2 A B n = 4 n A B A Bn+2n22A,Bn=4nA,B并且从循环中删除所有边沿也会同时删除朝向所有边沿。因此,任何优先选择分区大小而不是删除循环的贪婪选择都不是最佳选择。A,B
    4周期

基于这些观察,我提出以下贪婪选择:挑选这样,即,此行从“中移除了”循环的量是最大的,并且在联系的情况下,选择一个与最大重叠分区之间他们(即不看周期的边缘)。S iT iG G(Si,Ti)GG

由于此算法与非循环图上的“基本”贪心策略(在每次旅行中删除最大数量的边)没有什么不同,因此该贪心算法不是最佳的。但是,删除循环的直觉仍然有意义,并且是对基本贪婪策略的改进,因此它可能是不错的启发式方法。


1
您声明“如果存在多重着色,则该着色使用的不多于不相等元素”。这句话是错误的。在3个不节点的简单示例中存在2色,其中。这是一种适当的2色着色,使用了多于不同的元素。您的意思是说“如果存在色,则这样的着色只使用ģ tG/ 2 PC ^一个bc ^vv={1}vb={2}vC ^={12} 2(tt/2)P(C)a,b,cvv(a)={1},v(b)={2},v(c)={1,2}1 =2G t(21)=2tG/ 2 PC ^(tt/2)不等元素“?P(C)
Riley

确实,这就是我的意思。另一种看待它的方法是,如果它是最小的 t多色(即,该不是多色的),则它完全使用元素。显然,您提供的示例不是正确的重新制定的反例。G t 1 tG(t1)/ 2
离散蜥蜴

不用了 它不完全使用元素,但最多使用。/ 2
离散蜥蜴

我可以理解该修改后的陈述具有直觉的意义,但是您可以证明这一点吗?也许您可以以某种方式表明,任何“ t多色”都可以“得到改善”,以便所有多色是满足大小要求的某个集合元素,并且不存在使得。ķ 一个b ķ 一个b
莱利

@Riley我不确定您的意思,您想让我详细说明哪个声明?我已经更新了我的答案,以使其说明您的原始评论建议。其余证明不受影响。至于多色和原始色问题的关系,关键思想是可以将多色视为不具有相邻的“子集”。由于的最大“非成对子集”子集的大小为,因此我们最好将该集合视为颜色集,然后得到着色问题。PC t/ 2
离散蜥蜴

2

我可以看到如何将这个问题减少为Graph Coloring,它为您提供了一个解决问题的工具(针对小型实例!),但还没有如何在另一个方向进行减少(这将建立NP硬度)。

基本思想是建立一个图形,其中包含每个购买的顶点,以及在同一行程中不可能发生的任何两个购买之间的边;然后,我们希望将购买分组为最小数量的组(“行程”),以使同一组中的两个购买不会冲突。具体来说,如果是原始有向图,其中边缘指示人需要购买人礼物,则创建无向图,其中有一个顶点对于每个边缘在和(无向)边缘每当G = V E u v u v H = X Y x u v u v G x u v x v w u v v w G v w v H H和均为(有向)边(如果在旅行中购买了的礼物,那么在同一旅行中没有人可以购买的礼物)。的顶点着色是将必要的购买量(顶点)划分为不冲突(共享边)的行程(颜色),并且最小尺寸的顶点着色需要最少的行程。

通过将还原度从3SAT改成图着色,例如,可以向另一个方向发展(减少图色或其他NP-hard问题,从而确定其NP-硬度)。详见Jeff Erickson笔记第10页),但我自己没有尝试过。


这个答案很棒。这正是我想要的。在分析该算法的时间复杂度时,最多有个顶点(表示)和边。当我查找图形着色的算法时,对于具有个顶点的图形,我发现的全部是。在这种情况下,是否存在更有效的算法,因为边数上有多项式上限?n 2n 2 n 3 n 2n 2 O2nnn
莱利

1
@Riley 对于最大度数为的图,确定着色性可能不是NP-hard。看到这些[讲义](www-sop.inria.fr/members/Frederic.Havet/Cours/coloration.pdf),用于从3-SAT还原以图表最大度3ķ ķ 3 3
离散蜥蜴

@离散蜥蜴:他们在那些讲义中的哪一个减少了?

为什么接受此答案?据我所知,它既没有显示NP硬度,也没有显示“最佳”算法甚至是高效算法。
离散蜥蜴

1
@Discretelizard好的。我认为这个问题并不意味着我正在寻找P时间算法,特别是考虑到该问题是NP问题的可能性。但是我可以在原始问题中更明确地指出这一点。我将取消此答案的正确性标记,并添加100分的赏金(如果在同一问题上,第二个奖励必须为100分,但我愿意提供它,因为它们只是虚构的Internet分,对吗? :))再次向任何可以证明这个问题是NP-hard的人,或者找到可以解决该问题的多项式时间算法。
莱利

0

如果老板要求我实施一种确保在合理的时间内找到最佳解决方案的算法,我会非常担心这种问题。

找到一个不一定最佳的解决方案:给定要购买的人群和礼物,我们可以计算出一群人在一次购物旅行中可以购买多少礼物。因此,从一个空的组开始(可以购买0个礼物)。对于不在组中的每个人,确定将该人添加到组中可以购买多少礼物。如果在不减少礼物数量的情况下可以增加任何人,请随机选择一个将购买的礼物数量增加最大的礼物,直到增加任何人将减少购买的礼物数量。然后进行购物之旅,并从头开始直到购买完所有礼物。

我重复了几次,以“随机”挑选其他人,以防找到更好的解决方案。

在该示例中,五个人必须互相购买礼物,这在四次旅行中找到了一个最佳解决方案。如果我们不增加旅行人数而又不改善礼物数量的情况下进行旅行,那么我们将有5次旅行。6人需要5趟旅行。


因此,换句话说,您正在根据要购买的礼物数量来贪婪地选择购物旅行。您能否证明此程序必然导致购物次数最少?如果是这样,您就错误地通过了6个人的示例。6人只需要进行4次购物行程:。{ { 1 2 3 } { 1 4 5 } { 2 4 6 } { 3 5 6 } }
莱利

绝对没有证据。贪婪算法+做出不同的随机选择会稍微提高您的机会,但不会进行4次旅行。
gnasher729

我已经测试了这个问题是贪婪的说法,但是失败了。即使您测试了所有可能的购物旅行,而不是一个一个地添加人,您仍然会获得5次旅行:。贪婪的方法希望第二次购物旅行购买9份礼物,但是在最佳解决方案中,第二次购物旅行购买8份礼物(假设它按照上面列出的顺序进行)。{{1,2,3},{4,5,6},{1,4},{2,5},{3,6}}
莱利

实际上,贪婪方法甚至无法解决4个购物行程中5个人的情况:。{{1,2},{3,4},{5},{1,3},{2,4}}
莱利

-1

假设您根据他们从(父母)那里接收的人以及他们给(孩子)的人来对人们排序。由于每个人都赠送一份礼物并收到一份礼物,因此父子功能是一对一的。

您永远不想将父母和孩子放在同一个组中。您从一个随机的人p 1开始,并相应地每个人进行排序,因此c h i l d p 1= p 2,依此类推。将所有p o d d放在一个组中,将所有p e v e n放在另一个组中。对于最后一个人p n = p a r e n t p 1,所以您不希望此人与p 1处于同一组。如果n为偶数,则不成问题。否则,您需要一个额外的组,在最简单的情况下,其本身可以只是p n

该算法假定每个人都已连接。但这不是必须的。如果存在多个断开的循环,换句话说,如果在某个时刻,p k = p a r e n t p 1其中k = n,然后按照相同的算法完成该圆并从一个新圆开始。只要您不合并同一周期的几率和偶数,就可以合并未连接的周期。

该算法以最多2轮(对于偶数n)和3轮(对于奇数n)结束。


似乎这种方法仅解决了以下情况:每个人都给出一个礼物并接收一个礼物的情况,即图表是一个排列。我不确定这个问题只想问那个特殊情况-让我们看看操作员对此有何评论。
DW

这是真的,我的解决方案是对于该问题的一个子情况下˚F 一个Ñ _ Ñ v = ˚F 一个Ñ _ Ô ù v = 1
ilke444 '17

是的,我并不是专门要求排列。请参阅更新后的问题,在此我需要澄清几件事。
莱利
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.