Python中的动态编程 - 最优序列

时间:2016-05-17 13:46:21

标签: python dynamic-programming

我正在尝试解决此问题,无法提出强大的解决方案。任何想法,伪代码或python实现将不胜感激。为简单起见,请考虑一个小矩阵,如图1所示。矩阵中的行代表天数,列代表分钟。我们可以假设公共汽车在两个点之间行进,需要10分钟,并且在每分钟由该单元格中的字母定义的特定单元处停止。鉴于历史模式(第1天至第5天),我们希望找到最佳的字母序列。为此,我们需要遵循某些规则:

  1. 我们希望选择每分钟最常观察到的字母间隔。如果有多个频率相同的字母,我们可以选择其中任何一个。
  2. 我们希望保持连续性。
  3. 我们希望尽可能保留原始序列。
  4. 我们不寻找最短的距离(最直线等)

    以下是几个例子: Figure 1 图1中的序列满足所有这些规则。突出显示的序列仅用于可视化目的。图1中还有其他可视化此序列的方法。

    Figure 2 图2中的序列是不连续的。因此,最常见的字母不能拼接在一起。出于这个原因,我们选择第3分钟中第二个最频繁的字母,其中一个是C,A,D而不是B.我们可以满足规则。但是,请记住,当使用365天以及100多分钟时,它会变得复杂。例如,使用第二个最频繁的字母可能导致重新连接序列的其余部分。

    任何指导都非常感谢。

1 个答案:

答案 0 :(得分:0)

这听起来像是一个相对简单的动态编程任务。

  • 从最后开始:最后一列中的每个单元格如果是最常用的字母则为0,否则为1。
  • 转到第二个最后一列。如果它是最频繁的字母或另外1个+ min(cell_above,cell_directly_right,cell_below),则每个单元格获得0。请注意您选择的单元格。
  • 重复直到你到达终点。
  • 现在,您将在第一列中拥有一个或多个具有最小值的单元格。按照您在步骤2中记下的单元格。
  • 您现在有一条从头到尾的路径,它是连续的,最小化sum([0 if cell.most_frequent else 1 for cell in cells])

您可能需要调整目标函数,例如最后一个频率和第二个最频繁的字母被视为相同。也许你想根据它们的频率给出一个分数。