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


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.