单循环赛竞赛隔最大的近似算法

来源:互联网 发布:学生考勤软件 编辑:程序博客网 时间:2024/04/28 13:50

 

单循环赛,每个队参加前后两场比赛之间的距离最大,这就是这个问题的要求。

 

这个问题,使用简单回溯,剪剪枝好像可以,但是要当n很大的时候就很为难,速度什么的成了问题。所以这里,我使用了近似算法。

观察问题,发现这是一个对称矩阵的问题,那么我有几条启发式规则:

 

(1)插入矩阵的元素,不应该和前 m 的元素同行很列。

这个,很简单可以理解,这是为了使最小间距得意保证。

 

(2)插入的位置,应尽可能在行或者列上占据更多的空格。

这个,有一点难理解,主要是先插入的元素理应占有利位置,这样越往后,差距变大的可能性就提高了。

否则当后面插入时,差距就会变小

 

(3)插入位置理应和个行列产生最大的行间距。

这个也好理解,主要是为了保证最小间距最大。

 

(4)插入位置理应靠近上三角的中心。

这个还是为了保证插入时能很有效的满意。

 

之后,我们便是不断地尝试(1)里面提到的m的值。这里,我们先来估计一下m的上界吧。假设最小间距为m,那么(i,j) 先比赛,比赛之后就是(i,k)比赛,这样必须除了i,j,k之外还至少有2m个球队,所以 n >= 2m + 3;也就是 m <=  [(n-3)/2];

 

这样,我们便开始从m的上界开始,向下检索。

 

 

 

结果如下:(5 到 49,result是结果,der_result_for_ideal_bound 是与理想上界的差,cpu_clock是消耗的cpu时钟数)

 

 

5: result = 2 , der_result_for_ideal_bound = 0 , cpu_clock = 1

6: result = 2 , der_result_for_ideal_bound = 0 , cpu_clock = 10

7: result = 2 , der_result_for_ideal_bound = 1 , cpu_clock = 10

8: result = 2 , der_result_for_ideal_bound = 1 , cpu_clock = 10

9: result = 3 , der_result_for_ideal_bound = 1 , cpu_clock = 10

10: result = 3 , der_result_for_ideal_bound = 1 , cpu_clock = 20

11: result = 4 , der_result_for_ideal_bound = 1 , cpu_clock = 20

12: result = 4 , der_result_for_ideal_bound = 1 , cpu_clock = 20

13: result = 4 , der_result_for_ideal_bound = 2 , cpu_clock = 50

14: result = 5 , der_result_for_ideal_bound = 1 , cpu_clock = 40

15: result = 5 , der_result_for_ideal_bound = 2 , cpu_clock = 80

16: result = 5 , der_result_for_ideal_bound = 2 , cpu_clock = 120

17: result = 6 , der_result_for_ideal_bound = 2 , cpu_clock = 130

18: result = 6 , der_result_for_ideal_bound = 2 , cpu_clock = 210

19: result = 6 , der_result_for_ideal_bound = 3 , cpu_clock = 320

20: result = 7 , der_result_for_ideal_bound = 2 , cpu_clock = 260

21: result = 7 , der_result_for_ideal_bound = 3 , cpu_clock = 420

22: result = 7 , der_result_for_ideal_bound = 3 , cpu_clock = 580

23: result = 8 , der_result_for_ideal_bound = 3 , cpu_clock = 630

24: result = 8 , der_result_for_ideal_bound = 3 , cpu_clock = 660

25: result = 8 , der_result_for_ideal_bound = 4 , cpu_clock = 1270

26: result = 9 , der_result_for_ideal_bound = 3 , cpu_clock = 1070

27: result = 10 , der_result_for_ideal_bound = 3 , cpu_clock = 1040

28: result = 10 , der_result_for_ideal_bound = 3 , cpu_clock = 1350

29: result = 10 , der_result_for_ideal_bound = 4 , cpu_clock = 2120

30: result = 11 , der_result_for_ideal_bound = 3 , cpu_clock = 6260

31: result = 11 , der_result_for_ideal_bound = 4 , cpu_clock = 2700

32: result = 11 , der_result_for_ideal_bound = 4 , cpu_clock = 2950

33: result = 11 , der_result_for_ideal_bound = 5 , cpu_clock = 8080

34: result = 12 , der_result_for_ideal_bound = 4 , cpu_clock = 4310

35: result = 13 , der_result_for_ideal_bound = 4 , cpu_clock = 4110

36: result = 13 , der_result_for_ideal_bound = 4 , cpu_clock = 7970

37: result = 14 , der_result_for_ideal_bound = 4 , cpu_clock = 5230

38: result = 13 , der_result_for_ideal_bound = 5 , cpu_clock = 9520

39: result = 14 , der_result_for_ideal_bound = 5 , cpu_clock = 8910

40: result = 14 , der_result_for_ideal_bound = 5 , cpu_clock = 14410

41: result = 15 , der_result_for_ideal_bound = 5 , cpu_clock = 20310

42: result = 14 , der_result_for_ideal_bound = 6 , cpu_clock = 25880

43: result = 15 , der_result_for_ideal_bound = 6 , cpu_clock = 27760

44: result = 16 , der_result_for_ideal_bound = 5 , cpu_clock = 27790

45: result = 14 , der_result_for_ideal_bound = 8 , cpu_clock = 65320

46: result = 16 , der_result_for_ideal_bound = 6 , cpu_clock = 45770

47: result = 16 , der_result_for_ideal_bound = 7 , cpu_clock = 49920

48: result = 17 , der_result_for_ideal_bound = 6 , cpu_clock = 56730

49: result = 17 , der_result_for_ideal_bound = 7 , cpu_clock = 60300

total_clock:1004671

 

原创粉丝点击