可以使用哪种算法来解决这个问题?

时间:2011-04-23 02:17:53

标签: algorithm language-agnostic

编辑:只是为了确保某人没有突破问题...我不是在寻找最佳的最佳算法。一些有意义的启发式很好。

我之前尝试过制定这个,并意识到我没有做得很好,所以我删除了这个问题。在制定我的问题时,我又采取了一些措施。请随意提供任何可以帮助我改进的建设性批评。

输入:

  • N人
  • k我可以发布的公告
  • 可以听到我的声音的距离(例如5米),即我可以决定是否宣布,取决于这5米内的人数

目标:

  • 最大限度地提高听到我公告的人数,并(可选)最大限度地缩短宣布所有公告的时间

约束:

  • 一旦有人听到我的公告,他就会从总数中删除,即如果他听到我的第一次公告,即使他听到我的第二次公告,也不算他,
  • 我可以看到同一个人以及我附近的同一群人

示例: 让我们考虑一下编号从1到10的10个人以及下面的到达模式:

  • 时段1:1(支付= 1)
  • 时段2:2 3 4 5(支付= 4)
  • 时段3:5 6 7 8(如果先前没有在时段2中发布公告,则支付= 4;如果在时段2中发布公告,则为3)
  • 时段4:9 10(支付= 2)

我将收到两份公告。现在,如果我是一个神谕,我会选择时间段2和时间段3,因为那时会有7个人听到(因为5个已经在时隙2中听到我的声明,我不再考虑他了)。我正在寻找一个在线算法,它将帮助我做出是否发布公告的决定,如果是的话,根据哪些因素做出决定。有没有人对可用于解决此问题的算法或此问题的更简单版本有任何想法?

3 个答案:

答案 0 :(得分:2)

应该有一种依赖于最大流算法的方法。从本质上讲,您试图从start-> end推送最大数量的消息。虽然它是多维的,但你可以有一个超级接收器,它连接到t的每个值,然后让t的每个值连接到你此时可以达到的人,然后有一个超级接收器。这样,您只需计算最大流量(添加的约束不超过k个呼叫,这应该可以通过一些动态编程来解决)。这是一种非常肮脏的方法来解决它,但它应该确定性地完成工作而不使用启发式方法。

答案 1 :(得分:1)

我不知道有没有办法解决这个或算法,就像你制定它一样。

看起来基本上你正试图通过2个公告来达到最大数量的人。但是,如果事先不知道有关人群的任何信息,你就不能真正做出任何关于是否使用你的第一个公告的明智决定。你的第二个至少有一个好处,知道什么时候不被使用(即如果该组没有新成员,那么你可以知道它不值得浪费公告)。但它仍然存在基本相同的问题。

解决此问题的唯一真正方法是使用有关数据类型或所需结果的知识进行猜测。如果您知道群体平均100人的标准差为10,那么您可以拒绝宣布是否存在少于90人。或者,如果您知道需要通过两次公告才能达到至少100人,您可以选择永远不会一次宣布少于50人。显然,如果实际数据不符合您的预期,那些方法就永远不会发布。但这总是有风险,因为无论你做什么,你都可以在第一组中获得1个人,然后在所有其他组中获得0个。

或者,您可以尝试更清楚地定义问题,我很难弄清楚如何将其与计算机联系起来。

答案 2 :(得分:1)

让我们开始尝试解决问题的最简单的变体:让我们假设N个人和K个时间段,但只有一个可能的公告。让我们假设每个人只会留一个时间段,并且每个尚未出现的人都有可能出现在任何未来的时间段。

鉴于这些简化,您可以在每个时间段查看在当前时段公布的收益,并与未来具有更高收益的时段进行比较,例如,让我们假设有4个人有3个时段:

时间段1:人1出现,所以你知道你可以通过宣布获得1的回报,但是你有3个人出现在剩余的2个时隙中,所以至少有一个时段保证有2个人们,所以不要宣布..

因此,在每个时间段,您可以通过将剩余的(N)个人和(K个)时隙视为N个独立的随机数,每个时间段从1 ...开始,计算后一个时隙的回报率高于当前时间的几率。 ,并计算至少一个值k被击中的机会大于或等于当前支付时间。 (类似于生日问题,但是对于超过1次碰撞而言)然后你需要根据预期的差异来决定多大的折扣。 (手中的鸟等)

将此解决方案概括为原始问题留给读者练习。