최소 비용 흐름 문제


9

네트워크 흐름은 방향성 그래프 G = (V, E)소스 꼭지점 s ϵ V및 싱크 정점 t ϵ V마다 에지와 (u, v) ϵ E(노드를 연결하는 그래프 u ϵ Vv ϵ V)과 연관된 2 개 수량을 가지고

  1. c(u, v) >= 0가장자리의 용량
  2. a(u, v) >= 0가장자리를 통해 하나의 단위를 보내는 비용

우리는 함수 0 <= f(u, v) <= c(u, v)가 주어진 가장자리를 통과하는 단위의 수로 정의합니다 (u, v). 따라서 주어진 모서리의 비용 (u, v)a(u, v) * f(u, v)입니다. 최소 비용 흐름 문제는 소정의 유량에 대한 모든 가장자리 위에 총 비용 최소화로 정의 d다음의 수량을 주어진 :

비용

다음 제한 사항이 문제점에 적용됩니다.

  1. 용량 요구 사항 : 주어진 모서리를 통한 흐름이 해당 모서리의 용량을 초과 할 수 없습니다 ( f(u, v) <= c(u, v)).
  2. 기울기 대칭 : 방향이 반대 일 때 주어진 모서리를 통한 흐름은 비대칭이어야합니다 ( f(u, v) = -f(v, u)).
  3. 보존 흐름 : 비 싱크가 아닌 소스 노드에 그물 흐름이 0이어야합니다 (각각 u ∉ {s, t}, 온통 합산 w, sum f(u, w) = 0).
  4. 필요한 유량 : 그물 소스 모두 네트워크를 통해 필요한 흐름을 동일해야 싱크대에 그물 흐름의 유출 (모든 것을 합산 u, sum f(s, u) = sum f(u, t) = d).

흐름 네트워크 G와 필요한 흐름이 주어지면 네트워크를 통해 장치를 d보내는 데 필요한 최소 비용을 출력하십시오 d. 솔루션이 있다고 가정 할 수 있습니다. d모든 용량과 비용은 음이 아닌 정수입니다. 로 N표시된 정점이 있는 네트워크의 [0, N-1]경우 소스 정점이 0되고 싱크 정점이됩니다 N-1.

이것은 가장 짧은 답변 (바이트)이 이깁니다. 이것은 언어와 언어 사이의 경쟁이기 때문에 자세한 언어로 솔루션을 게시하는 것을 두려워하지 마십시오.

기본 제공은 허용되지만 기본 제공없이 솔루션을 동일한 답변의 추가 솔루션 또는 독립적 인 답변으로 포함하는 것이 좋습니다.

입력은 각 에지의 용량 및 비용 및 수요를 포함하는 임의의 합리적인 방식 일 수있다.

테스트 사례

테스트 케이스는 다음 형식으로 제공됩니다.

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

이 테스트 사례는 NetworkX Python 라이브러리를 사용하여 계산되었습니다 .



1
오랫동안 골프를
쳤다면

답변:


3

[R + lpSolve ] 201 186 149 144 바이트

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

온라인으로 사용해보십시오!

이 코드는 다음 선형 문제를 구성하고 lpSolve패키지를 사용하여 해결합니다 .

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

  • V 꼭짓점의 집합입니다
  • s s는 소스 정점입니다
  • t s는 대상 (또는 싱크) 정점입니다.
  • Ax,y 가장자리의 흐름 비용입니다 x -> y
  • fx,yx -> y최적의 솔루션에서 에지의 흐름입니다
  • d 싱크대에 필요한 유량 (예 : t 그리고 생산 s)
  • Cx,y 가장자리의 최대 용량 x -> y

멋지고 선형적인 프로그래밍 :) 불행히도 대부분의 언어에는 lpSolve... :(
Quintec

불행히도 사실입니다 ... BTW는 base-R에서 사용할 수 없으며 패키지입니다 ... TIO에 설치하도록 요청해야했습니다.)
digEmAll

어떤 이유로 나는 아직 MinCostFlow가되도록 MinCostMaxFlow를 수정하는 짧은 방법을 찾지 못했다 ... 내 두뇌가 튀겨졌다. 나는 수학 이외의 언어로 이것을위한 기능이 있었으면 좋겠다
Quintec

@Quintec : MinCostMaxFlow의 특정 구현 (예 : 특정 언어)을 언급하고 있습니까?
digEmAll

아니요, 제 핸드 코딩 알고리즘
Quintec

1

볼프람 언어, 42 바이트

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

사소한 내장. 내장되지 않은 솔루션이 곧 제공 될 예정입니다.


6-8 주 후에 올까요? : P
Quintec

1

Python 3 + NetworkX , 137 바이트

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)

TIO에 NetworkX 라이브러리가 설치되어 있지 않으므로 TryItOnline 링크가 없습니다

다음과 같이 용량 및 가중치 속성이있는 엣지 목록으로 그래프 입력을받습니다.

[(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})]

이것은 테스트 사례를 확인하는 데 사용한 코드의 골프 버전입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.