Вот как вы можете подойти к этой задаче комбинаторной оптимизации, взяв выпуклую релаксацию.
Пусть D - верхняя треугольная матрица с вашими расстояниями в верхнем треугольнике.Т.е. где i
Тогда ваша цель - максимизировать x '* D * x, где x является двоичным значением с 10 элементами, установленными в 1, а остальные в0. (Установка i-й записи в x в 1 аналогична выбору i-го элемента в качестве одного из ваших 10 элементов.)
«Стандартная» выпуклая оптимизация, связанная с комбинаторной задачей, подобной этой, заключается в расслабленииограничения такие, что х не нужно дискретно оценивать.Это дает нам следующую проблему:
maxify y '* D * y при условии: 0 <= y_i <= 1 для всех i, 1' * y = 10 </p>
Это (морально) квадратичная программа.(Если мы заменим D на D + D ', она станет добросовестной квадратичной программой, и у вас получится не отличаться.) Вы можете использовать стандартный решатель QP или просто подключить его крешатель выпуклой оптимизации по вашему выбору (например, cvx).
Значение y, которое вы получаете, не обязательно (и, вероятно, не будет) двоичным вектором, но вы можете преобразовать скалярные значения в дискретные вкуча способов.(Самое простое - это, вероятно, позволить x быть 1 в 10 записях, где y_i является наибольшим, но вам может потребоваться сделать что-то более сложное.) В любом случае, y '* D * y с y, которое вы получаете, даетВы получаете верхнюю границу для оптимального значения x '* D * x, поэтому, если x, который вы строите из y, имеет x' * D * x очень близко к y '* D * y, вы можете быть очень довольны своим приближением.
Дайте мне знать, если что-то из этого неясно, обозначено или нет.