サイコロで数理最適化

「neuralnetwork combinational optimization」について調べていて,そもそも向かないよなあと思っているときに読んだもので.割とサイコロ(乱数)も馬鹿にできないよなと.

組合せ最適化でチーム分けする(平均偏差最小化)-Qiita
 
 
 
真面目な話は,例によって例の如く,記事を参考に.
以下は,あくまでサイコロ.

import numpy as np


teams = np.array(['A', 'B', 'C'])
members = np.array(['P', 'Q', 'R', 'S', 'T', 'U'])
n_members = np.arange(members.size)
skills = np.array(['Controller', 'Promoter', 'Supporter', 'Analyzer'])
scores = pd.DataFrame([[6, 0, 1, 3],
                       [2, -1, 3, 5],
                       [2, 4, 0, 0],
                       [3, 4, 5, 0],
                       [0, 2, 1, 4],
                       [2, 3, -1, 1]],
                      index=members,
                      columns=skills)

score_m = scores.as_matrix()
r_t = np.zeros((10000, teams.size, members.size//teams.size), np.int)
obj = scores.mean().values

error = np.zeros((10000, 1))

flag = 0
for i in range(10000):
    r_t[i] = np.array(np.array_split(np.random.permutation(n_members), teams.size))
    error[i] = np.mean(abs(obj - score_m[r_t[i]].mean(axis=1)))
    if error[i] < 0.7:
        flag = 1
        break

if flag:
    ind = i
else:
    ind = np.argmin(error)

print(f'object; {obj}')
print(f'error: {error[ind]}')
print(f'iteration: {ind+1}')
print(f'Team: {members[r_t[ind]]}')
print(f'Team scores: \n {score_m[r_t[ind]]}')
print(f'mean: \n  {score_m[r_t[ind]].mean(axis=1)}')

object; [ 2.5 2. 1.5 2.16666667]
error: [ 0.69444444]
iteration: 1
Team: [[‘Q’ ‘R’]
[‘U’ ‘S’]
[‘T’ ‘P’]]
Team scores:
[[[ 2 -1 3 5]
[ 2 4 0 0]]

[[ 2 3 -1 1]
[ 3 4 5 0]]

[[ 0 2 1 4]
[ 6 0 1 3]]]
mean:
[[ 2. 1.5 1.5 2.5]
[ 2.5 3.5 2. 0.5]
[ 3. 1. 1. 3.5]]

object; [ 2.5 2. 1.5 2.16666667]
error: [ 0.69444444]
iteration: 14
Team: [[‘U’ ‘S’]
[‘P’ ‘T’]
[‘Q’ ‘R’]]
Team scores:
[[[ 2 3 -1 1]
[ 3 4 5 0]]

[[ 6 0 1 3]
[ 0 2 1 4]]

[[ 2 -1 3 5]
[ 2 4 0 0]]]
mean:
[[ 2.5 3.5 2. 0.5]
[ 3. 1. 1. 3.5]
[ 2. 1.5 1.5 2.5]]

object; [ 2.5 2. 1.5 2.16666667]
error: [ 0.69444444]
iteration: 20
Team: [[‘R’ ‘Q’]
[‘S’ ‘U’]
[‘T’ ‘P’]]
Team scores:
[[[ 2 4 0 0]
[ 2 -1 3 5]]

[[ 3 4 5 0]
[ 2 3 -1 1]]

[[ 0 2 1 4]
[ 6 0 1 3]]]
mean:
[[ 2. 1.5 1.5 2.5]
[ 2.5 3.5 2. 0.5]
[ 3. 1. 1. 3.5]]

object; [ 2.5 2. 1.5 2.16666667]
error: [ 0.69444444]
iteration: 1
Team: [[‘P’ ‘T’]
[‘U’ ‘S’]
[‘Q’ ‘R’]]
Team scores:
[[[ 6 0 1 3]
[ 0 2 1 4]]

[[ 2 3 -1 1]
[ 3 4 5 0]]

[[ 2 -1 3 5]
[ 2 4 0 0]]]
mean:
[[ 3. 1. 1. 3.5]
[ 2.5 3.5 2. 0.5]
[ 2. 1.5 1.5 2.5]]

object; [ 2.5 2. 1.5 2.16666667]
error: [ 0.69444444]
iteration: 6
Team: [[‘R’ ‘Q’]
[‘T’ ‘P’]
[‘U’ ‘S’]]
Team scores:
[[[ 2 4 0 0]
[ 2 -1 3 5]]

[[ 0 2 1 4]
[ 6 0 1 3]]

[[ 2 3 -1 1]
[ 3 4 5 0]]]
mean:
[[ 2. 1.5 1.5 2.5]
[ 3. 1. 1. 3.5]
[ 2.5 3.5 2. 0.5]]

だいたい,「comb(6, 2)#15」よりも速く収まる(総当りよりは優秀).

広告
カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中