将物品(光纤终端)分组到最适合容器(光纤缓冲器)的算法

时间:2013-06-07 19:45:00

标签: algorithm grouping

我有一个有序列表,表示光纤电缆上的终端,每个终端都有多个端口(例如4,8,12)。给定光纤电缆,为每个端子端口提供不同的光纤束。电缆可包含144根纤维束,编号为1-144,每组12根纤维。我想将光纤束分配给终端端口,这样在任何一个终端我都不需要从多个组接入光纤。我想尽可能地按照终端的顺序分配光纤。我想尽可能避免使用未使用的纤维束。

例如,如果我有端口A,B,C,D,E,F,各自的端口大小为12,8,12,6,6,12,我希望算法产生结果A(1- 12),B(49-56),C(13-24),D(25-30),E(31-36),F(37-48)

有人可以提出理想的算法吗?

1 个答案:

答案 0 :(得分:1)

问题是bin packing有订购方。单独的Bin打包是NP难的,因此我要建议的精确算法的运行时间不是多项式的。希望它无论如何都会有用。

第一步是生成所有可能的组。这是一些Python来证明我的意思。

def allgroups(terminals, fibrecount=12, groupsofar=[]):
    if terminals:  # is nonempty
        terminal = terminals.pop()  # last element
        if terminal.portsize <= fibrecount:
            groupsofar.append(terminal)
            yield from allgroups(terminals, fibrecount - terminal.portsize, groupsofar)
            groupsofar.pop()  # terminal
        yield from allgroups(terminals, fibrecount, groupsofar)
        terminals.append(terminal)
    elif groupsofar:
        yield groupsofar

第二步是使用Algorithm X生成所有可能的分组,第三步是通过动态编程评估每个分组。你没有说“按照终端的顺序尽可能多”是什么意思,所以我会尽量减少inversions。实际上,只要具有最佳子结构,确切的目标无关紧要,即,给定相同组的两个排序,一个总是优于另一个,无论其他组如何排列。

在运行动态程序之前,如果第一个出现在第二个组之前,请为每对组计算反转次数。这意味着在第一组上迭代的外循环和在第二组上迭代的内循环,计算第一组中的终端应该在第二组中的终端之后出现的次数。现在,对于非递减顺序的每个组子集,确定该子集的最佳顺序。由于最优子结构,最优顺序从子集中的某个组开始,并以我们已经为剩余部分计算的最优解结束。最大限度地减少首先选择哪一组。