待機時間をなるべく少なく運転手を割り当てるアルゴリズムを実現したい。
と条件5の関係が今ひとつ理解できていませんので,条件5の部分は変更し易い形にしてみました。
「行:周回,列:車両」の要素にドライバーを示す値(1, 2, 3, 4, 5)を持つ 5x5 の2次元配列を考え,条件に合うものを選別する記述例を下記に示します。
Python
1import numpy as np
2from itertools import permutations, combinations
3
4def check_column(x): # condition 2
5 for j in range(x.shape[1]):
6 for a, b in combinations(x[:, j], 2):
7 if a == b:
8 return False
9 return True
10
11def check_diagonal(x): # condition 5
12 for i in range(x.shape[0] - 1):
13 for j in range(x.shape[1] - 1):
14 if i == j:
15 continue
16 if x[i, j] == x[i + 1, j + 1]:
17 return False
18 return True
19
20
21r_grp = [[], [], [], [], []]
22for r in permutations((1, 2, 3, 4, 5)):
23 for k in range(1, 5):
24 if r[k] == 1:
25 r_grp[k].append(r)
26 break
27
28r0 = (1, 2, 3, 4, 5) # condition 4
29for r1 in r_grp[1]:
30 for r2 in r_grp[2]:
31 for r3 in r_grp[3]:
32 for r4 in r_grp[4]:
33 arr = np.array([r0, r1, r2, r3, r4])
34 if check_column(arr) and check_diagonal(arr):
35 print(arr)
36# [[1 2 3 4 5]
37# [3 1 4 5 2]
38# [4 5 1 2 3]
39# [5 3 2 1 4]
40# [2 4 5 3 1]]
41# [[1 2 3 4 5]
42# [3 1 4 5 2]
43# [5 4 1 2 3]
44# [2 3 5 1 4]
45# [4 5 2 3 1]]
46# [[1 2 3 4 5]
47# [4 1 5 2 3]
48# [2 5 1 3 4]
49# [5 3 4 1 2]
50# [3 4 2 5 1]]
51# [[1 2 3 4 5]
52# [5 1 4 2 3]
53# [2 3 1 5 4]
54# [3 4 5 1 2]
55# [4 5 2 3 1]]