最小化数字对中的最大绝对差异

时间:2013-01-13 03:35:39

标签: algorithm

问题陈述
提供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和交换失败。
有没有有效的算法来解决这个问题?

1 个答案:

答案 0 :(得分:2)

这看起来像http://en.wikipedia.org/wiki/Graph_bandwidth(NP完整,即使是特殊情况)。看起来人们在需要这样做时会运行http://en.wikipedia.org/wiki/Cuthill-McKee_algorithm来尝试将稀疏矩阵变成带状对角矩阵。