Часто помогает разработать математическую модель. Э.Г.
Пусть
a(i)>=0 i=1,..,m
b(j)>0 j=1,..,n with n > m
быть данными.
Ввести переменные (определяется моделью)
c = common number for all expressions to be close to
x(i,j) = 1 if a(i) is assigned to b(j)
0 otherwise
Тогда мы можем написать:
min sum((i,j), (x(i,j)*(a(i)/b(j) - c))^2 )
subject to
sum(j, x(i,j)) = 1 for all i (each a(i) is assigned to exactly one b(j))
x(i,j) in {0,1}
c free
Это нелинейная модель. Решатели MINLP (Смешанное целочисленное нелинейное программирование) легко доступны. Вы также можете выбрать цель, которая может быть линеаризована:
min sum((i,j), abs(x(i,j)*(a(i)/b(j) - y(i,j))) )
subject to
y(i,j) = x(i,j)*c
sum(j, x(i,j)) = 1 for all i
x(i,j) in {0,1}
c free
Это можно переформулировать как модель MIP (смешанного целочисленного программирования). Есть много доступных MIP-решателей.
Решение может выглядеть так:
Значения внутри матрицы: a (i) / b (j). Каждая строка соответствует a (i) и имеет ровно одно совпадение b (j).
Подробнее здесь .