[[20150405231341]] 『3つのグループに振り分けたい』(カンポウ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『3つのグループに振り分けたい』(カンポウ)

お世話になります。

現在、個人の力量を数値化(0〜100)して管理しています。

3つのグループに振り分けたときに、個人の力量を合計した値が
なるべく均等になるように振り分けることは可能でしょうか。

日によってグループ分けをする人数(10〜20)が違います。

たとえば
Aグループ
佐藤50+鈴木50=100
Bグループ
田中10+村上10+山下90=110
Cグループ
小林70+相川35=105

上記のように振り分けることは可能でしょうか。
結果が複数通り発生することが考えられますが
一覧表みたいに表記できれば視覚的にわかりやすくて助かります。
(フォーマット等は決まっておりません)

< 使用 Excel:Excel2007、使用 OS:Windows7 >


 最適化問題ってやつで、人数が増えるにつれ計算量がとんでもないことになります。
[[20150116160046]]

 こちらで似たような回答したので参考にしてください。

 質問とは関係ないのですが
 90点と10点の組み合わせと
 50点と50点の組み合わせだと
 どうしても後者のほうが優秀だと思うのですが・・・
(稲葉) 2015/04/06(月) 08:27

得点で考えると大変なので、順位でざっくり並べて、後は手で調整するのはいかがでしょう?
例えば、A列に名前、B列に得点。並べ替え機能で、得点の高い順に並べておき、以下のマクロを実行してください。

 Sub test()
    Dim i As Long
    Dim iC As Long
    Dim iR As Long

    For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row
        iR = Fix((i + 2) / 3) + 1
        iC = ((i + 2) Mod 3) * 2 + 4
        Cells(iR, iC).Value = Cells(i, "A").Value
        Cells(iR, iC + 1).Value = Cells(i, "B").Value
    Next i

    For i = 5 To 9 Step 2
        Cells(1, i).FormulaR1C1 = "=SUM(R2C:R" & iR & "C)"
    Next i
 End Sub
(???) 2015/04/06(月) 09:12

稲葉さんのコメント部分を参考に作業式使った数式を作ってみました

A列に名前、B列に得点があるとして、
作業列Cに、
C1=IFERROR(COUNTIF($B$1:$B1,$B1)-1+RANK(B1,OFFSET($B$1,,,COUNT($B:$B)),0),"")
これでランキングを求めます。同じ点数の場合下の行のものに1が足され、さらに下にはさらに1が足される方式のため、人数分の整数がすべて使われることになるはずです

チーム1の人名をE列、得点をF列、順位をG列
チーム2の人名をH列、得点をI列、順位をJ列
チーム3の人名をK列、得点をL列、順位をM列
とした場合に、

G1=IF(COUNT($C:$C)<1+(ROW(G1)-ROW($G$1))*3+(COLUMN(G1)-COLUMN($G$1))/3,"",1+(ROW(G1)-ROW($G$1))*3+(COLUMN(G1)-COLUMN($G$1))/3)
J1=IF(COUNT($C:$C)<1+(ROW(J1)-ROW($G$1))*3+(COLUMN(J1)-COLUMN($G$1))/3,"",1+(ROW(J1)-ROW($G$1))*3+(COLUMN(J1)-COLUMN($G$1))/3)
M1=IF(COUNT($C:$C)<1+(ROW(M1)-ROW($G$1))*3+(COLUMN(M1)-COLUMN($G$1))/3,"",1+(ROW(M1)-ROW($G$1))*3+(COLUMN(M1)-COLUMN($G$1))/3)
G2=IF(COUNT($C:$C)<1+(ROW(G2)-ROW($G$1))*3+(COLUMN($M$1)-COLUMN(G1))/3,"",1+(ROW(G2)-ROW($G$1))*3+(COLUMN($M$1)-COLUMN(G1))/3)
J2=IF(COUNT($C:$C)<1+(ROW(J2)-ROW($G$1))*3+(COLUMN($M$1)-COLUMN(J1))/3,"",1+(ROW(J2)-ROW($G$1))*3+(COLUMN($M$1)-COLUMN(J1))/3)
M2=IF(COUNT($C:$C)<1+(ROW(M2)-ROW($G$1))*3+(COLUMN($M$1)-COLUMN(M1))/3,"",1+(ROW(M2)-ROW($G$1))*3+(COLUMN($M$1)-COLUMN(M1))/3)

G1:M2をドラッグして、下方向にオートフィル

E1=IFERROR(OFFSET($A$1,MATCH(G1,OFFSET($C$1,,,COUNT($C:$C)),0)-1,),"")
F1=IFERROR(OFFSET($B$1,MATCH(G1,OFFSET($C$1,,,COUNT($C:$C)),0)-1,),"")

E1:F1をドラッグして、下方向にオートフィル
オートフィルしたものをコピーして、

H列I列とK列L列にコピペ

これで順位が高い人がある程度均等に分かれてなおかつ、全体の点数がある程度近くなるという表になるかと思います。
人数をある程度そろえる方がいい場合なら利用可能かと。
(安針) 2015/04/07(火) 01:33


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.