조항

15.3: NetworkX로 네트워크 모델 구성하기 - 수학

15.3: NetworkX로 네트워크 모델 구성하기 - 수학



We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.

그래프 이론 용어에 대한 위의 단기집중 과정을 마쳤으므로 이제 네트워크의 계산 모델링을 시작할 때입니다. 5.4절과 12.2절에서 간략히 살펴보았듯이 다음과 같은 멋진 Python 모듈이 있습니다. 네트워크X [27] 네트워크 모델링 및 분석용. 네트워크 연구자들이 널리 사용하는 무료 네트워크 분석 툴킷입니다. Anaconda를 사용하는 경우 NetworkX가 이미 설치되어 있습니다. Enthought Canopy를 사용하는 경우 패키지 관리자를 사용하여 NetworkX를 쉽게 설치할 수 있습니다. NetworkX에 대한 설명서는 온라인에서 찾을 수 있습니다.http://networkx.github.io.

아마도 우리가 다른 옵션보다 NetworkX를 선택하는 이유를 언급할 가치가 있을 것입니다. 첫째, 해당 기능은 모두 Python으로 작성되었으며 해당 소스 코드는 모두 위의 웹 사이트에서 사용할 수 있으므로 알고리즘의 세부 정보를 확인하고 원하는 경우 코드를 수정할 수도 있습니다. 둘째, NetworkX는 Python의 일반 "사전"을 사용하여 네트워크에 대한 정보를 저장합니다. 네트워크에 대한 정보는 완전히 액세스할 수 있고 추가하려는 추가 정보를 저장할 수 있습니다. 이 속성은 동적 네트워크의 시뮬레이션 모델을 구현할 때 특히 중요합니다. 다른 네트워크 분석 도구에서 구현된 특수 데이터 구조에는 이러한 유연성이 없을 수 있습니다.

그럼 먼저 NetworkX에서 사용하는 자료구조에 대해 알아보겠습니다. NetworkX가 제공하는 다음 네 가지 데이터 유형("클래스"라고 함)이 있습니다.
그래프 무방향 단순 그래프의 경우(자체 루프가 허용됨)
다이그래프 방향이 있는 단순 그래프의 경우(자체 루프가 허용됨)
멀티그래프 무방향 다중 그래프의 경우(자체 루프 및 다중 간선이 허용됨)
멀티다이그래프 방향성 다중 그래프의 경우(자체 루프 및 다중 간선이 허용됨)

모델링 목적에 맞는 이 네 가지 데이터 유형 중 하나를 선택할 수 있습니다. 이 교재에서 사용할그래프그리고다이그래프주로.

자신의 그래프를 수동으로 구성할 수 있습니다. 다음은 예입니다.

여기서는 노드 이름에 문자열을 사용했지만 노드 이름은 숫자, 문자열, 목록 또는 Python의 "해시 가능한" 개체가 될 수 있습니다. 예를 들어 섹션 5.4의 위상 공간 시각화 코드에서 각 노드의 이름에 튜플을 사용했습니다.

노드/가장자리를 추가하거나 제거하기 위해 위에서 사용된 각 명령은 매우 자명하다고 생각합니다. 그렇지 않은 경우 언제든지 NetworkX의 온라인 설명서에서 각 명령의 작동 방식에 대해 자세히 알아볼 수 있습니다. 여기에 자세히 설명되지 않은 그래프 개체를 조작하는 다른 몇 가지 방법도 있습니다.

이 코드가 실행되면 다음과 같이 Python 명령줄에서 결과를 볼 수 있습니다.

첫 번째 출력("<networkx.classes. ... >”)는 다음을 보여줍니다.G이다그래프물체. 객체의 데이터 내용을 보려면 몇 가지 명령을 사용해야 합니다.g.노드()네트워크의 모든 노드 목록을 반환하는 반면g.edges()모든 에지의 목록을 반환합니다. 이 결과를 위에서 사용한 명령과 비교하여 노드/에지 추가/제거가 올바르게 수행되었는지 확인합니다.

저것들노드()그리고가장자리()내부의 원시 데이터를 읽는 함수입니다.그래프객체 g를 생성한 다음 노드 또는 에지의 정리된 목록을 생성합니다. 그러나 NetworkX를 사용하면 Graph 개체의 내부 원시 데이터 구조에 직접 액세스할 수도 있습니다. 노드에 대한 데이터는 사전이라는 사전에 저장됩니다.마디바로 밑에G:

이것은 키와 값이 각각 노드의 이름과 속성인 사전입니다. 각 노드의 속성은 사전에도 저장되므로(초기에는 위에 표시된 것처럼 모두 비어 있음) 다음과 같이 노드 속성을 동적으로 추가하거나 수정할 수 있습니다.

이 방법을 사용하여 섹션 16.2에서 노드에 동적 상태를 추가합니다.

마찬가지로 에지에 대한 데이터도 딕셔너리에 저장됩니다.가장자리g 아래:

이것은 읽기가 조금 어렵습니다. 데이터 구조가 더 명확하도록 적절한 위치에 줄 바꿈을 삽입하겠습니다.

이제 그 구조가 훨씬 더 명확해졌습니다.g.edge네트워크의 가장자리를 설명하는 사전입니다.인접 목록체재. 각 항목의g.edge노드 이름과 이웃을 포함하는 사전의 쌍입니다. 예를 들어, 첫 번째 항목은 Jeff가 Jane 및 Jill과 연결되어 있다고 말합니다. 연결은 완벽하게 대칭입니다. Jeff가 Jane에 연결되어 있으면 Jane에 대한 항목(마지막 줄)에도 Jeff가 이웃으로 포함됩니다. 이러한 대칭은 NetworkX에 의해 자동으로 유지됩니다.그래프개체는 무방향 그래프용입니다.

또한 각 이웃의 이름은 연결 속성을 저장할 수 있는 다른 사전과 연결된 키로 작동합니다(초기에는 위에 표시된 것처럼 모두 비어 있음). 따라서 다음과 같이 가장자리 속성을 동적으로 추가하거나 수정할 수 있습니다.

다시, 출력은 가독성을 향상시키기 위해 다시 포맷됩니다. 새 가장자리 속성('신뢰하다' 제프와 제인 사이; '사랑'(Josh와 Jess 사이)가 각 사전에 올바르게 삽입되어 항상 노드 간의 대칭을 유지합니다. 방금 추가했습니다진실사랑' 조쉬에서 제스로, 제스에서 조쉬로! 정말 아름다운 세상입니다. 이것은 모두 우리가 사용하기 때문입니다.그래프물체.

NS다이그래프개체가 다르게 동작합니다. 방향 그래프를 나타내도록 설계되었으므로 간선은 모두 단방향으로 간주됩니다. 다음 예와 같이 대칭은 자동으로 유지되지 않습니다.

마지막 오류 메시지는 그래프가 비대칭이기 때문에 Jess가 이 경우 Josh라는 사람을 모른다는 것을 의미합니다. 인생은 힘들다.

운동 (PageIndex{1})

연습 15.1에 표시된 네트워크를 다음과 같이 표현합니다.그래프NetworkX의 객체.

운동 (PageIndex{2})

주변의 작은 소셜 네트워크(예: 10명)를 다음 중 하나로 나타내십시오.그래프또는다이그래프NetworkX의 객체. 그런 다음 노드와 가장자리에 다음과 같은 속성을 추가합니다.

• 노드 속성: 이름, 나이, 직업, 주소 등.

• Edge 속성: 관계, 연결 가중치 등

위의 예에서는 노드와 에지를 추가하거나 제거하여 네트워크 모델을 수동으로 구성했습니다. 그러나 NetworkX에는 특정 모양의 네트워크를 보다 쉽게 ​​생성할 수 있는 몇 가지 내장 함수도 있습니다. 다음은 몇 가지 예입니다.

마지막 예(Zachary의 가라테 클럽 그래프)는 1970년대에 Wayne Zachary가 보고한 소셜 네트워크의 유명한 고전적인 예입니다[59]. 미국 대학의 가라테 동아리 회원 34명 간의 우정 네트워크입니다. 이러한 예의 에지 목록은 다음과 같습니다.

운동 (PageIndex{3})

10개의 노드로 구성된 완전한 그래프를 생성하여 그래프를 구성한 다음, 각각의 간선을 사용하여 10개의 노드 각각에 새로운 추가 노드를 연결합니다.

운동 (PageIndex{4})

NetworkX의 내장 기능을 사용하여 Zachary의 가라테 클럽 그래프를 만들고 노드와 에지를 검사하여 비 토폴로지 속성이 있는지 확인하십시오.


DataFrame에서 네트워크 그래프로

저는 아주 우연히 JIRA에서 데이터를 내보내는 방법을 너무도 자연스럽게 발견하여 정보를 시각화하고 데이터 세트에서 잠재적으로 통찰력을 얻을 수 있는 방법을 생각하기 시작했습니다. 나는 네트워크 그래프의 개념을 우연히 발견했고 그 아이디어는 내 상상력을 빠르게 사로 잡았습니다. 사람과 사람의 관계뿐만 아니라 단어 사이의 이야기도 할 수 있다는 걸 깨달았어요! 하지만 NLP는 큰 화두니까 먼저 걷고 나중에 달리는 건 어떨까요?!

이것은 매우 부드러운 소개일 뿐이므로 여기서는 멋진 코드를 사용하지 않을 것입니다.

네트워크 그래프는 엔티티가 노드이고 엔티티 간의 연결이 링크 또는 모서리¹를 통해 표시되는 "엔티티 세트 간의 상호 연결을 보여줍니다"¹. 아래 그래프에서 점은 노드이고 선은 가장자리라고 합니다.

이 게시물에서는 널리 사용되는 네트워크 그래프 패키지인 networkx를 사용하여 Pandas 데이터 프레임을 빠르게 시각화할 수 있는 코드를 공유합니다.

먼저 데이터를 가져와 데이터 프레임에 로드합니다. 여기에서 샘플 데이터세트를 다운로드할 수 있습니다.

둘째, 검사하려는 열만 포함하도록 데이터 프레임을 다듬어 보겠습니다. 이 경우 'Assignee' 및 'Reporter' 열만 필요합니다.

셋째, 그래프가 존재할 세상을 만들 차례입니다. 아직 설치하지 않았다면 빠른 pip install networkx 를 수행하여 networkx 패키지를 설치하십시오.

그런 다음 df1 데이터 프레임의 ɺssignee' 및 'Reporter' 열로 그래프를 채우겠습니다.

다음으로, 포맷을 위해 matplotlib를 사용하여 생성한 그래프를 구체화합니다.

위 블록에서 가장 중요한 줄은 nx.draw_shell(G, with_labels=True) 입니다. 엔티티 레이블이 켜진 쉘 레이아웃을 사용하여 그래프 G를 그리도록 컴퓨터에 지시합니다.

짜잔! 우리는 네트워크 그래프를 얻었습니다.

바로 'barbie.doll', 'susan.lee', 'joe.appleseed'의 세 가지 주요 플레이어에서 유래한 라인이 많이 집중되어 있음을 알 수 있습니다. 물론, 확실히 하기 위해 몇 가지 어려운 숫자로 '시선'을 확인하는 것이 항상 좋은 생각입니다.

보너스 라운드

'barbie.doll'을 확인해보자.

'barbie.doll'의 연결 수를 확인하려면 len()을 사용합니다.

다음으로 노드와 연결 수를 표시하는 또 다른 데이터 프레임을 만들어 보겠습니다.

위의 코드 블록에서 먼저 'leaderboard'라는 빈 사전을 초기화한 다음 간단한 for 루프를 사용하여 사전에 이름과 연결 수를 채웠습니다. 그런 다음 사전에서 시리즈를 만들었습니다. 마지막으로 to_frame() 을 사용하여 생성한 시리즈에서 또 다른 데이터 프레임을 생성했습니다.

데이터 프레임을 표시하기 위해 df2.head()를 사용하고 리더보드를 얻었습니다!

그리고 그게 다야! 몇 줄의 간단한 코드로 Pandas 데이터 프레임에서 네트워크 그래프를 빠르게 만들고 이름과 연결 수가 포함된 테이블도 표시했습니다.

나는 당신이 이것을 즐겼기를 바랍니다. 네트워크 그래프 분석은 큰 주제이지만 이 부드러운 소개가 더 많은 것을 탐색하고 레퍼토리를 확장하는 데 도움이 되기를 바랍니다.

다음 기사에서는 'Network Navigator'라는 Power BI의 사용자 지정 시각적 개체를 살펴보고 네트워크 그래프 생성 몇 번의 간단한 마우스 클릭으로.


그래프 및 그래프 알고리즘¶

그래프의 사용은 컴퓨팅에서 널리 퍼져 있습니다. 많은 일상적이고 실용적인 문제를 그래프로 모델링할 수 있습니다. 먼저 몇 가지 종류의 그래프를 구성하고 그리는 방법을 살펴보고 함께 사용할 수 있는 몇 가지 기본 알고리즘에 대해 논의합니다. 실제로 계산을 수행하기 위해 NetworkX 라는 Python 모듈을 사용할 것입니다.

그래프는 노드 모음과 노드 사이의 간선 모음으로 구성되어 있음을 기억하십시오. 그래프는 일반적으로 무향 및 유향의 두 가지 유형으로 제공되며 각각 고유한 목적이 있습니다. 다음은 각 유형의 그래프가 발생할 수 있는 몇 가지 모델 문제입니다.

우리의 첫 번째 문제는 서비스를 확장하고 도시에 광섬유 인터넷을 제공하려는 인터넷 서비스 공급자를 다룹니다. 물론 그들은 가장 저렴한 비용으로 이 작업을 수행하기를 원합니다.

이를 수행하는 가장 좋은 방법을 알아내기 위해 그래프에서 노드로 연결해야 하는 위치와 (무향) 가장자리로 실행될 케이블의 잠재적인 라인을 모델링합니다. 또한 이러한 모서리에는 케이블 비용이나 케이블용 도랑을 파는 데 드는 노동력과 같은 요인으로 인해 비용이 가중됩니다. 이 문제를 어떻게 해결해야 할까요?

물론 이것은 우리가 좁은 연결 감각에 초점을 맞추기 때문에 보다 현실적인 문제의 다소 단순화된 버전입니다. 좀 더 합리적인 요구 사항은 약간의 중복성을 구축할 것입니다. 예를 들어 케이블이 손상된 경우 전체 네트워크가 다운되지 않습니다.

두 번째 문제는 스케줄링을 다룹니다. 우리가 가지고 있는 것은 완료해야 하는 많은 작업입니다. 캐치는 다른 작업이 완료될 때까지 일부 작업을 시작할 수 없다는 것입니다. 예를 들어 집을 짓는다면 기초를 놓기 전에 땅을 파야 합니다. 반면에 원하는 조명이나 배경 화면의 종류를 결정하는 것은 완전히 독립적이며 다른 사람이 동시에 수행할 수 있습니다.

태스크가 노드이고 유향 모서리가 태스크 간의 종속성을 인코딩하는 유향 그래프로 이 문제를 모델링합니다. 따라서 "태스크 B"가 "태스크 A"를 먼저 완료해야 하는 경우 가장자리 "태스크 A -> 태스크 B"가 있을 수 있습니다. 목록을 완성할 때 모든 종속성이 충족되도록 하는 정렬된 작업 목록을 제공하는 토폴로지 정렬이라는 멋진 알고리즘이 있음을 알 수 있습니다.


실제 네트워크

실제 네트워크와 특히 소셜 네트워크는 무작위 수학적 네트워크와 종종 다른 고유한 구조를 가지고 있습니다.

    현상은 실제 네트워크가 연결된 네트워크 구성원 간에 매우 짧은 경로(홉 수 측면에서)를 갖는 경우가 많다고 주장합니다. 이것은 실제 및 가상 소셜 네트워크(6가지 핸드셰이크 이론)와 웹 트래픽 라우팅의 공항 또는 전기와 같은 물리적 네트워크에 적용됩니다. 멱법칙 정도 분포를 사용하면 소수의 고도로 연결된 노드(예: 사회적 영향)와 느슨하게 연결된 많은 노드가 있는 편향된 인구가 있습니다. 개인이 유사한 다른 사람들과 연합하고 결속하려는 경향으로 이웃 간에 유사한 속성이 나타납니다.

Python 3.5에서 networkx와 함께 사용할 pydot 설치 시도

저는 최근에 Yosemite를 실행하는 Mac에서 Python 3.5를 사용하기 시작했으며 모듈 networkx를 사용하여 그래픽/네트워크 모델에 대한 일부 비주얼을 컴파일하고 생성하려고 합니다. 저는 프로그래밍 경험이 많지 않기 때문에 세부 사항을 빠뜨리면 사과드립니다.

networkx를 성공적으로 설치했지만(명령을 사용할 수 있음) 현재 플롯 생성을 용이하게 하는 선택적 모듈 중 하나인 GraphViz를 설치하는 데 어려움을 겪고 있습니다. 명령 프롬프트 setup.py 설치 명령을 통해 실행하여 GraphViz를 설치하려고 했지만 GraphViz 설치에는 다른 모듈인 PyDot(좀 더 구체적으로 PyDot2: pydot2-1.0.33-py3.5.egg.info)가 필요한 것 같습니다. PyDot이 올바르게 작동하지 않는 것처럼 보이기 때문에 문제가 있습니다. PyDot을 사용하는 networkx 명령을 실행할 때 다음 오류가 계속 발생합니다(test2.py는 테스트 그래픽 모델임).

몇 가지 조사를 하고 놀고 난 후에 문제는 내가 설치한 PyDot 버전이 Python 3.5와 호환되지 않는다는 것입니다. 그러나 Python 3+와 호환된다고 명시적으로 말하는 PyDot2를 설치했기 때문에 이것이 어떻게 될 수 있는지 이해하지 못합니다.


공항 및 경로 데이터 세트 처리:

Networkx는 원시 형식의 데이터를 읽을 수 없으므로 첫 번째 작업은 데이터를 처리하여 Networkx가 읽을 수 있는 경로의 깨끗한 데이터 프레임을 획득하는 것입니다. 여기서 우리가 사용하는 팬더 Excel 파일을 데이터 프레임으로 구문 분석하고 정보를 추출 및 처리합니다. 두 데이터 세트가 공항 코드(세 글자 IATA 코드)로 어떻게 연결되어 있는지 확인하십시오. 여기에서 내 소스 코드의 데이터를 처리하기 위한 전체 코드를 찾을 수 있습니다.

데이터 처리 단계의 목표는 다음 두 Panda 데이터 프레임을 획득하는 것입니다.

  • 응축된 route_us 각 행이 고유한 항공 노선을 나타내고 해당 노선에서 운항하는 총 항공사 수를 나타내는 데이터 프레임(예: 리하이 밸리 공항(ABE)에서 애틀랜타 국제 공항(ATL)까지 항공편을 운항하는 3개의 항공사가 있습니다.

  • 응축된 위치 각 행이 IATA 코드로 각 미국 공항을 나타내는 데이터 프레임, 그리고 더 중요한 것은 경도 및 위도 세부 정보입니다.

이전 데이터 프레임을 사용하여 비행 네트워크의 첫 번째 스케치를 그릴 준비가 되었습니다.

처음에는 데이터 프레임을 그래프로 변환했습니다. 그래프는 방향이 있는 그래프, 즉 방향이 연결된 모서리로 연결된 정점 집합이 있는 그래프입니다. 이것은 우리 그래프에서 두 경로 JFK-ATL과 ATL-JFK가 구별된다는 것을 의미합니다. 두 경로는 동일한 두 노드를 연결하지만 두 경로는 서로 다른(반대) 방향을 갖기 때문입니다.

우리는 Networkx의 from_panda_dataframe() 함수를 사용하여 그래프를 빠르게 가져올 수 있습니다. 여기서 우리는 데이터 프레임에서 그래프를 만듭니다. route_us, 소스가 '소스 공항' 열인 경우 대상은 방향 그래프 모델을 사용하는 '목적지 공항' 열입니다. edge_attr은 그래프의 가장자리에 정보를 추가할 수 있음을 의미합니다. edge 속성으로 노선에서 운항하는 항공사의 수를 추가했습니다.

Networkx에는 네트워크를 그리는 데 사용할 수 있는 그래픽 도구가 있습니다.

이 거친 네트워크의 문제는 어느 공항이 어느 공항이고 경로가 서로 어떻게 관련되어 있는지 알 수 없다는 것입니다. 미국 지도에서 정확한 지리적 위치에 공항을 표시하는 것이 더 나을 수도 있습니다. NS우리가 그렇게 합니까? 아, 베이스맵 .


6단계 분리

이러한 메시지 전송에는 평균 6개의 홉만 필요합니다. 평균적으로 6명만이 그의 메시지를 전달할 수 있다는 것을 의미하며, 멀리 떨어진 메시지를 전달하는 데 필요한 소수의 친구는 믿을 수 없습니다. 그러나 왜 그렇게 적은 홉이 있습니까?

정답은 동성애(유사한 노드가 높은 클러스터링 계수로 연결 및 커뮤니티 형성) 그리고 약한 유대(일반적으로 두 클러스터 사이를 연결합니다.). 이웃 사람들은 매우 잘 연결되어 있지만 동시에 가능성은 낮지만 여전히 가능한 멀리 떨어진 노드에 연결되어 있음을 의미합니다. 친구 중 한 명이 캘리포니아에 있는 사람을 알 수 있는 것처럼 다른 한 사람은 유럽에 있는 사람을 알고 있습니다.

이 두 가지 모두는 두 커뮤니티가 있는 Zachary 클럽의 위 예에서 논의됩니다. 동성애로 인해 두 개의 유사한 노드가 연결되고 일부 친구가 반대 그룹에 있을 수 있는 약한 유대로 인해 높은 사이 가장자리가 발생합니다.

실제 네트워크에서는 작은 것보다 긴 관계를 형성할 확률이 적다는 것과 같은 확률론적인 설명으로 이해할 수 있습니다. 이유는 위의 경우와 같이 지리적인 이유가 될 수 있습니다. 그 결과 이웃이 덜 겹치게 됩니다.

네트워크 데이터 세트에서 이를 감지하는 방법은 무엇입니까? 6에 가까우거나 네트워크 크기에 비해 매우 작을 평균 최단 경로 길이만 분석합니다. 즉, 그래프/네트워크 전시 작은 세계 현상.

먼저 원하는 형식의 원하는 그래프를 읽고 문서를 참조하십시오. 그런 다음 코드 조각에서 다음 함수를 사용합니다.

이 후에 모든 ego-net의 edgelist 형식 데이터를 포함하는 SNAP의 facebook_combined 데이터 세트를 실제 데이터 세트에 적용해 보겠습니다. 그리고 사용자들이 어떻게 서로 연결되었는지 Cambridge-analytica의 사례 연구를 시뮬레이션하려고 하면 matplotlib로 이를 시각화할 것을 권장합니다.

6에서 이렇게 거리가 줄어든 것은 밀그램이 실험을 했을 때보다 세계가 더 많이 연결되어 있는 세계화로 인해 연결하기가 훨씬 쉬워졌기 때문이라고 할 수 있습니다.

자, 이 결과의 해석은 무엇입니까? 평균 최단 경로 속성이 매우 작은 매우 큰 규모의 그래프입니다. 그것은 우리가 두 노드 사이의 관계를 검색할 수 있음을 의미합니다. O(k) 일정한 시간. 이를 분산 검색이라고도 합니다. 또는 우리의 연결에서 특정 범위까지만 볼 수 있는 근시 검색. 이렇게 하면 일정한 시간 조회로 거리에 관계없이 두 노드의 정보를 추출할 수 있습니다.

이러한 현상의 의미를 상상해 보십시오. 이는 인접 노드와 관계없이 노드와 매우 빠른 속도로 정보를 교환하는 결과를 낳을 것입니다. 이것은 Vines, Memes가 인터넷을 통해 널리 퍼지고 있음을 분명히 알 수 있으며 아마도 이 현상의 결과로 'Break Internet'이라는 용어가 만들어졌을 것입니다.


그래프는 노드 모음과 노드 사이의 간선 모음으로 구성되어 있음을 기억하십시오. 그래프는 일반적으로 무향 및 유향의 두 가지 유형으로 제공되며 각각 고유한 목적이 있습니다.

일종의 미리보기로 각 유형의 그래프가 발생할 수 있는 몇 가지 모델 문제를 생각해 보겠습니다.

우리의 첫 번째 문제는 서비스를 확장하고 도시에 광섬유 인터넷을 제공하려는 인터넷 서비스 공급자를 다룹니다. 물론 그들은 가장 저렴한 비용으로 이 작업을 수행하기를 원합니다.

이를 수행하는 가장 좋은 방법을 알아내기 위해 그래프에서 노드로 연결해야 하는 위치와 (무향) 가장자리로 실행될 케이블의 잠재적인 라인을 모델링합니다. 또한 이러한 모서리에는 케이블 비용이나 케이블용 도랑을 파는 데 드는 노동력과 같은 요인으로 인해 비용이 가중됩니다. 이 문제를 어떻게 해결해야 할까요?

물론 이것은 우리가 좁은 연결 감각에 초점을 맞추기 때문에 보다 현실적인 문제의 다소 단순화된 버전입니다. 좀 더 합리적인 요구 사항은 약간의 중복성을 구축할 것입니다. 예를 들어 케이블이 손상된 경우 전체 네트워크가 다운되지 않습니다.

두 번째 문제는 스케줄링을 다룹니다. 우리가 가지고 있는 것은 완료해야 하는 많은 작업입니다. 캐치는 다른 작업이 완료될 때까지 일부 작업을 시작할 수 없다는 것입니다. 예를 들어 집을 짓는다면 기초를 놓기 전에 땅을 파야 합니다. 반면에 내가 원하는 조명이나 배경 화면의 종류를 결정하는 것은 완전히 독립적이며 다른 사람이 동시에 수행할 수 있습니다.

태스크가 노드이고 유향 모서리가 태스크 간의 종속성을 인코딩하는 유향 그래프로 이 문제를 모델링합니다. 따라서 "태스크 B"에서 "태스크 A"를 먼저 완료해야 하는 경우 "태스크 A -> 태스크 B"에 우위가 있을 수 있습니다. 우리는 우리가 목록을 완성할 때 모든 종속성을 보장하는 정렬된 작업 목록을 제공하는 토폴로지 정렬이라는 멋진 알고리즘이 있음을 알 수 있습니다.


결론

다음은 이 연구의 세 가지 주요 내용입니다. 첫째, 이러한 패키지를 설치하는 것이 훨씬 쉽습니다. 더 이상 모든 문서를 뒤지고 설치를 만지작거릴 필요가 없습니다. 대부분의 패키지는 이제 인기 있는 패키지 관리자에서 한 줄로 설치할 수 있습니다. 일부는 도커 빌드를 제공하기도 합니다.

둘째, 모든 패키지에서 상당한 개선이 있었습니다. 이것이 네트워크 분석이 대중화되었기 때문인지 아니면 대부분의 패키지 관리자가 2019년에 주요 업데이트를 릴리스하기로 결정한 것이 단지 좋은 우연의 일치인지 확실하지 않습니다. 어느 쪽이든 즐길 수 있는 최종 사용자에게는 좋은 소식입니다. 인기 있는 알고리즘에서 2-10배 속도 향상.

셋째, 대부분의 이러한 패키지에서 알고리즘의 실행 시간은 특히 컴파일된 언어(C, C++, Julia)를 기반으로 하는 경우 상대적으로 비슷합니다. 예제는 연결된 구성 요소 결과를 참조하십시오. 스레드 버전의 알고리즘을 구현하는 올바른 패키지를 찾는 것보다 속도가 가장 중요한 경우 다음 고려 사항일 것입니다.

R/Python 배경에서 가져온 패키지에 대한 권장 사항을 찾고 있다면(저와 같이) 그래프 알고리즘의 기본을 선택하기 위해 networkx를 추천합니다. 다음 단계로 나아가고 더 성능이 뛰어난 솔루션을 찾고 있다면 즉시 사용 가능한 알고리즘이 필요한 모든 것을 제공한다면 igraph, graph-tool 및 networkit가 좋은 선택인 것 같습니다. 새로운 언어를 고려할 의향이 있다면 라이트그래프는 매우 유망하며 다른 C/C++ 대안보다 학습 곡선이 더 낮은 것 같습니다. 물론, 해결해야 할 특정 문제가 있는 경우 - 다른 모든 패키지보다 광범위하게 우수한 패키지가 없다는 점을 감안할 때 이를 벤치마킹할 가치가 있습니다. 이 경우 내 코드를 확장하고 필요에 맞게 수정하십시오.


15.3: NetworkX로 네트워크 모델 구성하기 - 수학

NetworkX는 복잡한 네트워크의 구조, 역학 및 기능을 생성, 조작 및 연구하기 위한 Python 언어 소프트웨어 패키지입니다. 노드와 에지가 있는 그래프 형태로 표현되는 크고 복잡한 네트워크를 연구하는 데 사용됩니다. networkx를 사용하여 복잡한 네트워크를 로드하고 저장할 수 있습니다. 우리는 다양한 유형의 랜덤 및 클래식 네트워크를 생성하고, 네트워크 구조를 분석하고, 네트워크 모델을 구축하고, 새로운 네트워크 알고리즘을 설계하고, 네트워크를 그릴 수 있습니다.
패키지 설치:

노드 생성

그래프 G에 노드를 생성합시다. 노드 1, 2, 3, 4, 7, 9를 추가한 후

모서리 생성

한 번에 한 모서리 추가:

모서리를 추가한 후 (1,2), (3,1), (2,4), (4,1), (9,1), (1,7), (2,9)

노드 및 에지 제거

다음 기능 중 하나를 사용하여 그래프를 파괴할 수 있습니다.

다음 게시물에서는 가중치 그래프, 방향 그래프, 다중 그래프를 만드는 방법에 대해 설명합니다. 그래프를 그리는 방법. 이후 게시물에서 깊이 주먹 검색(dfs), 너비 우선 검색(BFS), dijkstra 최단 경로 알고리즘과 같은 내장 기능을 사용하는 방법을 살펴보겠습니다.

참조 :
Github의 Networxx

이 기사는 프라틱 차예르. GeeksforGeeks가 마음에 들고 기여하고 싶다면 Contribute.geeksforgeeks.org를 사용하여 기사를 작성하거나 [email protected]로 기사를 우편으로 보낼 수도 있습니다. GeeksforGeeks 메인 페이지에 나타나는 귀하의 기사를 보고 다른 Geeks를 도우십시오.

잘못된 점을 발견하거나 위에서 논의한 주제에 대해 더 많은 정보를 공유하고 싶은 경우 의견을 작성해 주십시오.

독자 주목! 지금 학습을 중단하지 마십시오(&rsquot). 모든 중요한 DSA 개념을 파악하십시오. DSA 자율 학습 과정 학생 친화적 인 가격으로 산업 준비가 되십시오. 언어 학습에서 DS Algo 등의 준비를 완료하려면 다음을 참조하십시오. 면접 준비 과정 완료.


비디오 보기: 소셜 네트워크 용 Python 02: Networkx에서 노드 생성 (팔월 2022).