到目前为止我最好的拍摄:
运载工具需要进行一系列交付(d 1 ,d 2 ,... d n ),并且可以以任何顺序这样做 - 换句话说,集合的所有可能的排列D = {d 1 ,d 2 ,... d n < / sub>}是有效的解决方案 - 但是特定的解决方案需要在路由器的一端离开基站之前确定(例如,想象包需要加载到车辆LIFO中)。
此外,各种排列的成本也不相同。它可以计算为d i -1 和d i 之间行进距离的平方和,其中d 0 被认为是基站,需要注意的是,任何涉及改变方向的部分都要花费3倍的成本(想象这是在铁路或气动管上进行,并且备份会破坏其他交通)。
鉴于交付集
D
表示为与基站的距离(所以abs(d
i-d
j { {1}}是两个交付之间的距离)和迭代器)
,它将连续产生每个排列,找到一个成本小于或等于任何其他排列成本的排列。
现在,从此描述中直接实现可能会产生如下代码:
permutations(D)
哪个是O(n * n!^ 2),例如非常糟糕 - 特别是与O(n log(n))相比,有洞察力的人会通过简单地排序D来找到。
我的问题:你能否提出一个看似合理的问题描述,这自然会导致粗心的人进入排序算法的更糟糕的(或不同的糟糕)实现?
答案 0 :(得分:6)
我假设你正在使用这个问题进行面试,看看申请人是否能在一个看似复杂的问题中注意到一个简单的解决方案。
[这个假设不正确 - MarkusQ]
你提供的信息太多了。
解决这个问题的关键是要意识到这些点在一个维度上,并且只需要排序。为了使这个问题更加困难,尽可能地隐藏这个事实。
最大的线索是距离公式。它引入了改变方向的惩罚。我想到的第一件事就是尽量减少这种惩罚。为了消除惩罚,我必须在某个方向订购它们,这种排序是自然的排序顺序。
我会删除改变方向的惩罚,这太过于放弃了。
另一个主要线索是算法的输入值:整数列表。为他们提供一个排列列表,甚至是所有排列。这使他们认为实际上可能会预期O(n!)算法。
我会将其称为:
给出所有可能的列表 n个交付地点的排列, 每个交付的排列 (d 1 ,d 2 ,..., d n )的成本由:
定义
返回排列P这样的 P的成本小于或等于任何 其他排列。
所有真正需要做的就是在第一个排列中读取并对其进行排序。
如果他们构建一个单独的循环来比较成本,请询问他们算法的大运行时间,其中n是交付地点的数量(另一个陷阱)。
答案 1 :(得分:2)
这不是一个直接的答案,但我认为需要进一步澄清。
d i 是否允许为负?如果是这样的话,就我所见,仅靠分类是不够的。
例如:
d
0 = 0
deliveries = (-1,1,1,2)
在这种情况下,最佳路径似乎是1 > 2 > 1 > -1
。
编辑:这实际上可能不是最佳路径,但它说明了这一点。
答案 2 :(得分:1)
首先找到最佳解决方案,你可以改写它,
“给我一个证据,证明以下信念对于以下规则是最优的,其中最优意味着所有阶段成本总和的最小数字,考虑到所有阶段(A..Z)
需要只出现一次。
Convination:
A->C->D->Y->P->...->N
阶段费用:
A->B = 5,
B->A = 3,
A->C = 2,
C->A = 4,
...
...
...
Y->Z = 7,
Z->Y = 24."
应该让某人忙碌一段时间。
答案 3 :(得分:1)
这让我想起了Knapsack problem,而不仅仅是旅行推销员。但是Knapsack也是一个NP-Hard问题,因此如果你将问题与背包相关联,你可能会欺骗人们使用动态编程来思考一个过于复杂的解决方案。基本问题在哪里:
可以达到至少V的值 不超过重量W?
现在问题是一个相当不错的解决方案可以找到当V是唯一的,你的距离,如下:
每种类型的背包问题 项目j具有不同的值 重量单位(vj = pj / wj)是 被认为是最容易的 NP完全问题。确实是经验性的 复杂度大约为O((log n)2)和非常大的问题可以 很快就解决了,例如,在2003年 解决所需的平均时间 n = 10,000的实例低于14 毫秒使用商品个人 计算机1。
所以你可能想说几个停止/包可能共享相同的vj,邀请人们考虑真正难以解决的问题:
然而在 堕落的多件物品 共享相同的值vj它变成了 极端困难得多 vj =常数的情况 具有复杂性的子集和问题 O(2N / 2N)。
因此,如果你将每个值的权重替换为每个值的距离,并说明几个距离可能实际上共享相同的值,退化,一些人可能会陷入这个陷阱。
答案 4 :(得分:0)
这不仅仅是(NP-Hard)Travelling Salesman Problem吗?你似乎不太可能让它变得更难。
或许可以解决问题,以便实际的算法不清楚 - 例如通过将这些路径描述为单轨铁路线,这样人们就不得不从领域知识推断出回溯成本更高。
如何以某种方式描述问题,以致有人试图进行递归比较 - 例如“你可以通过使用最佳(迄今为止)结果的最佳最大子集来加速算法吗?”
顺便说一句,这是什么目的 - 这听起来像是试图折磨受访者。答案 5 :(得分:0)
您需要更清楚地了解送货卡车是否必须返回基地(进行往返)。如果卡车 返回,那么简单的排序不会产生最短的路线,因为从最远点到基地的返回的平方成本太高。在“退出”的路上缺少一些啤酒花并且在回来的路上使用它们变得更便宜。
如果你欺骗别人一个坏的答案(例如,不给他们所有的信息),那么他们的愚蠢或欺骗是否导致了它?
如果他们不注意自我的谎言,智慧人的智慧有多大?