要素がn個の数列を、m個のグループに分けます。
この時、各グループの数の合計の差ができるだけ小さくなるようにしたいです。
各グループに振り分ける要素の個数はばらつきがあっても構いません。
配列は降順にソート済みとします。
下記のデータの例では、「18, 18, 19」にしたいです。とりあえず単純に、配列の先頭から順に常に合計値が一番小さいグループに加算するというロジックを書きました。これでもまぁまぁ動くのですが、データにより期待より差が大きくなってしまうことがあります。
ですので、もう少しいいロジックにしたいです。動くコードを書いていただけたら嬉しいですが、そうでなくともこういう考え方があるとか、方針のアドバイス等でも嬉しいです。よろしくお願いします。
JavaScript
1var data = [6, 6, 6, 6, 5, 5, 4, 3, 3, 3, 2, 2, 2, 2]; 2var num = 3; 3 4/* 5得たい結果の例1 = [ 6 [6, 6, 3, 3], // 18 7 [6, 5, 4, 3], // 18 8 [6, 5, 2, 2, 2, 2] // 19 9]; 10得たい結果の例2 = [ 11 [6, 5, 3, 3, 2], // 19 12 [6, 6, 2, 2, 2], // 18 13 [6, 5, 4, 3], // 18 14]; 15 16下記コードの実行結果 = [ 17 [6, 6, 3, 2, 2], // 19 18 [6, 5, 4, 2, 2], // 19 19 [6, 5, 3, 3] // 17 20]; 21*/ 22 23console.log("data =", data); 24console.log("num =", num); 25console.log(""); 26 27var result = balancer(data, num); 28console.log("result =", result); 29 30function balancer(data, num) { 31 var result = Array(num).fill([]); 32 var totals = Array(num).fill(0); 33 34 for (var i = 0; i < data.length; i++) { 35 var ii = totals.indexOf(Math.min.apply(null, totals)); 36 result[ii].push(data[i]); 37 totals[ii] += data[i]; 38 } 39 40 console.log("totals =", totals); 41 return result; 42} 43
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/15 12:35