ผลต่างระหว่างรุ่นของ "204512-53/lecture8"
KenMay (คุย | มีส่วนร่วม) |
|||
(ไม่แสดง 16 รุ่นระหว่างกลางโดยผู้ใช้ 3 คน) | |||
แถว 1: | แถว 1: | ||
+ | {{หัวคำบรรยาย|204512-53}} | ||
+ | Algorithm Lecture #8 | ||
'''จดบันทึกคำบรรยายโดย:''' | '''จดบันทึกคำบรรยายโดย:''' | ||
− | นาย | + | |
− | นาย | + | นาย บดินทร์ แสงทองล้วน 5314550113 |
− | นาย | + | |
+ | นาย วิชา มีสุขสบาย 5314550164 | ||
+ | |||
+ | นาย อภิชาติ ทวีศิริเวทย์ 5314550199 | ||
+ | |||
---- | ---- | ||
+ | |||
+ | =Network flow problem= | ||
+ | |||
+ | 1. กราฟมีทิศทาง | ||
+ | |||
+ | 2. ความจุ (capacity) <math>\ c : E \rightarrow \mathbb{R+}</math> | ||
+ | |||
+ | 3. จุดเริ่มต้น source <math>\ s \in V</math> | ||
+ | |||
+ | 4. จุดสิ้นสุด sink <math>\ t \in V</math> | ||
+ | |||
+ | 5. flow เป็น function จาก <math>V \times V \rightarrow \mathbb{R}</math> | ||
+ | |||
+ | เงื่อนไข | ||
+ | |||
+ | 1. Capacity constraints : <math>\ f \le c(u,v)</math> | ||
+ | |||
+ | 2. Skew symmetry : <math>\ f(u,v) = - f(v,u)</math> | ||
+ | |||
+ | 3. conservation : <math>\ \sum_{V} f(u,v) = 0</math> | ||
+ | |||
+ | ปริมาตร flow <math> |f| = \ \sum_{V} f(u,v) = 0</math> | ||
+ | |||
+ | =Maximum flow problem= | ||
+ | |||
+ | Maximum flow problem: ปัญหาการหาปริมาณการไหลสูงสุด ซึ่งเป็นหนึ่งในปัญหาเน็ตเวิร์คโฟล์วที่น่าสนใจ | ||
+ | |||
+ | '''สัญลักษณ์ที่เกี่ยวข้อง''' | ||
+ | |||
+ | G คือ กราฟที่เราสนใจ | ||
+ | |||
+ | G = (V,E) คือ ฟังก์ชั่นของกราฟ G โดยที่ V คือ เซตของโหนด และ E คือเซตของเส้นเชื่อม | ||
+ | |||
+ | C: E->R+ คือ Capacity ของเส้นเชื่อม เซตจำนวนจริงบวกไม่รวมศูนย์ (0, +∞) | ||
+ | |||
+ | s-t คือ เซตของเส้นทางจาก s ไปถึง t | ||
+ | |||
+ | Maximum flow คือโจทย์หนึ่งของเน็ตเวิร์คโฟล์วโจทย์นี้ต้องการหาค่ามากที่สุดของโฟล์ว จากต้นทาง(s) ที่ส่งได้ไม่เกินความจุของเส้นเชื่อม(u) แต่ละเส้น เพื่อให้ได้ค่ารวมมากที่สุดจากต้นจนถึงปลายทาง (t) | ||
+ | |||
+ | =Classic problem= | ||
+ | |||
+ | [[ไฟล์:Untitled1.png ]] | ||
+ | |||
+ | Maximum flow คือเท่าไหร่ : ต้องหา path มาเรื่อยๆ จนไม่มี path | ||
+ | |||
+ | [[ไฟล์:Untitled2.png]] หรือ [[ไฟล์:Untitled3.png]] | ||
+ | |||
+ | ถ้าได้รูปแบบข้างต้นก็ไม่มีปัญหา แต่ถ้าเกิดได้แบบ | ||
+ | |||
+ | [[ไฟล์:Untitled4.png]] | ||
+ | |||
+ | จะกลายเป็นปัญหา แล้วจะแก้ไขอย่างไร? | ||
+ | |||
+ | แนวคิด | ||
+ | |||
+ | [[ไฟล์:Untitled5.png]] | ||
+ | |||
+ | [[ไฟล์:Untitled6.png]] | ||
+ | |||
+ | [[ไฟล์:Untitled7.png]] | ||
+ | |||
+ | Algorithm | ||
+ | :# F <- 0 | ||
+ | :# G(f) เป็น residual graph ของ f | ||
+ | :# ถ้ามี path จาก s ไป t ใน G(f) | ||
+ | :# P <- path จาก s ไป t ใน G(f) | ||
+ | :# C <- capacity ต่ำสุดของเส้นเชื่อมใน path P | ||
+ | :# Update f ด้วย flow path P ด้วยปริมาตร C | ||
+ | :# หา G(f) <- residual graph ของ flow f | ||
+ | |||
=st-cut= | =st-cut= | ||
แถว 9: | แถว 85: | ||
พิจารณา sub set ของ node กลุ่มหนึ่ง | พิจารณา sub set ของ node กลุ่มหนึ่ง | ||
+ | [[ไฟล์:St_1.png]] | ||
+ | |||
+ | ถ้า <math> s \in S ,t \notin S </math> จะเรียก <math>(S,\bar S)</math> ว่า st-cut ; | ||
+ | |||
+ | cut ที่ตัด s กับ t ออกจากกัน | ||
− | |||
เราสนใจ edge ทั้งหมดที่ข้ามจาก s ไป t | เราสนใจ edge ทั้งหมดที่ข้ามจาก s ไป t | ||
+ | |||
+ | '''1) นิยาม''' | ||
+ | |||
+ | <math>Cap(u,\bar v) = \sum\limits_{u \in S,v \in \bar S }{C(u,v)}</math> | ||
+ | |||
+ | Flow ใดๆเราพิจารณาการส่ง volumeจาก s ไป t | ||
+ | |||
+ | ถ้าเราพิจารณา volume ที่วิ่งผ่าน cut ต้องเท่ากับ volume ที่ออกจาก S | ||
+ | |||
+ | '''2) นิยาม''' | ||
+ | |||
+ | <math>f(S,\bar S)</math> ; flow ที่วิ่งจาก <math> S \Rightarrow \bar | ||
+ | |||
+ | S</math> ทั้งหมดเลย | ||
+ | |||
+ | [[ไฟล์:St_2.png]] | ||
+ | |||
+ | flow สามารถวิ่งไปและวิ่่งกลับได้ | ||
+ | |||
+ | สำหรับ st-cut ใดๆ เราได้ว่า | ||
+ | |||
+ | <math>f(S,\bar S) \leq Cap(S,\bar S) </math> | ||
+ | |||
+ | เราจะพิสูจน์ | ||
+ | |||
+ | <math>|f| = f(S,\bar S); |f|</math> คือ Volume ของ f | ||
+ | |||
+ | พิสูจน์ | ||
+ | |||
+ | <math>|f|= f(S,\bar S)</math> สำหรับ st-cut S ใดๆ | ||
+ | |||
+ | พิสูจน์ | ||
+ | |||
+ | [[ไฟล์:St_3.png]] | ||
+ | |||
+ | <math>{S}=S_0 \supset S_1 \supset S_2 \supset S_3 \subset S_4 \subset \ldots \subset | ||
+ | |||
+ | S_k</math> | ||
+ | |||
+ | <math>f(S,\bar S) = |f|</math> สำหรับทุกๆ <math>0 \leq i \leq k</math> | ||
+ | |||
+ | พิสูจน์ โดย Induction ตั้งแต่ 0 ถึง k | ||
+ | |||
+ | [[ไฟล์:St_4.png]] | ||
+ | |||
+ | <math>f(S_0,\bar S_0) = |f|</math> เป็น base case ซึ่งจะเท่ากันตามนิยาม | ||
+ | |||
+ | เราจะพิสูจน์ว่า | ||
+ | |||
+ | <math>f(S_{i+1},\bar S_{i+1}) = |f|</math> | ||
+ | |||
+ | [[ไฟล์:St_5.png]] | ||
+ | |||
+ | ได้ <math>S_i</math> มี flow ที่วิ่งเข้าวิ่งออกของ c กับ d สุดท้ายรวม flow เส้นปะเข้า | ||
+ | |||
+ | ไปเราได้ว่า | ||
+ | |||
+ | <math>a+c = |f|</math> | ||
+ | |||
+ | เนื่องจากเรารู้ว่า | ||
+ | |||
+ | <math>c+d = 0</math> | ||
+ | |||
+ | <math>c = -d</math> | ||
+ | |||
+ | <math>d = -b</math> | ||
+ | |||
+ | <math>c = b</math> | ||
+ | |||
+ | <math>a+c = |f|</math> | ||
+ | |||
+ | '''Claim(1)''' | ||
+ | |||
+ | <math>f(S,\bar S) \leq Cap(S,\bar S)</math> | ||
+ | |||
+ | '''Claim(2)''' | ||
+ | |||
+ | <math>|f| = f(S,\bar S)</math> | ||
+ | |||
+ | == Ford-Fullerson == | ||
+ | |||
+ | สำหรับ st-cut ใดๆ | ||
+ | |||
+ | <math>|f| = Cap(S,\bar S)</math> | ||
+ | |||
+ | เราพิจารณา flow มีขนาดเท่ากับ cut ใดๆ แปลว่า flow นั้นมีขนาดใหญ่สุด | ||
+ | |||
+ | เราสามารถพิสูจน์ต่อได้ว่า flow ที่มีขนาดเท่ากับ <math>Cap(S,\bar S)</math> เราจะได้ flow ที่มีขนาดใหญ่ที่สุด | ||
+ | |||
+ | พิสูจน์ว่า | ||
+ | |||
+ | flow f ที่ out-put โดย Ford-Fullerson เป็น maximum flow | ||
+ | |||
+ | หา s-t cut <math>(S^*,\bar S^*)</math> ที่ <math>Cap(S^*,\bar S^*)</math> | ||
+ | |||
+ | [[ไฟล์:St_6.png]] | ||
+ | |||
+ | เราต้องการ <math>|f|= f(S^*,\bar S^*) = Cap(S^*,\bar S^*)</math> | ||
+ | |||
+ | พิสูจน์ | ||
+ | |||
+ | 1) flowต้องเต็ม | ||
+ | |||
+ | 2) edgeที่วิ่งกลับต้องไม่มีflowเลย | ||
+ | |||
+ | เราพิสูจน์โดย By Contradition | ||
+ | |||
+ | [[ไฟล์:St_7.png]] | ||
+ | |||
+ | พิจารณา e=(u,v) ที่ <math>u \in S^*;v \in \bar S^*</math> | ||
+ | |||
+ | '''Claim''' | ||
+ | |||
+ | <math>f(u,v) = c(u,v)</math> | ||
+ | |||
+ | ถ้าไม่เท่ากัน flow จะไม่เต็ม เท่ากับว่ามี path อีก 1 path ใน residual graph เพราะฉะนั้น <math>f(u,v) = c(u,v)</math> เป็นจริง | ||
+ | |||
+ | สิ่งที่เราได้นอกจากจะได้ max flow เราจะได้ min cut เพราะ max flow = min cap | ||
+ | |||
+ | [[ไฟล์:St_8.png]] | ||
+ | |||
+ | ==เวลาในการทำงาน== | ||
+ | |||
+ | ความคืบหน้าของมันคือจำนวน |f| เพิ่มขึ้นเรื่อยๆ แต่ต้องมันใจว่าไปถึง max flow ไม่ใช่เพิ่มขึ้นน้อยลงเรื่อยก็ไม่มีทางไปถึง | ||
+ | |||
+ | m คือจำนวน edge, n คือ จำนวน node; ทำทั่วไป <math> O(n+m) </math> ; หา path <math> O(n+m) </math> ; | ||
+ | |||
+ | ถ้า Capacity เป็น integer จำนวนรอบที่ใช้จะเท่ากับจำนวนของ max flow | ||
+ | |||
+ | ตัวอย่างที่ Fold-Fullerson ล้มเหลว | ||
+ | |||
+ | [[ไฟล์:St_9.png]] | ||
+ | |||
+ | ==Bipatite Matching== | ||
+ | |||
+ | ปัญหาที่สามารถมองเป็น max flow ได้ | ||
+ | |||
+ | กราฟ G จะเรียกว่าเป็น Bipatite graph ถ้า set ของ vertex V สามารถแบ่งเป็น | ||
+ | |||
+ | A,B ที่ <math>A \bigcup B = V ; A \bigcap B = \emptyset</math> | ||
+ | |||
+ | แล้วไม่มีเส้นเชื่อม (u,v) ที่ <math>u \in A, V \in A</math> หรือ <math>u \in B, V \in B</math> | ||
+ | |||
+ | เซต <math> M \subseteq E </math> เรียกว่าเป็น matching ถ้าไม่มีโหนดใดๆ ติดกับเส้นเชื่อม M เกิน 1 เส้น | ||
+ | |||
+ | [[ไฟล์:St_10.png]] | ||
+ | |||
+ | ปัญหา Bipartite Matching | ||
+ | |||
+ | [[ไฟล์:St_11.png]] | ||
+ | |||
+ | สมมุติว่า มีคน n คน ซื้อกับข้าว n ห่อ เส้นเชื่อมที่โยงไปคือ ที่สามารถกินข้าวห่อได้ ทำอย่างไรให้ทุกคนได้กินข้าวห่อ | ||
+ | |||
+ | สร้าง Supernode S กับSupernode T ใส่ทิศทางและ Capasity | ||
+ | |||
+ | หาคำตอบในกราฟนี้โดยใช้ maxflow จะ work ได้ maxflow ต้องเป็นจำนวนเต็ม |
รุ่นแก้ไขปัจจุบันเมื่อ 07:00, 24 กันยายน 2553
บันทึกคำบรรยายวิชา 204512-53 นี้ เป็นบันทึกที่นิสิตเขียนขึ้น เนื้อหาโดยมากยังไม่ผ่านการตรวจสอบอย่างละเอียด การนำไปใช้ควรระมัดระวัง
Algorithm Lecture #8 จดบันทึกคำบรรยายโดย:
นาย บดินทร์ แสงทองล้วน 5314550113
นาย วิชา มีสุขสบาย 5314550164
นาย อภิชาติ ทวีศิริเวทย์ 5314550199
เนื้อหา
Network flow problem
1. กราฟมีทิศทาง
2. ความจุ (capacity)
3. จุดเริ่มต้น source
4. จุดสิ้นสุด sink
5. flow เป็น function จาก
เงื่อนไข
1. Capacity constraints :
2. Skew symmetry :
3. conservation :
ปริมาตร flow
Maximum flow problem
Maximum flow problem: ปัญหาการหาปริมาณการไหลสูงสุด ซึ่งเป็นหนึ่งในปัญหาเน็ตเวิร์คโฟล์วที่น่าสนใจ
สัญลักษณ์ที่เกี่ยวข้อง
G คือ กราฟที่เราสนใจ
G = (V,E) คือ ฟังก์ชั่นของกราฟ G โดยที่ V คือ เซตของโหนด และ E คือเซตของเส้นเชื่อม
C: E->R+ คือ Capacity ของเส้นเชื่อม เซตจำนวนจริงบวกไม่รวมศูนย์ (0, +∞)
s-t คือ เซตของเส้นทางจาก s ไปถึง t
Maximum flow คือโจทย์หนึ่งของเน็ตเวิร์คโฟล์วโจทย์นี้ต้องการหาค่ามากที่สุดของโฟล์ว จากต้นทาง(s) ที่ส่งได้ไม่เกินความจุของเส้นเชื่อม(u) แต่ละเส้น เพื่อให้ได้ค่ารวมมากที่สุดจากต้นจนถึงปลายทาง (t)
Classic problem
Maximum flow คือเท่าไหร่ : ต้องหา path มาเรื่อยๆ จนไม่มี path
ถ้าได้รูปแบบข้างต้นก็ไม่มีปัญหา แต่ถ้าเกิดได้แบบ
จะกลายเป็นปัญหา แล้วจะแก้ไขอย่างไร?
แนวคิด
Algorithm
- F <- 0
- G(f) เป็น residual graph ของ f
- ถ้ามี path จาก s ไป t ใน G(f)
- P <- path จาก s ไป t ใน G(f)
- C <- capacity ต่ำสุดของเส้นเชื่อมใน path P
- Update f ด้วย flow path P ด้วยปริมาตร C
- หา G(f) <- residual graph ของ flow f
st-cut
พิจารณา sub set ของ node กลุ่มหนึ่ง
ถ้า จะเรียก ว่า st-cut ;
cut ที่ตัด s กับ t ออกจากกัน
เราสนใจ edge ทั้งหมดที่ข้ามจาก s ไป t
1) นิยาม
Flow ใดๆเราพิจารณาการส่ง volumeจาก s ไป t
ถ้าเราพิจารณา volume ที่วิ่งผ่าน cut ต้องเท่ากับ volume ที่ออกจาก S
2) นิยาม
; flow ที่วิ่งจาก ทั้งหมดเลย
flow สามารถวิ่งไปและวิ่่งกลับได้
สำหรับ st-cut ใดๆ เราได้ว่า
เราจะพิสูจน์
คือ Volume ของ f
พิสูจน์
สำหรับ st-cut S ใดๆ
พิสูจน์
สำหรับทุกๆ
พิสูจน์ โดย Induction ตั้งแต่ 0 ถึง k
เป็น base case ซึ่งจะเท่ากันตามนิยาม
เราจะพิสูจน์ว่า
ได้ มี flow ที่วิ่งเข้าวิ่งออกของ c กับ d สุดท้ายรวม flow เส้นปะเข้า
ไปเราได้ว่า
เนื่องจากเรารู้ว่า
Claim(1)
Claim(2)
Ford-Fullerson
สำหรับ st-cut ใดๆ
เราพิจารณา flow มีขนาดเท่ากับ cut ใดๆ แปลว่า flow นั้นมีขนาดใหญ่สุด
เราสามารถพิสูจน์ต่อได้ว่า flow ที่มีขนาดเท่ากับ เราจะได้ flow ที่มีขนาดใหญ่ที่สุด
พิสูจน์ว่า
flow f ที่ out-put โดย Ford-Fullerson เป็น maximum flow
หา s-t cut ที่
เราต้องการ
พิสูจน์
1) flowต้องเต็ม
2) edgeที่วิ่งกลับต้องไม่มีflowเลย
เราพิสูจน์โดย By Contradition
พิจารณา e=(u,v) ที่
Claim
ถ้าไม่เท่ากัน flow จะไม่เต็ม เท่ากับว่ามี path อีก 1 path ใน residual graph เพราะฉะนั้น เป็นจริง
สิ่งที่เราได้นอกจากจะได้ max flow เราจะได้ min cut เพราะ max flow = min cap
เวลาในการทำงาน
ความคืบหน้าของมันคือจำนวน |f| เพิ่มขึ้นเรื่อยๆ แต่ต้องมันใจว่าไปถึง max flow ไม่ใช่เพิ่มขึ้นน้อยลงเรื่อยก็ไม่มีทางไปถึง
m คือจำนวน edge, n คือ จำนวน node; ทำทั่วไป ; หา path ;
ถ้า Capacity เป็น integer จำนวนรอบที่ใช้จะเท่ากับจำนวนของ max flow
ตัวอย่างที่ Fold-Fullerson ล้มเหลว
Bipatite Matching
ปัญหาที่สามารถมองเป็น max flow ได้
กราฟ G จะเรียกว่าเป็น Bipatite graph ถ้า set ของ vertex V สามารถแบ่งเป็น
A,B ที่
แล้วไม่มีเส้นเชื่อม (u,v) ที่ หรือ
เซต เรียกว่าเป็น matching ถ้าไม่มีโหนดใดๆ ติดกับเส้นเชื่อม M เกิน 1 เส้น
ปัญหา Bipartite Matching
สมมุติว่า มีคน n คน ซื้อกับข้าว n ห่อ เส้นเชื่อมที่โยงไปคือ ที่สามารถกินข้าวห่อได้ ทำอย่างไรให้ทุกคนได้กินข้าวห่อ
สร้าง Supernode S กับSupernode T ใส่ทิศทางและ Capasity
หาคำตอบในกราฟนี้โดยใช้ maxflow จะ work ได้ maxflow ต้องเป็นจำนวนเต็ม