如何解决复杂调度的启发式
最近我一直在玩的一个副项目是尝试 调度问题的广义算法。我觉得这很有趣,因为我相信它可以在根本上更复杂的环境中有效地寻路。
到目前为止,我已经实现了 depth-first-search 来解决这个问题。
唯一的问题是... O'notation 太可怕了 (my question in math exchange about it)(a desmos illustration):
(t_{m,n}
与 O(m,n)
同义)
其中 n
是任务数量(例如旅程),m
是代理数量(例如出租车)。
我在添加基本启发式方面做了一些工作,该启发式大大限制了探索的路径数量。
有 8 个任务和 5 个代理,通过阻止探索某些路径,在这些路径中,第一条边的移动时间超过给定时间,我可以限制任务产生这样的结果:
Hello,world!
time: 03:874
edges:
max: 19,237,093,440
actual: 7,838,526
inline: 7838526
%: 0.040747
min_time: 1954.00
给定 8 个任务和 5 个代理,图中有 192.3 亿条可能的边,限制导致我们只能探索/构建其中的 783 万条。
虽然只需要探索 0.04% 的可能性似乎不错,但 O'notation 太糟糕了,这还不够好。
正如在 desmos 插图中所见,即使只有少量的代理和任务,我们的 O'notation 也能击败所有其他人,除了 O(n!)
和 O(2^n)
(蓝色 = 阶乘,红色 = 指数,大多数显着的黑色虚线代表 n=6
和 m=x
):
当我们增加 n
或 m
时,这种情况会呈指数级恶化,因此我们需要一个大规模限制性的启发式方法,能够将 O'notation 压缩到至少 O(n^2)
以实现任何实用性。目前需要手动调整规模,限制不够。
此处的启发式方法是在以下情况下不探索路径:
d > 2.5 * SIZE / NUM_OF_AGENTS
。
地点:
-
d
是特定代理开始特定任务所需的时间/距离(例如出租车移动到上车地点进行旅程或将内存传递给 GPU 的时间) -
SIZE
是最大时间/距离d
的一半。 -
NUM_OF_AGENTS
代码中代理数量的常量 (m
)。
因此,我的最终问题是,对于这个问题,什么是更好的启发式方法? (如果你知道它们,甚至是完整的方法)
- The code
- 对于任何复杂/有趣的问题,我永远不确定最好在哪里问他们,这是我所知道的最好的问题,如果您发现任何问题,请发表评论,我会尽力解决。
- 值得一提的是,这里遗漏了一个概念,即如何将此类调度视为通过多维空间进行寻路,然后可能更容易应用传统算法,我还没有真正尝试或弄清楚如何做到这一点。如果您这样做,我将不胜感激。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。