@Torento20345

Как вычислить математический коэффициент пропорций чисел и распределить их относительно одного общего объема?

Всем привет!
Есть задача, что нужно распределить 10 литров воды в 3 емкости равномерно в зависимости от их объема.
Например
[1, 10, 3] - объемы емкостей
4 - количество литров
Как нам получить новый массив, чтобы на выходе мы получили заполняемость емкостей в виде [0, 3, 1] - это примерное значение.
И при 9 литрах воды [1, 6, 2] - на глаз примерный результат.
Т.е. что бы распределение шло пропорционально в зависимости от количества литров и возможного количество емкостей.
  • Вопрос задан
  • 81 просмотр
Решения вопроса 3
sergiks
@sergiks Куратор тега JavaScript
♬♬
Раз там дискретно, целыми, то можно по одному литру раскладывать в цикле.
Для массива посчитать «спрос» – сколько в идеале там должно быть (дробные числа).
И на каждой итерации определять самый обездоленный, далёкий от своего идеала, элемент массива – туда класть очередной литр.

function spread(q, volumes) {
  const total = volumes.reduce((a, b) => a + b);
  const result = volumes.slice().fill(0);
  const target = volumes.map((v) => q * v / total);

  while (q--) {
    const demand = result.map((v, i) => target[i] - v);
    const minIndex = demand.indexOf(Math.max(...demand));
    result[minIndex]++;
  }

  return result;
}

spread(4, [1, 10, 3]) // [0, 3, 1]
spread(9, [1, 10, 3]) // [1, 6, 2]
spread(1, [10, 10, 10]) // [1, 0, 0] - слева направо при равных
spread(33, [10, 10, 10]) // [11, 11, 11] - переполняются тоже одинаково

spread(4, [2, 3, 1]) // [ 1, 2, 1 ]
spread(5, [2, 3, 1]) // [ 2, 2, 1 ]
spread(9, [2, 3, 1]) // [ 3, 5, 1 ]
Ответ написан
VlasenkoFedor
@VlasenkoFedor
Программист: php, js, go
const arr = [1, 10, 3];
const l = 4;
const all = arr.reduce((a, b) => a + b);
const k = l / all;
const res = arr.map(v => Math.round(v * k) );
console.log(res);
Ответ написан
Alexandroppolus
@Alexandroppolus
кодир
Навскидку:
1) первое приближение как в варианте Федора, вычислить сумму S.
2) если S === Q (требуемая сумма), то ок.
3) если Q - S = m, то выбрать m элементов и накинуть им по единице. Выбрать такие, чтобы после накидывается единицы процентное отклонение было наименьшим. Двоичная куча в помощь.
4) если S - Q = m, то наоборот, посбивать единицы, аналогично п.3.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы