หากคุณแก้ไขปัญหาด้วยวิธีที่แตกต่างกันเล็กน้อย (แต่เทียบเท่า) อัลกอริทึมจะชัดเจนยิ่งขึ้น:
มี : ฝ่ายที่เกี่ยวข้องn - 1คนและหนึ่ง Restauarant ให้หน้าฉันจะเป็นจำนวนเงินของพรรคเงินที่ฉันควรจะมีหลังจากรับประทานอาหารเสร็จเรียบร้อยแล้วและจ่ายเงิน ตัวอย่างเช่นหากอลิซมีเงิน $ 36 และเป็นหนี้$ 25 บ็อบมี$ 12 และเป็นหนี้$ 11 และคาร์ลมี$ 30 และเป็นหนี้$ 25 เราบอกว่าp 0เป็นร้านอาหารและมี:nn - 1พีผมผมพี0
p = ( 61 , 11 , 1 , 5 )
นั่นคือเมื่อมื้ออาหารผ่านร้านอาหารควรมี$ 61 อลิซควรมี$ 11 Bob ควรมี$ 1 และ Carl ควรมี$ 5
ตอนนี้ขอการระบุทั้งหมดของม.ค่าใช้จ่ายที่เกี่ยวข้องกับการ ตัวอย่างเช่น:ขม.
b = ( 1 , 5 , 10 , 20 , 1 , 1 , 5 , 5 , 10 , 20 )
สกุลเงินของธนบัตรไม่สำคัญ แต่ฉันเลือกสกุลเงินดอลลาร์สหรัฐสำหรับตัวอย่างนี้เพราะคุ้นเคย
เรากำลังมองหาเพื่อลดจำนวนของค่าว่ามือเปลี่ยนแปลงเพื่อให้เราเชื่อมโยง "ค่าใช้จ่าย" กับคนที่ออกไปกับการเรียกเก็บเงินJโดยใช้{ 0 , 1 }เมทริกซ์C รายการ 0 ในเมทริกซ์นี้ระบุว่าบิลแต่ละฝ่ายเริ่มต้นด้วย ( C 0 , j = 0สำหรับjทั้งหมดเพราะร้านอาหารเริ่มต้นโดยไม่มีบิล)ผมJ{ 0 , 1 }CC0 , j= 0J
ดำเนินการต่อตัวอย่างของเรา:
C= ⎡⎣⎢⎢⎢0011001100110011010101010101010101100110⎤⎦⎥⎥⎥
บ่งชี้ว่าอลิซเริ่มต้นด้วย$ 1, $ 5, $ 10, $ 20, Bob เริ่มต้นด้วย$ 1, $ 1, $ 5, $ 5, และ Carl เริ่มต้นด้วย$ 10 และ$ 20
อีกครั้งเป้าหมายคือการลดจำนวนตั๋วเงินที่เปลี่ยนมือ ในคำอื่น ๆ :
ลด:ภายใต้:และΣi = 0n - 1Σj = 0m - 1Cฉัน, Jxฉัน, JΣi = 0n - 1xฉัน, J= 1 สำหรับ 0 ≤ J < เมตร,Σj = 0m - 1xฉัน, JขJ= pผม สำหรับ 0 ≤ ฉัน< n ,xฉัน, J≥ 0
ข้อ จำกัด แรกบอกว่าโซลูชันสามารถกำหนดรายการเฉพาะให้กับฝ่ายหนึ่งเท่านั้นและข้อที่สองรับรองว่าทุกคนจ่ายเงินตามจำนวนที่เหมาะสม
นี่คือปัญหาการโปรแกรมจำนวนเต็ม 0,1 และเป็นปัญหาสมบูรณ์ (ดู [ Karp 1972 ]) หน้าวิกิพีเดียเกี่ยวกับการเขียนโปรแกรมเชิงเส้นมีข้อมูลเกี่ยวกับอัลกอริทึมที่แตกต่างกันซึ่งสามารถใช้สำหรับปัญหาประเภทนี้
อาจมีทางออกที่ดีที่สุดหลายอย่าง ด้วยมือวิธีแก้ปัญหาแรกสำหรับตัวอย่างที่ฉันพบคือ:
x = ⎡⎣⎢⎢⎢0100100001001000101000000001100010001000⎤⎦⎥⎥⎥
ซึ่งหมายความว่าอลิซจ่ายอย่างแน่นอน$ 5 และ$ 20 บ๊อบจ่าย$ 1, $ 5 และ$ 5 อย่างแน่นอนและ Carl จ่ายเงินเกิน$ 10 และ$ 20 จากนั้นเอา$ 5 ออกจากตาราง
ฉันยังใช้โมดูลโปรแกรมเชิงเส้นผสมจำนวนเต็มของระบบSage Mathซึ่งมีความสามารถในการใช้แบ็กเอนด์ตัวแก้ปัญหาที่แตกต่างกัน ( GLPK , COIN , CPLEXหรือGurobi ) ทางออกแรกที่ได้คือ
x = ⎡⎣⎢⎢⎢0100100001001000001010000000100110001000⎤⎦⎥⎥⎥
ซึ่งเกือบจะเหมือนกันยกเว้นว่า Carl เอาค่า "อื่น ๆ " $ 5 ที่ Bob วางไว้บนโต๊ะ
Cx
ระบุกลุ่มย่อยของคนที่สามารถจ่ายรวมลดลง? หรืออาจเป็นกลุ่มย่อยของคนที่ยังคงสามารถจ่ายเงินทั้งหมดได้นั่นคือพวกเขาจ่ายเงินให้เพื่อน
คำแถลงขั้นสุดท้ายของคุณทำให้ดูเหมือนว่าคุณสนใจในกรณีที่การเรียกเก็บเงินของตั๋วเงินได้รับการแก้ไข แต่สิ่งนี้ไม่เปลี่ยนปัญหา
O ( 1 )