나를 위해 그것은 모든 평가자가 자신의 평등을 달성하거나 최대한 가깝도록 N 관리자들 사이에 N 항목의 2N 평가를 배포해야하는 것처럼 보입니다.
정체성이있다 : 그 목적을 위해 사용할 수 있습니다
2N = ceil(2N/M) + ceil((2N-1)/M) + ... + ceil((2N-M+1)/M)
. ceil
여기에 가장 가까운 비 작은 정수 : CEIL (2.3) = 3, 천장을 만들다 (4) = 4
당신을 위해 당신이해야합니다 11 개 항목의 예 (22) = 5 + 5 + 4 + 4 + 4
어떻게 작동합니까? 내가 크 누스, Patashnik에 의해 "콘크리트 수학"을 참조 할 & 그레이엄 설명 : 내가 Anttis '접근과 "콘크리트 수학"에 설명 된 코딩 한
에 대한 제 3 장, 제 4 부 :
public static void main(String[] args) {
wayOne(5, 7);
System.out.println("======");
wayTwo(5, 7);
}
private static void wayOne(int assessors, int items) {
Integer assessments[][] = new Integer[2][items];
int assessor = 0;
for (int pass = 0; pass < 2; pass++) {
for (int item = 0; item < items; item++) {
while (assessments[pass][item] != null)
assessor = (assessor + 1) % assessors;
assessments[pass][item] = assessor;
assessor = (assessor + 1) % assessors;
}
}
for (int pass = 0; pass < assessments.length; pass++) {
for (int item = 0; item < assessments[pass].length; item++)
System.out.println("Pass " + pass + " item " + item + " is assessed by " + assessments[pass][item]);
}
}
private static void wayTwo(int assessors, int items) {
Integer distribution[][] = new Integer[2][items];
int assessments = 2 * items;
int step = 0, prevBatch = 0;
while (assessments > 0) {
int batch = (int) Math.ceil((2.0 * items - step)/assessors);
assessments -= batch;
for (int i = prevBatch; i < batch + prevBatch; i++) {
distribution[i/items][i % items] = i % assessors;
}
prevBatch += batch;
step++;
}
for (int pass = 0; pass < distribution.length; pass++) {
for (int item = 0; item < distribution[pass].length; item++)
System.out.println("Pass " + pass + " item " + item + " is assessed by " + distribution[pass][item]);
}
}
을
내가 맞으면 두 번째 방법으로 원하는 결과물을 얻을 수 있습니다. 예를 들어, 7 개 항목과 5 명의 평가자를 위해 시도하십시오. 또는 11 개 항목 및 4 명의 평가자.
업데이트 Antti가 지적한 버그가 수정 된 후 두 개의 루틴에서 동일한 결과가 나타납니다.
예. 알고리즘 구현에 버그가 있습니다. 전체적으로 다른 알고리즘과 확실히 나쁜 성능으로 이끄는 패스 사이에 평가자 지수를 재설정합니다! 할당 감정가 = 0은 내 코드에서 루프를 벗어납니다! :) 그것은 반복을 반복하기 전에 속합니다. 당신이 나쁜 결과를 얻는 것은 놀라운 일이 아닙니다. –
@antti 이것을 지적 해 주셔서 감사합니다! 대답을 업데이트했습니다. –
알고리즘의 버그가 여전히 있습니다 :'while (assessment [pass] [item]! = null)'줄에서'pass'의 현재 값뿐만 아니라 모든 패스에 대해 이것을 검사해야합니다. –