【发布时间】:2017-06-29 10:34:24
【问题描述】:
我目前正在研究一种算法来安排 pub-crawling(虽然它可以更通用地应用)。 这是众所周知的:
- 有一定数量的队伍和酒吧,队伍的数量 永远不要超过酒吧的数量
- 团队必须参观所有酒吧
- 团队不能同时在同一个酒吧
- 整个过程是暂时的;团队在酒吧爬行的开始和结束时间之间的相同离散时间间隔内位于酒吧。
我认为这是旅行推销员问题和一些花名册计划之间的混合体,但现在我尝试使用蛮力来实施它,因为我不知道如何实施上述混合体。我期望的结果可能是这样的:
蛮力正在起作用,但它太慢了。当所有行和列都是唯一的时,就会找到一个解决方案——就像数独一样。然后可以将这些数字映射到特定酒吧的时间间隔/到达和离开时间。 我正在寻找想法和建议,但也非常欢迎实现(C#)。
目前我正在强制执行以下操作:
- 初始化二维数组,其中行数与团队数相同,列数与条数相同。这些值也被初始化为 1 列。
- 检查数组是否是解,如果不是:随机排列数组并再次检查。
最后,我需要提到的是,当这可以足够快地完成时,将会引入一层复杂性。为特定团队选择的路线必须是最佳路线,这意味着所有团队都必须在旅行时间方面采取最佳路线 - 为此,我将使用 Google Maps API。我猜如果算法的第一部分相对较快,那么距离优化可能是蛮力的。
期待创造性的解决方案!
【问题讨论】:
-
恐怕太宽泛了。
-
"随机排列数组并再次检查" => 随机性无助于迭代检查所有可能的组合。它引入了重复检查同一个数组的可能性;并且无论您是以逻辑顺序还是随机迭代它们,找到正确数组的机会都不会增加。因此,使用 RNG 会增加一个缺点,但不会增加任何好处。如果我是你,我不会那样做。
-
你为什么不简单地在每个时间步将职业移动一个呢?就像在你的桌子上一样?我没有看到任何禁止这样做的限制。也就是说,如果我忽略了某些东西,一种解决方案,虽然可能不是最好的,但是将其转换为线性优化问题(应该是可能的),然后使用一些已经存在的求解器。编辑:也就是说,当然是一个线性 整数 问题
-
@Aziuth 这显然是可行的,但是当引入在条之间寻找几乎最佳路线的需要时,这是不可能的 - 洗牌是必要的。
-
找到穿过酒吧的最佳(或几乎最佳)路线。然后在第一个小节(在解决方案中)开始第一个团队,在第二个小节开始第二个团队,等等,就像您在示例中所做的那样。基本上,在您确定最佳路径之后按照您的示例进行安排。
标签: c# algorithm brute-force traveling-salesman rostering