재미있는 문제가있는 배낭이 나타났습니다. 모두 값과 무게가있는 항목 목록이 있습니다. 그런 다음 합계 된 오브젝트의 가치를 최대화하고 특정 한도 내에서 머물러야하는 항목의 조합을 찾아야합니다. 나는 이것이 다른 검색 알고리즘을 사용할 수있는 검색 문제라는 것을 보았다. 이제는 폭 넓게 구현하려고합니다. 정말 노력했다비 재귀 0/1 너비 우선 검색을 사용한 배낭 알고리즘
Breadth-First-Search(Graph, root):
create empty set S
create empty queue Q
root.parent = NIL
Q.enqueue(root)
while Q is not empty:
current = Q.dequeue()
if current is the goal
return current
for each node n that is adjacent to current:
if n is not in S:
add n to S
n.parent = current
Q.enqueue(n)
는 배낭 문제에 이것을 적용하는 방법을 이해하기 위해 다음과 같이 BFS의 의사 알고리즘은 위키 피 디아에서 발견
이다.
제가 이해하는 한, 나무를 만드는 것입니다. 한 번에 한 레벨의 각 노드를 확장하고 탐색해야합니다. BFS의 경우 FIFO 대기열이 필요합니다. 선택한 각 항목에 대해 두 가지 선택 사항이 있습니다. 항목을 가져갈 지 여부. 어쨌든, 구체적으로 : 나는 위의 의사 코드로, 내 맥락에서 이해하지 못하는 어떤 것이있다 : 나는, 항목을 선택 할 때
- 내가 대기열에 두 번 밀어로 중 하나를 표시 하나는 사용되지 않았습니까?
- 현재 목표가 맞는지 어떻게 알 수 있습니까? 나는 우리가 잎 노드에 있다는 것을 의미하는 탐험 할 노드가 더 이상 없을 때와 같은 것으로 가정합니다. 그러나 많은 잎 노드가있을 것입니다. 그래서 어느 것이 선택합니까?
- 현재와 인접한 것은 무엇을 의미합니까? 목록이나 항목 배열 (항목에 ID, 가중치 및 값이 있음) 만있는 경우 인접한 항목을 어떻게 알 수 있습니까?
당신의 사고의 주요 결함은 당신이 지나가는 그래프가 무엇인지 놓치고 있다는 것입니다. 가능한 입력 집합의 부분 집합 중 하나를 트래버스하려는 그래프. 따라서 정확히 하나의 항목 만 다른 경우 두 개의 하위 집합이 인접 해 있습니다. '현재가 목표 인 경우'는 BFS의 일반적인 사용에서 비롯됩니다. BFS는 그래프에서 특정 노드를 검색하는 것입니다 (예 : 경로 검색). 정확한 솔루션을 위해서는 전체 그래프를 철저하게 검색해야하므로이 경우에는 적용되지 않습니다. 트래버스 할 노드/서브 세트가 없어지면 종료 할 수 있습니다. – Paul
@ Paul 감사에 감사드립니다! 이제 내가 만드는 것은 가방에 들어갈 수있는 모든 솔루션 조합을 갖춘 나무라는 것을 이해합니다. 그래서 지금 내가하는 일은 위의 의사 코드와 똑같이하는 것입니다. 그러나 각 부분에 대한 노드 대신 두 개의 노드 (하나는 가져온 항목을 나타내고 다른 하나는 잡히지 않은 항목)를 나타냅니다. 또한 While 루프가 끝난 후 전체 경로를 추출하기 위해 부모 노드로 current를 추가하려고합니다. 내가 생각한 것처럼 들리는가? – Werflow
아닙니다. 예를 들어 비어있는 집합을 말합니다. 임의의 항목 선택을 포함하는 집합으로 시작하는 그래프를 작성해야합니다. 예를 들어 각 노드는 집합에서 하나의 요소를 추가하거나 제거한 것을 제외하고는 인접 요소와 동일한 집합을 포함합니다. 경로를 추출 할 필요가 없습니다. 예 : input-set ='{1, 2, 3, 4}', n ='{2}'이웃 = {1}, {2, 3}, {2, 4}} '. DFS 또는 BFS를 사용하여이 그래프를 탐색하고 최적의 솔루션으로 노드를 추출하십시오. [이 답변] (http://stackoverflow.com/a/41912756/4668606)은 원하는 것을 요약합니다. – Paul