我有一个有序列表,表示光纤电缆上的终端,每个终端都有多个端口(例如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)
有人可以提出理想的算法吗?
答案 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。实际上,只要具有最佳子结构,确切的目标无关紧要,即,给定相同组的两个排序,一个总是优于另一个,无论其他组如何排列。
在运行动态程序之前,如果第一个出现在第二个组之前,请为每对组计算反转次数。这意味着在第一组上迭代的外循环和在第二组上迭代的内循环,计算第一组中的终端应该在第二组中的终端之后出现的次数。现在,对于非递减顺序的每个组子集,确定该子集的最佳顺序。由于最优子结构,最优顺序从子集中的某个组开始,并以我们已经为剩余部分计算的最优解结束。最大限度地减少首先选择哪一组。