Вы можете смоделировать математическую задачу следующим образом.
http://mathb.in/31885?key=216f0d8271c8a65ecbce2faff12735042a4b7684
где x_i равно 1, если путешественник i назначен группе 1, и 0, если назначен группе 2. расстояние дляпутешественник i для группы 1 - это d, а для группы 2 - это d '
Тогда вы можете использовать целочисленные решатели, такие как gurobi / pulp, чтобы выполнить вычисления в python.
Возможны и другие формулировки, в зависимости ото том, как вы определяете "сбалансированный".Я предполагаю, что квадрат общего времени в пути даст вам тот вид разделения, который вы хотите.Вы можете решить эту проблему и посмотреть, нравится ли вам решение, которое вы получаете.Но, возможно, есть и другие формулировки, которые вы можете иметь для баланса.Одним из примеров может быть: «Максимум, что один путешественник должен путешествовать, меньше некоторого« D_high ». В этом случае вы добавите ограничение, например x_i d_i + (1-x_i) d'_i <= D_high </p>
Это сравнительно небольшая проблема для большинства современных решателей, и вы должны получить ответ в считанные минуты.
РЕДАКТИРОВАТЬ: Только что понял, что целлюлоза / gurobi являются линейными решателями. Если вы используете квадрат в качестве цели, которая не является-линейное целое число, и вы больше не можете использовать gurobi / pulp. У вас есть два варианта:
Придерживайтесь нелинейной формулировки и используйте cvxpy (выпуклая оптимизация с открытым исходным кодом, имеет поддержку целых чиселпеременные, насколько я помню)
Перейти к линейной формулировке, где ваша цель - только сумма расстояний, а не квадратная сумма. И наложить линейное ограничение, как я упоминалдо x_i d_i + (1-x_i) d'_i <= D_high, чтобы наложить ограничение на некоторую справедливость </p>