问题陈述:
提供n
变量和k
对。通过为每个变量分配1到n
的值,可以区分变量。每对p
包含2个变量,p
中2个变量之间的绝对差值为abs(p)
。定义差异的上限是U=max(Abs(p)|every p)
。
查找最小化U
的作业。
Limit:
n<=100
k<=1000
每个变量在对列表中至少出现2次。
A problem instance:
Input
n=9, k=12
1 2 (meaning pair x1 x2)
1 3
1 4
1 5
2 3
2 6
3 5
3 7
3 8
3 9
6 9
8 9
Output:
1 2 5 4 3 6 7 8 9
(meaning x1=1,x2=2,x3=5,...)
解释:x1=1,x2=2,x3=3,...
的分配将导致U=6
(3 9具有最深的abs值)。输出分配将获得U=4
,最小值(更改对:3 7 => 5 7, 3 8 => 5 8
等等,并且不会更改3 5。在这种情况下,每对abs(p)<=4
。
有一点很重要:要获得最佳分配,必须更改具有最大绝对值的对中的变量。
基于此,我想到了一个贪婪的算法:
1)Assign every x to default assignment (x(i)=i)
2)Locate pairs that have largest abs and x(i)'s contained in them.
3)For every i,j: Calculate U. Swap value of x(i),x(j). Calculate U'. If U'<U, stop and repeat step 3. If U'>=U for every i,j, end and output the assignment.
然而,如果我们需要这样的作业,这种方法有一个主要的缺陷:
x(a)<<x(b), x(b)<<x(c), x(c)<<x(a)
,我们必须交换2个步骤,例如:x(a)<=>x(b)
,然后是x(b)<=>x(c)
,然后第一步x(b)<<x(a)
有可能其abs超过U和交换失败。
有没有有效的算法来解决这个问题?
答案 0 :(得分:2)
这看起来像http://en.wikipedia.org/wiki/Graph_bandwidth(NP完整,即使是特殊情况)。看起来人们在需要这样做时会运行http://en.wikipedia.org/wiki/Cuthill-McKee_algorithm来尝试将稀疏矩阵变成带状对角矩阵。