我对以下问题的确切方法感到不满。 我写下来尽我所能解释它。
我们假设我烤比萨饼并提供10种不同的比萨饼。 我没有没有卡路里的零食,我的范围是1-10。
我从客户那里收到了10份订单。
假设1:为了节省时间,可以更有效地同时烘焙相同的订单(重复)。
假设2 *:如果我需要移动订单,则客户不应该被移动超过10个订单(或向上)
*我想将这个假设作为问题2分开,因为匈牙利方法可能会解决这个问题。
假设3:我需要跟踪我所做的更改,以防我需要更改单个订单。
让我们把披萨订单放在一个数组(或列表中,并不重要):
a = np.array([2, 8, 6, 4, 2, 3, 2, 1, 7, 5])
结果我正在寻找:
a
array([3, 8, 6, 4, 2, 2, 2, 1, 7, 5])
发生的事情是我把第一个订单换成了第六个。 所有其他订单都是独一无二的,所以这里无关。 我使用了一个简单的操作:
a[0], a[5] = a[5], a[0]
第二天我收到了50个订单。
b = np.random.random_integers(10, size=(50.))
b
array([ 4, 10, 5, 1, 1, 10, 8, 8, 10, 2, 4, 4, 5, 8, 3, 3, 7,
6, 2, 9, 5, 9, 6, 10, 9, 9, 4, 7, 10, 3, 2, 1, 4, 2,
8, 9, 10, 7, 5, 6, 8, 2, 5, 10, 2, 8, 6, 6, 7, 10])
第一个订单,根据规则,我可以与第10个订单交换,但不能与第13个订单交换(即使它们将同时生成)。
第二顺序更难。 如果我将它与第5个订单交换,则订单4和5将失去它们已经存在的效率。 如果我将第二个订单放在这里,订单7和8也是如此。 我可以将它与订单10交换,但我已经在第一次交换中做到了。
所以我想我需要在订单之间插入它。 我看到的方式,前12个订单应如下所示:
从:
[ 4, 10, 5, 1, 1, 10, 8, 8, 10, 2, 4, 4]
为:
[ 2, 10, 5, 1, 1, 10, 8, 8, 10, 4, 4, 4]
然后:
[ 2, 5, 1, 1, 10, 10, 8, 8, 10, 4, 4, 4]
或
[ 2, 5, 1, 1, 10, 8, 8, 10, 10, 4, 4, 4]
和最后:
[ 2, 5, 1, 1, 10, 10, 10, 8, 8, 4, 4, 4]
或
[ 2, 5, 1, 1, 8, 8, 10, 10, 10, 4, 4, 4]
但是,谈到所需的操作次数,我还可以将订单6和9与订单2结合起来。(需要两个动作,与上面的例子相同)。 两者都是很好的结果,但我会尝试将它与最接近的一对匹配在10号比萨饼的情况下。 在上面我需要三个动作才能得到我的结果。
我尝试了我能找到的每一种功能。 但是我希望用最少的原始版本来做到这一点。 按字典顺序排序并不能满足我的需要。 分组重复结果:
[[1, 1], [2], [4, 4, 4], [5], [8, 8], [10, 10, 10]]
是否存在这样的数组排序(或列表,字典等)? 我想我错过了一些明显或复杂的数学。 如果这是一个已知的数学问题,我想详细了解它。
如果它可以在numpy中完成,请考虑以上12/50为基础的数据示例(不需要订单但是为了排序测试而添加它):
dtype = [('Customer', 'S10'), ('Pizza', int), ('Order', int)]
values = [('Arthur', 4, 1), ('Lancelot', 10, 2),('Galahad', 5, 3),
('Peter A', 1, 4),('Bill', 1, 5),('Peter B', 10, 6),('Brad', 8, 7),
('Lorelei', 8, 8),('Brian', 10, 9),('Marissa', 2, 10),
('Lois', 4, 11),('Joe', 4, 12)]
a = np.array(values, dtype=dtype)
edit2:似乎我可以用这个开头:Checking for and indexing non-unique/duplicate values in a numpy array