Цель:
Скажем, у меня есть X рабочих на фруктовой плантации. На плантации выращивают яблоки, груши и виноград.
В конце дня бригадир оценивает каждого рабочего с коэффициентом. Сумма всех соотношений равна 100. Соотношение определяет, как распределить фрукты среди рабочих в конце дня.
Как мне распределить фрукты между всеми рабочими, чтобы каждый из них получил свою справедливую долю (в пределах определенной случайности для учета целочисленного деления). Делятся только целые плоды, поэтому получаются целые числа. И все плоды надо раздать.
Я делаю это с примерно 20 рабочими, так что прямо сейчас соотношение составляет около 0,05 на одного рабочего.
Что я пробовал (псевдокод):
for each worker:
if applesGiven < appleStock:
worker.give(ratio * applestock);
if pearsGiven < pearStock:
worker.give(ratio * pearStock);
if grapesGiven < grapeStock:
worker.give(ratio * grapeStock);
Я бы позволил определить точное количество [фруктов], которые они дали, с помощью boolean Roundup
, которое было инициализировано случайным логическим значением и переключалось после каждого обработанного фрукта.
Что я пробовал (полный код):
public void balance() {
boolean roundUp = random.nextBoolean();
for (Employee e : employees) {
double ratio = e.getRatio();
if (applePlanned < appleNeeded) {
int apple;
if (roundUp) {
apple = (int) Math.ceil(ratio * appleNeeded);
} else {
apple = (int) Math.floor(ratio * appleNeeded);
}
e.setrapple(apple);
applePlanned += apple;
roundUp = !roundUp;
}
if (pearPlanned < pearNeeded) {
int pear;
if (roundUp) {
pear = (int) Math.ceil(ratio * pearNeeded);
} else {
pear = (int) Math.floor(ratio * pearNeeded);
}
e.setrpear(pear);
pearPlanned += pear;
roundUp = !roundUp;
}
if (grapePlanned < grapeNeeded) {
int grape;
if (roundUp) {
grape = (int) Math.ceil(ratio * grapeNeeded);
} else {
grape = (int) Math.floor(ratio * grapeNeeded);
}
e.setrgrape(grape);
grapePlanned += grape;
roundUp = !roundUp;
}
}
Проблемы, с которыми я столкнулся:
- Распространяется только около 3/4 всех предметов.
- Когда у меня есть четное количество фруктов, логическое значение получает одинаковое значение в начале каждого нового человека.
Спасибо за внимание!
Ответы на java, python или псевдокоде, пожалуйста, это то, что я умею читать.
roundUp = !roundUp
четное количество раз; решение состоит в том, чтобы добавить второе логическое значениеroundUpStart
, которое дополняется (roundUpStart = !roundUpStart
) только один раз для каждого сотрудника, и инициализироватьroundUp
для каждого сотрудника. - person ajb   schedule 22.09.2013