PEIYANGXINQU Ответов: 1

Как изменить алгоритмы поиска по ширине с одного потока на многопоточный?


Я хочу получить кратчайший путь от одного узла к другому узлу.Поэтому я использую алгоритмы поиска по ширине.Но мой график имеет много узлов, и мне потребовалось почти 300 секунд, чтобы получить результат.Теперь мой менеджер попросит меня использовать многопоточность?Общий код таков здесь- А это обязательно? Как изменить мой код?

public int getShortestPath(Long beginLabel, Long endLabel,Stack<Vertex> stack) {
		Vertex begin = this.getVertexByLong(beginLabel);
		Vertex end = this.getVertexByLong(endLabel);
		begin.setVisited(true);
		List<Vertex> queue = new LinkedList<Vertex>();
		queue.add(begin);
		boolean done = false;
		while (!done && !queue.isEmpty()) {
			Vertex curVertex = queue.remove(0);
			StringBuffer sb = new StringBuffer();
			sb.append("curVertex:"+curVertex.getLabel()+"to>>>>>>");
			while (!done && curVertex.getFirstUnvisitedNeighbor() != null) {
				Vertex tmpVertex = curVertex.getFirstUnvisitedNeighbor();
				sb.append(tmpVertex.getLabel()+"|"); 
				tmpVertex.setVisited(true);
				int tmpCost = curVertex.getCost() + 1;
				tmpVertex.setPreviousVertex(curVertex);
				tmpVertex.setCost(tmpCost);
				queue.add(tmpVertex);
				if (tmpVertex.equals(end)) {
					done = true;
				}
			}
			sb.append(" end.");
			log.debug(sb.toString());
		}
		int pathLength = end.getCost();
		// find the path.traverse back from end
		while (end != null) {
			stack.push(end);
			end = end.getPreviousVertex();
		}
		return pathLength;
	}
    public Vertex getFirstUnvisitedNeighbor() {
		Vertex unVisitedNeighbor = null;
		for (int i = 0, len = edgeList.size(); i < len; i++) {
			Edge edge = edgeList.get(i);
			if(edge.isUnabled()){
				continue;
			}
			Vertex vertex = edge.endVertex;
			if (!vertex.isVisited) {
				unVisitedNeighbor = vertex;
				break;
			}
		}
		return unVisitedNeighbor;
	}


Что я уже пробовал:

Do I need some concurrent framework like `Fork/Join`?

Patrice T

Сколько узлов и ребер за 300 секунд ?

PEIYANGXINQU

около 7000 узлов

1 Ответов

Рейтинг:
2

Patrice T

На самом деле никакого решения нет, но несколько размышлений о ситуации.

На первый взгляд я бы проверил, не вырождается ли использование динамической структуры данных, такой как связанный список, и тем самым не засоряет процессор. Проверьте, как другие работают по тому же алгоритму.

Цитата:
Теперь мой менеджер просит меня использовать многопоточность

Многопоточность интересна только тогда, когда вы можете разделить задание на более мелкие задачи, которые могут выполняться параллельно, и вы должны убедиться, что нет никакого столкновения между задачами, которое в конечном итоге привело бы к тому, что каждая задача выполняла бы всю работу. Каждый шаг должен знать, какую часть работы он выполняет.
Возможно, вам придется пересмотреть свой алгоритм/код, чтобы соответствовать ограничениям многопоточности.

Цитата:
мне потребовалось почти 300 секунд, чтобы получить результат примерно для 7000 узлов

Дьявол кроется в деталях.
Время выполнения выглядит большим только для 7000 узлов. Я бы сначала убедился, что алгоритм эффективен.
- Протестируйте свой код с 7, 70, 700 и 7000 узлами посмотрите, как развивается среда выполнения, вы можете обнаружить там проблему. сравните полученный результат со сложностью других программ.
- Я бы использовал профайлер, чтобы понять, где тратится время.
Профилирование (компьютерное программирование) - Википедия[^]