Vấn đề dòng chảy chi phí tối thiểu


9

Một luồng trên mạng là một đồ thị có hướng G = (V, E)với một đỉnh nguồn s ϵ Vvà một đỉnh bồn rửa t ϵ V, và nơi mỗi cạnh (u, v) ϵ Etrên đồ thị (kết nối các nút u ϵ Vv ϵ V) có 2 đại lượng liên kết với nó:

  1. c(u, v) >= 0, công suất của cạnh
  2. a(u, v) >= 0, chi phí gửi một đơn vị qua các cạnh

Chúng tôi xác định một hàm 0 <= f(u, v) <= c(u, v)là số lượng đơn vị được truyền qua một cạnh nhất định (u, v). Vì vậy, chi phí cho một cạnh nhất định (u, v)a(u, v) * f(u, v). Các vấn đề dòng chảy tối thiểu chi phí được định nghĩa là giảm thiểu tổng chi phí trên tất cả các cạnh trong một khoảng dòng chảy cho d, do số lượng như sau:

Giá cả

Các ràng buộc sau đây áp dụng cho vấn đề:

  1. Yêu cầu về công suất : lưu lượng qua một cạnh cho trước có thể không vượt quá khả năng của cạnh đó ( f(u, v) <= c(u, v)).
  2. Đối xứng Skew : dòng chảy mặc dù một cạnh đã cho phải đối xứng khi hướng ngược lại ( f(u, v) = -f(v, u)).
  3. Bảo tồn dòng chảy : lưu lượng ròng vào bất kỳ nút không nguồn không chìm nào phải bằng 0 (đối với mỗi nút u ∉ {s, t}, tổng trên tất cả w, sum f(u, w) = 0).
  4. Lưu lượng yêu cầu : lưu lượng ròng ra khỏi nguồn và lưu lượng ròng vào bồn phải vừa bằng lưu lượng yêu cầu qua mạng (tổng cộng tất cả u, sum f(s, u) = sum f(u, t) = d).

Đưa ra một mạng lưu lượng Gvà một luồng yêu cầu d, xuất chi phí tối thiểu để gửi dcác đơn vị qua mạng. Bạn có thể cho rằng một giải pháp tồn tại. dvà tất cả các năng lực và chi phí sẽ là số nguyên không âm. Đối với một mạng có Ncác đỉnh được gắn nhãn [0, N-1], đỉnh nguồn sẽ là 0và đỉnh chìm sẽ là N-1.

Đây là , vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng. Hãy nhớ rằng đây là một cuộc cạnh tranh giữa các ngôn ngữ cũng như giữa các ngôn ngữ, vì vậy đừng ngại đăng một giải pháp bằng ngôn ngữ dài dòng.

Tích hợp được cho phép, nhưng bạn được khuyến khích đưa vào các giải pháp mà không có nội dung, như là một giải pháp bổ sung trong cùng một câu trả lời hoặc là một câu trả lời độc lập.

Đầu vào có thể theo bất kỳ cách hợp lý nào bao gồm năng lực và chi phí của từng cạnh và nhu cầu.

Các trường hợp thử nghiệm

Các trường hợp thử nghiệm được cung cấp theo định dạng sau:

c=<2D matrix of capacities> a=<2D matrix of costs> d=<demand> -> <solution>

c=[[0, 3, 2, 3, 2], [3, 0, 5, 3, 3], [2, 5, 0, 4, 5], [3, 3, 4, 0, 4], [2, 3, 5, 4, 0]] a=[[0, 1, 1, 2, 1], [1, 0, 1, 2, 3], [1, 1, 0, 2, 2], [2, 2, 2, 0, 3], [1, 3, 2, 3, 0]] d=7 -> 20
c=[[0, 1, 1, 5, 4], [1, 0, 2, 4, 2], [1, 2, 0, 1, 1], [5, 4, 1, 0, 3], [4, 2, 1, 3, 0]] a=[[0, 1, 1, 2, 2], [1, 0, 2, 4, 1], [1, 2, 0, 1, 1], [2, 4, 1, 0, 3], [2, 1, 1, 3, 0]] d=7 -> 17
c=[[0, 1, 4, 5, 4, 2, 3], [1, 0, 5, 4, 3, 3, 5], [4, 5, 0, 1, 5, 5, 5], [5, 4, 1, 0, 3, 2, 5], [4, 3, 5, 3, 0, 4, 4], [2, 3, 5, 2, 4, 0, 2], [3, 5, 5, 5, 4, 2, 0]] a=[[0, 1, 4, 2, 4, 1, 1], [1, 0, 3, 2, 2, 1, 1], [4, 3, 0, 1, 4, 5, 2], [2, 2, 1, 0, 2, 2, 3], [4, 2, 4, 2, 0, 4, 1], [1, 1, 5, 2, 4, 0, 2], [1, 1, 2, 3, 1, 2, 0]] d=10 -> 31
c=[[0, 16, 14, 10, 14, 11, 10, 4, 3, 16], [16, 0, 18, 19, 1, 6, 10, 19, 5, 4], [14, 18, 0, 2, 15, 9, 3, 14, 20, 13], [10, 19, 2, 0, 2, 10, 12, 17, 19, 22], [14, 1, 15, 2, 0, 11, 23, 25, 10, 19], [11, 6, 9, 10, 11, 0, 14, 16, 25, 4], [10, 10, 3, 12, 23, 14, 0, 11, 7, 8], [4, 19, 14, 17, 25, 16, 11, 0, 14, 5], [3, 5, 20, 19, 10, 25, 7, 14, 0, 22], [16, 4, 13, 22, 19, 4, 8, 5, 22, 0]] a=[[0, 12, 4, 2, 9, 1, 1, 3, 1, 6], [12, 0, 12, 16, 1, 2, 9, 13, 2, 3], [4, 12, 0, 2, 2, 2, 2, 10, 1, 1], [2, 16, 2, 0, 2, 1, 8, 4, 4, 2], [9, 1, 2, 2, 0, 5, 6, 23, 5, 8], [1, 2, 2, 1, 5, 0, 13, 12, 12, 1], [1, 9, 2, 8, 6, 13, 0, 9, 4, 4], [3, 13, 10, 4, 23, 12, 9, 0, 13, 1], [1, 2, 1, 4, 5, 12, 4, 13, 0, 13], [6, 3, 1, 2, 8, 1, 4, 1, 13, 0]] d=50 -> 213

Các trường hợp thử nghiệm này đã được tính toán với thư viện NetworkX Python .



1
Chơi golf trong một thời gian dài sau đó nhận ra rằng tôi đã chơi golf sai thuật toán vì tôi không thể đọc
Quintec

Câu trả lời:


3

[R + lpSolve ], 201 186 149 144 byte

function(c,a,d,`^`=rep,N=ncol(c),G=diag(N),P=t(1^N),M=P%x%G+G%x%-P)lpSolve::lp(,a,rbind(M,diag(N*N)),c('=','<')^c(N,N*N),c(d,0^(N-2),-d,c))$objv

Hãy thử trực tuyến!

Mã xây dựng vấn đề tuyến tính sau và giải quyết nó bằng lpSolvegói:

minxV yVAx,yfx,ysubject to:xVfv,xfx,v=0vV:v{s,t}xVfs,xfx,s=dxVft,xfx,t=dfx,bCx,bxV,yV

  • V
  • s
  • t
  • Ax,yx -> y
  • fx,yx -> y
  • dts
  • Cx,yx -> y

Đẹp, lập trình tuyến tính :) Thật không may, hầu hết các ngôn ngữ không có lpSolve... :(
Quintec

Thật không may đúng ... BTW nó không có sẵn trên cơ sở R, đó là một gói ... Tôi đã phải yêu cầu cài đặt trên TIO;)
digEmAll

Vì một số lý do, tôi vẫn chưa tìm thấy một cách ngắn gọn để sửa đổi MinCostMaxFlow thành MinCostFlow ... bộ não của tôi bị xáo trộn lol, tôi ước có một chức năng cho điều này trong các ngôn ngữ khác ngoài toán học
Quintec

@Quintec: bạn đang đề cập đến một triển khai cụ thể (ví dụ: bằng một ngôn ngữ nhất định) của MinCostMaxFlow?
digEmAll

Không, thuật toán mã hóa tay của tôi
Quintec

1

Ngôn ngữ Wolfram, 42 byte

FindMinimumCostFlow[#,1,VertexCount@#,#2]&

Nội dung tầm thường. Sắp có giải pháp dựng sẵn.


Nó sẽ đến trong 6-8 tuần? : P
Quintec

1

Python 3 + NetworkX , 137 byte

from networkx import*
def f(g,d,z='demand'):N=len(g)**.5//1;G=DiGraph(g);G.node[0][z]=-d;G.node[N-1][z]=d;return min_cost_flow_cost(G)

Không có liên kết TryItOnline vì TIO không cài đặt thư viện NetworkX

Lấy đầu vào biểu đồ dưới dạng danh sách cạnh với các thuộc tính dung lượng và trọng lượng, như thế này:

[(0, 0, {'capacity': 0, 'weight': 0}), (0, 1, {'capacity': 3, 'weight': 1}), (0, 2, {'capacity': 2, 'weight': 1}), (0, 3, {'capacity': 3, 'weight': 2}), (0, 4, {'capacity': 2, 'weight': 1}), (1, 0, {'capacity': 3, 'weight': 1}), (1, 1, {'capacity': 0, 'weight': 0}), (1, 2, {'capacity': 5, 'weight': 1}), (1, 3, {'capacity': 3, 'weight': 2}), (1, 4, {'capacity': 3, 'weight': 3}), (2, 0, {'capacity': 2, 'weight': 1}), (2, 1, {'capacity': 5, 'weight': 1}), (2, 2, {'capacity': 0, 'weight': 0}), (2, 3, {'capacity': 4, 'weight': 2}), (2, 4, {'capacity': 5, 'weight': 2}), (3, 0, {'capacity': 3, 'weight': 2}), (3, 1, {'capacity': 3, 'weight': 2}), (3, 2, {'capacity': 4, 'weight': 2}), (3, 3, {'capacity': 0, 'weight': 0}), (3, 4, {'capacity': 4, 'weight': 3}), (4, 0, {'capacity': 2, 'weight': 1}), (4, 1, {'capacity': 3, 'weight': 3}), (4, 2, {'capacity': 5, 'weight': 2}), (4, 3, {'capacity': 4, 'weight': 3}), (4, 4, {'capacity': 0, 'weight': 0})]

Đây là phiên bản được đánh golf của mã mà tôi đã sử dụng để xác minh các trường hợp thử nghiệm.

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.