Из вопроса OP, проблема была с использованием смещения в буфере.
Javadoc для DataOutputStream.write (выделение выделено)
public void write (byte [] b, int off, int len) выдает IOException
Записывает len байтов из указанного массива байтов , начиная со смещения off , в базовый выходной поток. Если исключение не выдается, записанный счетчик увеличивается на len.
blockquote>Итак,
java.lang.IndexOutOfBoundsException
был результатом этой строки:DOS.write(buf, k*1000, buf.length);
Всегда используя «0» для смещения,
.write(...)
запишет количество байтов (в этом случае длина буфера), начиная с со смещения (которое должно быть 0). ОП всегда приятно переполнял буфер в каждой итерации цикла.Таким образом, изменение на что-то вроде:
for( k=0;k<100;k++) { buf=bufferFiller( buf); DOS.write(buf, 0, buf.length); acc++; }
должно решить проблему.
Первое, что пришло на ум, пространственный вид, сопровождаемый моделируемым отжигом.
Сетка пространство и сортирует наборы в пространственные ячейки.
Решите O (NM) проблема в каждой ячейке, затем в окружениях ячейки, и так далее, для получения испытательного соответствия.
Наконец, выполните много циклов моделируемого отжига, в котором Вы случайным образом изменяете соответствия, чтобы исследовать соседнее пространство.
Это - эвристика, получая Вас хороший ответ, хотя не обязательно лучшее, и это должно быть довольно эффективно из-за начального вида сетки.
Одним путем Вы могли приблизиться, эта проблема состоит в том, чтобы рассматривать, как классическая проблема присвоения: http://en.wikipedia.org/wiki/Assignment_problem
Вы рассматриваете точки как вершины графика, и веса краев являются расстоянием между точками. Поскольку самые быстрые алгоритмы предполагают поиск максимума, соответствующего (и не минимальные как в случае), и что веса являются неотрицательными, можно переопределить веса, чтобы быть, например:
weight(A, B) = bigNumber- distance(A,B)
где bigNumber
больше, чем Ваше самое долгое расстояние.
Очевидно, Вы заканчиваете с биграфом. Затем Вы используете один из стандартных алгоритмов для максимального взвешенного двустороннего соответствия (много ресурсов в сети, например, http://valis.cs.uiuc.edu/~sariel/teach/courses/473/notes/27_matchings_notes.pdf или Википедия для обзора: http://en.wikipedia.org/wiki/Perfect_matching#Maximum_bipartite_matchings) Этот способ, которым Вы закончите с O (NM макс. (N, M)) алгоритмы, где N и M являются размерами Ваших наборов точек.
Хотя у меня действительно нет ответа на Ваш вопрос, я могу предложить изучить следующие темы. (Я знаю очень мало об этом, но встретился с ним ранее на Переполнении стека.)
Надежда это помогает немного.