- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个问题要解决。
问题陈述:
我有大约 5000 家商店的地理坐标。每家商店都必须访问一次,以便从商店收集订单收据。
这将由销售人员完成。
我想生成 N 个优化的旅程计划,这样每个销售人员都能覆盖最多 no. 8 小时内的商店。
即在旅程计划中,参观所有商店所花费的时间不应超过 8 小时。
并且任何两个推销员都不应访问同一家商店。
即在另一个旅程计划中不应再次访问一家商店。
在这种情况下,No. of journey plans generated 间接等于 no。需要销售人员。
需要最终结果:
尽量减少编号。覆盖所有门店的行程计划
我有什么:
商店到商店的距离矩阵。每个商店之间都有距离和时间
挑战:我没有关于推销员的任何信息(即我没有他们的地理位置),因此很难为每个旅程计划选择起点。
我的初步想法:
我想通过聚类的方式把门店划分到不同的区域。然后为每个集群制定旅程计划(优化路线)。
我将在 python 中开发它。
关于什么是尝试和处理此类问题的最佳方法的任何想法。
最佳答案
这里有一个启发式的想法:
s1
和 s2
, 时间成本为 t
.a1
和 a2
这样他们的路径开始或结束于 s1
和 s2
.如果找不到这样的一对(因为商店已经在现有路径的中间,或者 s1
和 s2
是一个销售员路径的起点和终点),则丢弃链接并返回到 2。 t_sum
是 a1
花费的时间总和, a2
花费的时间和 t
.如果t_sum
小于最大时间T
每个推销员可以花费(8 小时),丢弃链接并返回到 2。a1
和 a2
变成一个销售员。此过程根据具体情况略有变化,但应该是相当微不足道的。例如,如果 a1
结束于 s1
和 a2
开始于 s2
你可以直接连接它们的路径,但是如果a1
开始于 s1
和 a2
开始于 s2
那么你将不得不(例如)反转 a1
的路径然后连接它们。新业务员的花费时间为 t_sum
.这是基本思想。有一些空间可以决定确切使用什么数据结构,影响你如何寻找下一个最短链接,你如何寻找a1
。和 a2
以及如何跟踪覆盖/丢弃的链接。您还可以包括许多改进或优化:
a1
和 a2
, 您可以丢弃所有指向 s1
的链接和 s2
除非它们是 a1
路径中的唯一元素或 a2
.例如,如果我正在查看商店之间的链接 1
和 2
我正在合并路径 [1, 3, 4]
和 [2]
(导致 [2, 1, 3, 4]
或 [4, 3, 1, 2]
),我可以删除所有剩余的商店链接 1
,因为现在它在一条路径的中间,但不是来自 2
,因为它仍然在合并路径的一端,因此可以连接。a1
和 a2
, 如果 T - t_sum < t
那么这个推销员将不可能再被合并(因为每个剩余链接的成本至少是 t
),所以你可以“关闭”路径,这意味着你可以丢弃每一端的链接,如果这样的话节省你的时间(取决于具体的实现),你可以跳过a1
和 a2
在第 3 步的下一次执行中搜索时。T
之间的差异并且任何当前“事件”代理的剩余时间都小于最后一个值 t
,如果是这种情况,则“关闭”它。编辑:
这是一个 Python 概念证明。我避免使用 NumPy 或任何其他外部包,尽管由于该算法主要是迭代的,我不确定您是否可以让它更快。
def make_journeys(dists, max_dist):
n = len(dists)
ds = sorted((dists[i][j], i, j) for i in range(n) for j in range(i + 1, n))
starts = list(range(n))
ends = list(range(n))
salesmen = [([i], 0) for i in range(n)]
for d, i, j in ds:
if starts[i] is not None and starts[j] is not None:
si, sj = starts[i], starts[j]
reverse_i, reverse_j = True, False
elif starts[i] is not None and ends[j] is not None:
si, sj = starts[i], ends[j]
reverse_i, reverse_j = True, True
elif ends[i] is not None and starts[j] is not None:
si, sj = ends[i], starts[j]
reverse_i, reverse_j = False, False
elif ends[i] is not None and ends[j] is not None:
si, sj = ends[i], ends[j]
reverse_i, reverse_j = False, True
else:
continue
if si == sj:
continue
(pi, di) = salesmen[si]
(pj, dj) = salesmen[sj]
dt = d + di + dj
if dt > max_dist:
continue
starts[pi[0]] = None
ends[pi[-1]] = None
starts[pj[0]] = None
ends[pj[-1]] = None
if reverse_i:
pi = list(reversed(pi))
if reverse_j:
pj = list(reversed(pj))
pt = pi + pj
starts[pt[0]] = si
ends[pt[-1]] = si
salesmen[si] = (pt, dt)
salesmen[sj] = None
return [s for s in salesmen if s]
该函数返回一个元组列表,其中包含带有商店 ID 的路径和旅程的总时间。这是一个测试:
def random_symmetric(N, min, max):
# Build a random symmetric matrix
dists = [[random.randint(1, 9) if i != j else 0 for j in range(N)] for i in range(N)]
return [[(dists[i][j] + dists[j][i]) // 2 for j in range(N)] for i in range(N)]
random.seed(100)
# This takes long!
distances = random_symmetric(5000, 1, 9)
max_distance = 100
journeys = make_journeys(distances, max_distance)
print('{} journeys computed.'.format(len(journeys)))
输出:
50 journeys computed.
在上面的测试中,生成随机距离矩阵需要相当长的时间(使用 NumPy 会快得多)。调用make_journeys
在我的电脑上花了大约 16 秒。显然是 YMMV,但它不会运行数小时或数分钟。
关于algorithm - 优化旅程计划规划,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49316298/
比较代码: const char x = 'a'; std::cout > (0C310B0h) 00C3100B add esp,4 和 const i
您好,我正在使用 Matlab 优化求解器,但程序有问题。我收到此消息 fmincon 已停止,因为目标函数值小于目标函数限制的默认值,并且约束满足在约束容差的默认值范围内。我也收到以下消息。警告:矩
处理Visual Studio optimizations的问题为我节省了大量启动和使用它的时间 当我必须进行 J2EE 开发时,我很难回到 Eclipse。因此,我还想知道人们是否有任何提示或技巧可
情况如下:在我的 Excel 工作表中,有一列包含 1-name 形式的条目。考虑到数字也可以是两位数,我想删除这些数字。这本身不是问题,我让它工作了,只是性能太糟糕了。现在我的程序每个单元格输入大约
这样做有什么区别吗: $(".topHorzNavLink").click(function() { var theHoverContainer = $("#hoverContainer");
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: What is the cost of '$(this)'? 我经常在一些开发人员代码中看到$(this)引用同一个
我刚刚结束了一个大型开发项目。我们的时间紧迫,因此很多优化被“推迟”。既然我们已经达到了最后期限,我们将回去尝试优化事情。 我的问题是:优化 jQuery 网站时您要寻找的最重要的东西是什么。或者,我
所以我一直在用 JavaScript 编写游戏(不是网络游戏,而是使用 JavaScript 恰好是脚本语言的游戏引擎)。不幸的是,游戏引擎的 JavaScript 引擎是 SpiderMonkey
这是我在正在构建的页面中使用的 SQL 查询。它目前运行大约 8 秒并返回 12000 条记录,这是正确的,但我想知道您是否可以就如何使其更快提出可能的建议? SELECT DISTINCT Adve
如何优化这个? SELECT e.attr_id, e.sku, a.value FROM product_attr AS e, product_attr_text AS a WHERE e.attr
我正在使用这样的结构来测试是否按下了所需的键: def eventFilter(self, tableView, event): if event.type() == QtCore.QEven
我正在使用 JavaScript 从给定的球员列表中计算出羽毛球 double 比赛的所有组合。每个玩家都与其他人组队。 EG。如果我有以下球员a、b、c、d。它们的组合可以是: a & b V c
我似乎无法弄清楚如何让这个 JS 工作。 scroll function 起作用但不能隐藏。还有没有办法用更少的代码行来做到这一点?我希望 .down-arrow 在 50px 之后 fade out
我的问题是关于用于生产的高级优化级联样式表 (CSS) 文件。 多么最新和最完整(准备在实时元素中使用)的 css 优化器/最小化器,它们不仅提供删除空格和换行符,还提供高级功能,如删除过多的属性、合
我读过这个: 浏览器检索在 中请求的所有资源开始呈现 之前的 HTML 部分.如果您将请求放在 中section 而不是,那么页面呈现和下载资源可以并行发生。您应该从 移动尽可能多的资源请求。
我正在处理一些现有的 C++ 代码,这些代码看起来写得不好,而且调用频率很高。我想知道我是否应该花时间更改它,或者编译器是否已经在优化问题。 我正在使用 Visual Studio 2008。 这是一
我正在尝试使用 OpenGL 渲染 3 个四边形(1 个背景图,2 个 Sprite )。我有以下代码: void GLRenderer::onDrawObjects(long p_dt) {
我确实有以下声明: isEnabled = false; if(foo(arg) && isEnabled) { .... } public boolean foo(arg) { some re
(一)深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(no
一、写在前面 css的优化方案,之前没有提及,所以接下来进行总结一下。 二、具体优化方案 2.1、加载性能 1、css压缩:将写好的css进行打包,可以减少很多的体积。 2、css单一样式:在需要下边
我是一名优秀的程序员,十分优秀!