ปัญหาการไหลของต้นทุนต่ำสุด


9

เครือข่ายการไหลเป็นกราฟG = (V, E)ที่มีจุดสุดยอดแหล่งที่มาs ϵ Vและจุดสุดยอดอ่างล้างจานt ϵ Vและที่ขอบทุก(u, v) ϵ Eบนกราฟ (เชื่อมต่อโหนดu ϵ Vและv ϵ 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. สมมาตรเอียง : การไหลแม้ว่าขอบที่กำหนดจะต้องเป็น antisymmetric เมื่อทิศทางกลับด้าน ( 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], จุดสุดยอดแหล่งที่มาจะเป็นจุดสุดยอดและอ่างล้างจานจะเป็น0N-1

นี่คือ ดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) จะชนะ โปรดจำไว้ว่านี่คือการแข่งขันภายในภาษาเช่นเดียวกับระหว่างภาษาดังนั้นอย่ากลัวที่จะโพสต์วิธีแก้ปัญหาในภาษา verbose

อนุญาตให้มีบิวด์อินได้ แต่ขอแนะนำให้คุณรวมโซลูชันที่ไม่มีบิวด์อินเป็นโซลูชันเพิ่มเติมในคำตอบเดียวกันหรือเป็นคำตอบอิสระ

อินพุตอาจอยู่ในลักษณะที่สมเหตุสมผลซึ่งรวมถึงความสามารถและต้นทุนของแต่ละขอบและความต้องการ

กรณีทดสอบ

กรณีทดสอบมีให้ในรูปแบบต่อไปนี้:

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 หลาม



1
มีสนามเล่นกอล์ฟเป็นเวลานานแล้วรู้ว่าผมได้รับการเล่นกอล์ฟขั้นตอนวิธีการที่ไม่ถูกต้องเพราะผมไม่สามารถอ่าน
Quintec

คำตอบ:


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,yคือการไหลของขอบx -> yในทางออกที่ดีที่สุด
  • dคือการไหลที่ต้องการที่อ่าง (เช่นความต้องการที่และการผลิตที่ )ts
  • Cx,yคือความจุสูงสุดของขอบx -> y

Nice, การเขียนโปรแกรมเชิงเส้น :) น่าเสียดายที่ภาษาส่วนใหญ่ไม่มีlpSolve... :(
Quintec

แต่น่าเสียดายที่จริง ... BTW ไม่สามารถใช้งานได้ใน base-R เป็นแพ็คเกจ ... ฉันต้องขอติดตั้งบน TIO;)
digEmAll

ด้วยเหตุผลบางอย่างฉันยังไม่พบวิธีแก้ไข MinCostMaxFlow เป็น MinCostFlow ... สมองของฉันทอด lol ฉันหวังว่าจะมีฟังก์ชั่นสำหรับสิ่งนี้ในภาษาอื่นที่ไม่ใช่ mathematica
Quintec

@Quintec: คุณหมายถึงการใช้งานเฉพาะ (เช่นในบางภาษา) ของ MinCostMaxFlow หรือไม่
digEmAll

ไม่อัลกอริทึมที่เขียนด้วยมือของฉัน
Quintec

1

ภาษา Wolfram ขนาด 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)

ไม่มีลิงก์ TryItOnline เนื่องจาก TIO ไม่มีการติดตั้งไลบรารี NetworkX

รับอินพุตกราฟเป็นรายการขอบด้วยคุณลักษณะความจุและน้ำหนักเช่นนี้

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

นี่เป็นรหัส golfed ที่ฉันใช้ในการตรวจสอบกรณีทดสอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.