Cách tính cây bao trùm tối thiểu trong R


8

Cho một đồ thị gồm N đỉnh và khoảng cách giữa các cạnh của các đỉnh được lưu trữ trong tuple T1 = (d11, d12, …, d1n) to Tn = (dn1, dn2, …, dnn). Tìm ra một cây bao trùm tối thiểu của đồ thị này bắt đầu từ đỉnh V1. Ngoài ra, in tổng quãng đường di chuyển cần thiết để di chuyển cây được tạo này.

Example:
For N =5 
T1 = (0, 4, 5, 7, 5)
T2 = (4, 0, 6, 2, 5)
T3 = (5, 6, 0, 2, 1)
T4 = (7, 2, 2, 0, 5)
T5 = (5, 5, 1, 5, 0)

Selection of edges according to minimum distance are:
V1 -> V2 = 4
V2 -> V4 = 2
V4 -> V3 = 2
V3 -> V5 = 1

Thus, MST is V1 -> V2 -> V4 -> V3 -> V5 and the distance travelled is 9 (4+2+2+1)

Theo nghĩa đen, tôi không có ý tưởng về cách tạo một đồ thị gồm n đỉnh trong R.

Tôi đã tìm kiếm trong google nhưng tôi không hiểu làm thế nào để tiếp cận vấn đề trên.

Làm ơn giúp tôi.


Bạn đã kiểm tra igraphgói , hoặc câu hỏi này hoặc chức năng này ?
bretauv

Trên thực tế, tôi không có biểu đồ, tôi có cần tạo biểu đồ với n đỉnh không? Một chút bối rối với câu hỏi
Magie

Tôi nghĩ rằng chúng ta có thể tính toán cây bao trùm tối thiểu nếu chúng ta có biểu đồ. Làm thế nào để có được biểu đồ N đỉnh đại diện cho senario như trong câu hỏi?
Magie

1
Tôi nghĩ bạn chỉ có thể sử dụng mst(g)nhưng có lẽ cũng được mst(g, weights = E(g)$weights)?
20650

1
sum(E(mg)$weight), đâu mglà biểu đồ cây bao trùm tối thiểu
user20650

Câu trả lời:


4

Câu hỏi của bạn dường như không khớp với tiêu đề - bạn đang ở sau khi tạo biểu đồ không phải là MST? Khi bạn đã có một biểu đồ, như @ user20650 nói, bản thân MST rất dễ dàng.

Thật dễ dàng để tạo một biểu đồ có kích thước n , nhưng có rất nhiều điều phức tạp về các nút được kết nối và trọng số (khoảng cách) mà bạn không cho chúng tôi biết, vì vậy đây là một minh họa thực sự cơ bản.

Nếu chúng ta giả sử rằng tất cả các nút được kết nối với tất cả các nút khác (biểu đồ đầy đủ), chúng ta có thể sử dụng make_full_graph. Nếu đó không phải là trường hợp, bạn cần dữ liệu để nói nút nào được kết nối hoặc sử dụng biểu đồ ngẫu nhiên.

# create graph
n <- 5
g <- make_full_graph(n)

Vấn đề tiếp theo là khoảng cách. Bạn chưa cung cấp cho chúng tôi bất kỳ thông tin nào về cách các khoảng cách đó được phân phối, nhưng chúng tôi có thể chứng minh việc gán chúng cho biểu đồ. Ở đây, tôi sẽ chỉ sử dụng các số [0-1] thống nhất ngẫu nhiên:

# number of edges in an (undirected) full graph is (n2 - n) /2 but
# it is easier to just ask the graph how many edges it has - this
# is more portable if you change from make_full_graph
n_edge <- gsize(g)
g <- set_edge_attr(g, 'weight', value=runif(n_edge))
plot(g)

Đồ thị ngẫu nhiên

Bit tiếp theo chỉ là chính MST, sử dụng minimum.spanning.tree:

mst <-  minimum.spanning.tree(g)

Đầu ra msttrông như thế này:

IGRAPH dc21276 U-W- 5 4 -- Full graph
+ attr: name (g/c), loops (g/l), weight (e/n)
+ edges from dc21276:
[1] 1--4 1--5 2--3 2--5

Tôi cũng không biết về cách tính khoảng cách, đó là lý do tại sao tôi bối rối. Tôi đã đăng câu hỏi đầy đủ. Họ chỉ cung cấp nhiều thông tin. Và tôi là người mới trong chủ đề MST này.
Magie

Chúng tôi không thể giúp với điều đó. Nếu bạn chưa được cung cấp thông tin về cấu trúc biểu đồ ngoài n nút, thì chỉ có thể đưa ra câu trả lời chung chung với một số giả định. Bạn có thể sử dụng các biểu đồ ngẫu nhiên và phân phối độ dài cạnh khác nhau và mã vẫn sẽ đưa ra câu trả lời
David_O

Vâng tôi biết nếu không có biểu đồ và khoảng cách thông tin thì rất khó để giúp đỡ. Với thông tin đó user20650đã giúp tôi. Thế là đủ.
Magie

Nhân tiện, câu trả lời của bạn rất hữu ích cho tôi vì tôi đã biết cách tạo một biểu đồ trong R. Cảm ơn bạn.
Magie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.