선택적으로 사라질 수있는 노드와 가장자리 사이에 여러 개의 가장자리가 허용 된 그래프를 나타내는 방법


11

나는 가상의 이상적인 네트워크 사용을 모델링하기 위해 어떤 종류의 데이터 구조를 사용할 것인지 알아 내려고 노력 중이다.

필자의 시나리오에서 서로에게 적대적인 많은 사용자는 모두 잠재적 인 연결이 모두 알려진 컴퓨터 네트워크를 형성하려고합니다. 한 사용자가 연결해야하는 컴퓨터는 다른 사용자가 연결해야하는 컴퓨터와 동일하지 않을 수도 있습니다. 사용자 1은 컴퓨터 A, B 및 D를 연결해야하지만 사용자 2는 컴퓨터 B, C 및 E를 연결해야 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

NCTM Graph Creator를 사용하여 생성 된 이미지

이것의 핵심은 컴퓨터를 나타내는 노드와 이더넷 케이블을 나타내는 가장자리가있는 무 방향 순환 그래프 일 것이라고 생각합니다. 그러나 시나리오의 특성으로 인해 인접 목록과 인접 행렬을 배제하는 몇 가지 드문 기능이 있습니다 (적어도 사소한 수정은 제외).

  1. 가장자리는 사용이 제한 될 수 있습니다. 즉, 한 사용자가 특정 네트워크 연결을 획득하면 다른 사용자는 해당 연결을 사용할 수 없습니다
    • 이 예에서 녹색 사용자는 컴퓨터 A에 연결할 수 없지만 빨간색 사용자는 컴퓨터 사이에 직접 링크가 없어도 B를 E에 연결했습니다.
  2. 어떤 경우에는 주어진 노드 쌍이 둘 이상의 에지로 연결됩니다
    • 이 예에서는 D에서 E로 연결되는 두 개의 독립 케이블이 있으므로 녹색 및 파란색 사용자가 해당 시스템을 직접 연결할 수있었습니다. 그러나 빨간색은 더 이상 그러한 연결을 만들 수 없습니다
  3. 두 대의 컴퓨터가 둘 이상의 케이블로 연결된 경우 각 사용자는 해당 케이블 중 하나만 소유 할 수 있습니다

이 그래프에서 다음과 같은 몇 가지 작업을 수행해야합니다.

  • 특정 사용자 컴퓨터가 특정 사용자에게 연결되어 있는지 확인
  • 주어진 사용자가 대상 컴퓨터를 연결하기위한 최적의 경로 식별
  • 지정된 사용자에 대한 대기 시간이 가장 긴 컴퓨터 연결 식별 (예 : 분기가없는 가장 긴 경로)

내 첫 번째 생각은 단순히 모든 가장자리의 모음을 만드는 것이었지만 검색에는 끔찍합니다. 내가 지금 생각할 수있는 가장 좋은 것은 목록의 각 항목에 가장자리 길이뿐만 아니라 비용과 현재 소유자가 포함되도록 인접 목록을 수정하는 것입니다. 이것은 합리적인 접근입니까? 공간이 중요하지 않다고 가정하면 단일 그래프가 아닌 여러 개의 그래프 사본 (각 사용자 당 하나씩)을 작성하는 것이 합리적입니까?


이것은 어떻게 든 관련이 있습니다. youtube.com/watch?v=xdiL-ADRTxQ
— RubberDuck

나는 그것이 그것이 어떻게 도움이되는지 실제로 보지 못했습니다.
— Pops

그래서 나는 이것에 대해 잠시 생각했습니다. 대부분의 그래프 알고리즘에는 주로 이웃을 열거하거나 가장자리의 무게를 찾는 두 가지 작업이 필요합니다. 나열된 질문에는 모두 한 명의 사용자 만 관련됩니다. 단일 사용자의 경우, 이웃을 열거하거나 에지의 가중치를 찾는 것은 일정한 시간 (사용자 수가 제한되는 경우) 또는 "소유권"으로 인접 목록 또는 매트릭스를 미러링하여 로그 N에 응답 할 수 있습니다. 이를 위해, 나는 쉽게 확장 될 수 있고 사용자 부분에 방해받지 않고 전통적인 강점을 기반으로 선택되어야한다고 생각합니다.
— J Trana

답변:


6

공간이 중요하지 않다고 가정하면 단일 그래프가 아닌 여러 개의 그래프 사본 (각 사용자 당 하나씩)을 작성하는 것이 합리적입니까?

"계층화 된 그래프"라는 레이블을 붙일 수있는 것, 즉 그래프를위한 결합자를 추가 @해야합니다.

  • A와 B가 그래프이면 A @ B도 그래프입니다 (즉, 그래프 라이브러리의 알고리즘에 제공 될 수 있음).
  • A @ B의 정점 세트는 A와 B의 정점 조합입니다.
  • A @ B의 모서리 세트는 A와 B의 모서리의 결합입니다.
  • 구조체 A @ B는 꼭지점이나 모서리를 소유하지 않지만 A와 B를 데이터 컨테이너로 사용합니다.

이러한 계층 그래프를 사용하면 K를 kommon 사용 가능한 정보로 정의하고 각 개인 정보를 R, G, B로 정의하여 각 플레이어가 실제로 R @ K, G @ K, B @ K를 볼 수 있도록 할 수 있습니다.

실제로 이것을 구현하기 위해 일반적으로 알고리즘을 구현하는 그래프 라이브러리를 찾을 수 있습니다. 즉, 가장 긴 경로 알고리즘 등은 그래프의 실제 표현에 의해 매개 변수화됩니다. 도서관에서

ConcreteGraphAlgorithms = GenericAlgorithms(ConcreteGraphImplementation)

당신은 쉽게 그것을 대체 할 수 있습니다

LayeredGraphAlgorithms = GenericAlgorithms(LayeredGraphs(ConcreteGraphImplementation))

LayeredGraphs도서관에서 나머지를 공급 하고 빌리 는 곳 .


내 이전 의견을 무시하고 대답을 조금 읽었습니다. 기존 그래프 라이브러리를 활용하지 못했지만 기본적으로 내가하고있는 일입니다. 어리석게도 존재하는지 알지 못했기 때문입니다.
— Pops

1

필요한 것은 "속성 그래프"입니다. 기여 그래프에서 정보 (속성)가 호에 첨부됩니다. 가장 간단한 기여 그래프 중 하나의 칭량 그래프.

기여 그래프를 나타내려면 각 셀에 더 많은 정보를 추가하여 열 또는 인접 행렬을 추가하여 인접 목록을 사용할 수 있습니다. 속성에 따라 호를 필터링하면 비 속성 그래프에 대한 대부분의 알고리즘이 작동합니다. 기여 그래프를 위해 많은 알고리즘이 개발되었으므로 여기서는 설명하지 않겠습니다.


1
인접 행렬은 일반적으로 각 노드 쌍 사이의 에지를 둘 이상 나타낼 수 없습니다
— jk.

1
@ jk, 일반적으로 맞습니다. 그러나 인접 행렬에 첨부 된 정보는 호의 수와 각 호에 대한 개별 속성을 가질 수 있습니다. 그러나 대부분의 경우 인접 목록이 더 간단하기 때문에 인접 목록을 사용합니다.
— walrii

1
당신은 당신이 효과적으로 어쨌든 adjaceny 목록이 셀에 대한 모든 가장자리에 대한 정보를 부착하는 경우, 당신은 매트릭스 밀도 그래프 당신을 제공하는 혜택을 잃게
— JK합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.