ผลต่างระหว่างรุ่นของ "418531 ภาคต้น 2552/โจทยปัญหาการค้นหาด้วยพละกำลังเยี่ยงควายถึก/เฉลยข้อ 10"
Aoy (คุย | มีส่วนร่วม) |
Aoy (คุย | มีส่วนร่วม) |
||
แถว 6: | แถว 6: | ||
จากแนวคิดข้างต้น สามารถนำมาเขียนเป็น pseudocode ได้ดังนี้ | จากแนวคิดข้างต้น สามารถนำมาเขียนเป็น pseudocode ได้ดังนี้ | ||
+ | |||
+ | GENERATE(k) | ||
+ | : if k=0 | ||
+ | :: c=COST(p,n) | ||
+ | :: if c < min | ||
+ | ::: min <-- c | ||
+ | ::: for i= 0 to i< n | ||
+ | :::: p_min[i] <-- p[i] | ||
+ | :else | ||
+ | :: for i=1 to i<= n | ||
+ | ::: for j=1 to j<=n | ||
+ | :::: if i != j | ||
+ | ::::: if used[i] != 1 | ||
+ | :::::: used[i] <-- 1 | ||
+ | :::::: p[k-1] <-- i | ||
+ | :::::: GENERATE(k-1) | ||
+ | :::::: used[i]<-- 0 |
รุ่นแก้ไขเมื่อ 04:48, 24 สิงหาคม 2552
อินพุต: จุด จุดในระนาบสองมิติ
เอาพุต: Hamiltonian Cycle ที่มีระยะทางสั้นที่สุด
แนวคิด วัตถุที่เราสนใจคือ Hamiltonian Cycle ทั้งหมด พิจาณา Hamiltonian Cycle หนึ่งที่อาจเป็นไปได้ เช่น สังเกตว่าถ้าไม่พิจารณาจุดแรกกับจุดสุดท้าย นั่นคือ จุดที่อยู่ระหว่างจุดแรกกับจุดสุดท้ายนี้ เมื่อนำมาเรียงสับเปลี่ยนกันก็จะเกิด Hamiltonian Cycle ใหม่ขึ้นอีก ดังนั้นการหยิบวัตถุที่สนใจขึ้นมาดู ก็คือการสร้าง permutation นั่นเอง ซึ่ง ถ้าไม่นับจุดแรกและจุดสุดท้าย จะมีจุดตรงกลางให้เรียงสับเปลี่ยนทั้งหมด จุด ก็จะได้การเรียงสับเปลี่ยนทั้งหมด แบบ และเราสามารถเลือกจุดแรก (เลือกจุดสุดท้ายด้วยในขณะเดียวกัน) ได้อีกทั้งหมด จุด ดังนั้นจำนวน Hamiltonian Cycle ทั้งหมด จะได้ ตรงตามเวลาการทำงานที่โจทย์ต้องการ ส่วนเงื่อนไขในข้อนี้คือ Hamiltonian Cycle ที่มี cost ต่ำที่สุด ฉะนั้นเมื่อหยิบ Hamiltonian Cycle ขึ้นมาพิจารณาแล้วก็ดูว่า cost ของมันต่ำกว่า Cycle ที่เคยจำไว้หรือไม่ ถ้าต่ำกว่าก็เปลี่ยนมาจำ Hamiltonian Cycle ใหม่นี้แทน
จากแนวคิดข้างต้น สามารถนำมาเขียนเป็น pseudocode ได้ดังนี้
GENERATE(k)
- if k=0
- c=COST(p,n)
- if c < min
- min <-- c
- for i= 0 to i< n
- p_min[i] <-- p[i]
- else
- for i=1 to i<= n
- for j=1 to j<=n
- if i != j
- if used[i] != 1
- used[i] <-- 1
- p[k-1] <-- i
- GENERATE(k-1)
- used[i]<-- 0
- if used[i] != 1
- if i != j
- for j=1 to j<=n
- for i=1 to i<= n