Я использовал алгоритм дигестры для вычисления кратчайшего пути. Вы можете попробовать это
Set<String> addressSet = your AddressSet;
int[][] adjacencyMatrix = prepareAdjacencyMatrix(employee, addressSet);
return new CalculateShortestPath(adjacencyMatrix.length - 1)
.calculate(adjacencyMatrix, 1);
private int[][] prepareAdjacencyMatrix(Employee employee,
Set<String> addressSet) {
List<String> addressList = new ArrayList<>();
addressList.addAll(addressSet);
int l = addressSet.size();
int[][] adjacencyMatrix = new int[l + 1][l + 1];
for (int i = 1; i <= l; i++) {
for (int j = 1; j <= l; j++) {
if (i == j) {
adjacencyMatrix[i][j] = Integer.MAX_VALUE;
} else {
String key = getAddressKey(addressList.get(i - 1), addressList.get(j - 1), employee.getTransport());
String reverseKey = getAddressKey(addressList.get(j - 1), addressList.get(i - 1),
employee.getTransport());
if (distanceMatrix.containsKey(key)) {
adjacencyMatrix[i][j] = 0;
} else if (distanceMatrix.containsKey(reverseKey)) {
adjacencyMatrix[i][j] = 0;
}
}
}
}
return adjacencyMatrix;
}
private String getAddressKey(String sourceCity,
String destinationCity, MeansOfTransport transport) {
return sourceCity + "-" + destinationCity + "-" +
(nonNull(transport) ? transport.getName() : MeansOfTransport.DRIVING.getName());
}
public class CalculateShortestPath {
private int distances[];
private Set<Integer> settled;
private Set<Integer> unsettled;
private int number_of_nodes;
private int adjacencyMatrix[][];
public CalculateShortestPath(int number_of_nodes) {
this.number_of_nodes = number_of_nodes;
distances = new int[number_of_nodes + 1];
settled = new HashSet<>();
unsettled = new HashSet<>();
adjacencyMatrix = new int[number_of_nodes + 1][number_of_nodes + 1];
}
private void dijkstra_algorithm(int adjacency_matrix[][], int source) {
int evaluationNode;
for (int i = 1; i <= number_of_nodes; i++) {
System.arraycopy(adjacency_matrix[i], 1, adjacencyMatrix[i], 1, number_of_nodes);
}
for (int i = 1; i <= number_of_nodes; i++) {
distances[i] = Integer.MAX_VALUE;
}
unsettled.add(source);
distances[source] = 0;
while (!unsettled.isEmpty()) {
evaluationNode = getNodeWithMinimumDistanceFromUnsettled();
unsettled.remove(evaluationNode);
settled.add(evaluationNode);
evaluateNeighbours(evaluationNode);
}
}
private int getNodeWithMinimumDistanceFromUnsettled() {
Iterator<Integer> iterator = unsettled.iterator();
int node = iterator.next();
int min = distances[node];
for (int i = 1; i <= distances.length; i++) {
if (unsettled.contains(i)) {
if (distances[i] <= min) {
min = distances[i];
node = i;
}
}
}
return node;
}
private void evaluateNeighbours(int evaluationNode) {
int edgeDistance = -1;
int newDistance = -1;
for (int destinationNode = 1; destinationNode <= number_of_nodes; destinationNode++) {
if (!settled.contains(destinationNode)) {
if (adjacencyMatrix[evaluationNode][destinationNode] != Integer.MAX_VALUE) {
edgeDistance = adjacencyMatrix[evaluationNode][destinationNode];
newDistance = distances[evaluationNode] + edgeDistance;
if (newDistance < distances[destinationNode]) {
distances[destinationNode] = newDistance;
}
unsettled.add(destinationNode);
}
}
}
}
public int calculate(int[][] adjacency_matrix, int source) {
int shortestPath = Integer.MAX_VALUE;
try {
dijkstra_algorithm(adjacency_matrix, source);
for (int i = 1; i <= distances.length - 1; i++) {
if (distances[i] > 0 && distances[i] < shortestPath) {
shortestPath = distances[i];
}
}
} catch (InputMismatchException inputMismatch) {
System.out.println("Wrong Input Format");
}
return shortestPath;
}
}
Assembla является хорошим вариантом. Можно попробовать devjavu также. Я использовал их обоих в течение нескольких лет, devjavu имеет более чистую среду.
Я видел 'SVN-trac в действии' в двух проектах, среди которых я работал с разработчиками, менеджерами проектов, людьми, которые не имели никакого предыдущего контакта с системой управления версиями. Они использовали наиболее распространенные функции без проблем, я не думаю, что это должно быть большое беспокойство, если у Вашей команды могло бы быть 2-часовое обучение об основном понятии управления версии с подверсией.
Править:
Существует страница сравнения на этом предмете, это должен быть хороший ресурс. В случае, если это не, по крайней мере, у них есть большая сумма ссылок на svn услуги хостинга.;)
Я использовал в течение почти двух лет теперь Неопьянение.
Это превосходно. Это делает SVN, и МЕРЗАВЕЦ, размещающий, не экономит на пространстве онлайн, имеет встроенную ошибку/отслеживание ошибки (может импортировать из Trac), И интегрированный с SVN, имеет Wiki, мини-форумы, отслеживание времени... все же это очень просто в использовании и имеет негиковский интерфейс.
Это также имеет чистый API. Я делаю резервное копирование (они делают это автоматически также, но я супер осторожен со своими данными) с помощью простого сценария Powershell.
Они очень ориентированы на клиента: после того как мне были нужны они для импорта SVN repo, я имел до, и они ответили и сделали работу в половине или около этого.
Существует несколько предлагаемых уровней обслуживания от свободного до умеренно дорогого. Я сказал бы, что полные цены очень разумны.
У меня нет ничего для отказа, и никоим образом не связан, просто очень счастливый клиент.
Это не может быть идеальным пригодным для того, что Вы ищете, но Вы рассмотрели код Google? Отслеживание ошибок, управление версиями, Wiki. Это даже свободно.
Я рекомендовал бы Слияние. Это гибко, и доступное размещенный и неразмещенный. Это - Wiki в ядре, но это имеет хорошее управление версиями для страниц, а также вложений. Это отслеживает то, кто изменяет то, что, и система разрешения позволяет Вам указывать, кто видит что (например, для предоставления клиентского доступа, но только к соответствующим областям). Это имеет хорошие опции интеграции, такие как удаленный API-интерфейс, интерфейс WebDAV, и существует много плагинов, доступных для функциональности, не включенной по умолчанию.
Вы могли также взглянуть на Jira, который более полезен для управления проектами.
Нет, я не работаю на atlassian.
Я использую SVN+TRAC+MediaWIKI в качестве основного инструмента для всего взаимодействия между всеми цепочками процесса разработки.
Разработчики используют SVN для управления версиями, TRAC для контроля проблем отчет QA и WIKI как источник требования и технической документации.
Использование QA TRAC для того, чтобы сообщить о проблемах и WIKI для как источник рабочих процессов и требований. Премьер-министры и TLS используют TRAC для создания burndown отчеты и WIKI как источник всего вида документации.
Высшее руководство видит верхнюю часть айсберга, визуализируемого burndown графикой.
Таким образом, я могу рекомендовать использовать TRAC с интеграцией с SVN и MediaWIKI. Все свободно. Существует усилие только некоторого времени, требуемое выполнять его.
Вы ищете размещенный или неразмещенный? Мы используем redmine, альтернативу Trac, который был бризом, чтобы установить и использовать. UI прост и интуитивен. Довольно гибкий с конфигурацией, позволяет несколько проектов, интеграция Управления исходным кодом (для SVN, мерзавца, CVS, всех общих), интегрированная Wiki, форумы, файлы, и т.д. Другие имена для бросания вокруг включают неопьянение, jira, маяк и приложение фильтра.