วันอาทิตย์ที่ 29 มีนาคม พ.ศ. 2563

Genetic Algorithm#2


   สวัสดีครับหลังจากบทความที่แล้ว https://cakeknowledgeblogs.blogspot.com/2020/03/genetic-algorithm.html ได้พูดถึงทฤษฎีของอัลกอริทึมหนึ่งที่ชื่อว่า Genetic Algorithm วันนี้เราเลยจะนำความรู้มาใช้กันครับซึ่งเราจะนำความรู้มาแก้ปัญหา TSP(Traveling Salesman Problem) นั่นเอง

"แล้วปัญหา TSP(Traveling Salesman Problem) คืออะไร"

TSP(Traveling Salesman Problem) เป็นปัญหาสำหรับหาเส้นทางในการเดินทางไปยัง N สถานที่แล้วให้ได้ประโยชน์มากสุดเช่น เวลาที่สั้น หรือ ระยะทางที่สั้นที่สุดเป็นต้น

ตัวอย่างเช่น
เราต้องการไปทำบุญ 9 วัดซึ่งเรามีวัดในใจอยู่แล้ว แต่เราต้องการเดินทางไปทำบุญ 9 วัดโดยใช้ระยะทางทั้งหมดน้อยที่สุด ดังนั้นเราจะนำ Genetic Algorithm นี้แหละมาทำการจัดลำดับการเดินทางแล้วหวังว่าการเดินทางนั้นจะใช้เวลาที่น้อยที่สุดครับ



"แล้วเราจะเอา genetic algorithm มาใช้เพื่อแก้ปัญหา TSP อย่างไร?"



หลังจากที่เราได้เรียนรู้แล้วว่า genetic algorithm นั้น จะมีขั้นตอนหลักๆ คือ
1.         Initial population
2.         Fitness Function
3.         Selection
4.         Crossover
5.         Mutation
เราก็จะเอาขั้นตอนพวกนี้แหละมาดัดแปลงเพื่อแก้ปัญหา TSP(Traveling Salesman Problem) กันดังนี้

1. Initial population

   เราจะทำการสร้างคำตอบหลายคำตอบขึ้นมาก่อนซึ่งจะมีหน้าตาดังนี้

จากรูปจะเห็นว่าคำตอบของเราคือ การซุ่มลำดับของวัดที่เราจะเดินทางขึ้นมา และก็ทำการซุ่มอีกคำตอบเพื่อให้ได้หลายคำตอบ
จากคำตอบที่ 1 จะเห็นว่าจะมีการเดินทางดังนี้
จากบ้านไป วัดเอก, วัดจตุ, วัดสัตต , วัดโท , วัดตรี, วัดเบญจ, วัดนว ,วัดฉะ , วัดอัฎฐ, แล้วค่อยกลับมาบ้าน

(หมายเหตุชื่อวัดเป็นวัดที่คิดขึ้นมาเอง ดังนั้นอาจจะไม่มีชื่อวัดจริงบนโลก)

2. Fitness Function

   หลังจากนั้นเราก็มาทำการให้คะแนนคำตอบกันซึ่งการให้คะแนนนั้นจะให้คะแนนจากคนที่ใช้ระยะทางในการเดินทาง โดยคำตอบใหนใช้ระยะทางเดินทางสั้นก็จะได้คะแนนเยอะ ส่วนคำตอบใหนที่ใช้ระยะทางเยอะก็จะได้คแนนน้อยดังรูป

จากรูปจะเห็นว่าค่า fitness สำหรับปัญหา TSP TSP(Traveling Salesman Problem) เราจะใช้ 1/ระยะทางการเดินทางทั้งหมด เนื่องจากเราต้องการให้ระยะทางที่สั้นต้องได้คะแนนมากกว่าระยะทางที่ยาวนั่นเอง

3. Selection

   หลังจากเราให้ได้คะแนนของทุกคำตอบแล้วเราก็มาทำการเลือกคำตอบที่ดีที่สุดมา N จำนวนดังรูป โดยการเลือกคำตอบที่ดีที่สุดนั้นก็ดูจากค่า fitness ที่มากที่สุดมา N คำตอบนั่นเอง


4. Cross over

   หลังจากเราเลือกมาแล้วเราก็ทำการ Crossover กัน หรือก็คือการสร้างคำตอบขึ้นมาใหม่ที่เกิดจากการแลกคำตอบย่อยกันนั่นเองดังรูป



5. Mutation

   หลังจากที่เราได้คำตอบที่เกิดจาก Cross over มาใหม่แล้วเราก็อาจจะทำการสุ่มคำตอบย่อยมา เพื่อเปลี่ยนค่า โดยในที่นี้คือการสุ่มคำตอบย่อยมา 2 ตัวเพื่อมาสลับลำดับการเดินทางใหม่นั่นเอง



โดยขั้นตอนการทำงานของโปรแกรมนั้นก็จะทำ Initial population -> Fitness Function -> Selection -> Crossover -> Mutaion และก็เริ่มทำ Fitness Function ใหม่วนไปเรื่อยๆจนกระทั่งได้ระยะทางการเดินทางที่พอใจหรือระยะทางในแต่ละครั้งไม่ค่อยมีการเปลี่ยนแปลงนั่นเองครับ


ซึ่งหากใครสนใจอยากเขียนโปรแกรมการคำนวณ TSP(Traveling Salesman Problem) สามารถไปโหลดศึกษาดู code ได้ที https://github.com/CakeNuthep/GA_TSP โดยแอดได้เอาโคดต้นฉบับมากจาก https://github.com/7lb/TSP แล้วมาใส่คำอธิบายภาษาไทยไว้แล้วเพื่อให้สามารถเข้าใจได้เร็วขึ้น และสุดท้ายนี้หวังว่าโพสน์นี้จะมีประโยชน์นะครับ
ขอบคุณครับ


Refference



วันอังคารที่ 24 มีนาคม พ.ศ. 2563

Genetic Algorithm

   สวัสดีครับหลังจากห่างหายไปนาน เนื่องจากได้ไปศึกษา AI ตัวนึงที่มีอัลกอริทึมที่ชื่อว่า Genetic Algorithm ซึ่งเป็นแนวคิดที่ดี ซึ่งสามารถนำ Gentic Algorithm ไปประยุกต์ในการแก้ปัญหาหลายๆอย่างดังลิงค์นี้ครับ https://en.wikipedia.org/wiki/List_of_genetic_algorithm_applications ซึ่งจะเห็นว่ามีหลายแอพพลิเคชันเลยที่นำไปใช้

"แล้ว Genetic Algorithm คืออะไร?"
   Genetic Algorithm ก็คือขั้นตอนการแก้ปัญหาบางอย่างโดยเลียนแบบกระบวนการถ่ายทอดทางพันธุกรรม

"แล้วทำไม่ต้องเลียนแบบการถ่ายถอดทางพันธุกรรม?"

  เนื่องจากเราสังเกตุว่าสิ่งมีชีวิตที่อยู่รอดปัจจุบันนั้นเกิดจากการวิวัฒนาการให้เข้ากับสภาพแวดล้อมให้เหมาะสม โดยการวิวัฒนาการของสิ่งมีชีวิตนั้นก็คือ การสืบพันธ์เพื่อให้รุ่นลูกมีสภาพที่ทนต่อสภาพแวดล้อม หรืออาจเกิดจากการกลายพันธ์ รุ่น สู่ รุ่น ไปเรื่อยๆ จนทำให้สิ่งมีชีวิตใหม่ที่ปรับตัวได้เหมาะสมก็จะเป็นผู้อยู่รอดนั่นเอง จึงได้เกิดแนวคิดในการเขียนโปรแกรมเพื่อหาคำตอบของปัญหาโดยให้เปรียบเทียบคำตอบนั้นเหมือนกับสิ่งมีชีวิตแล้วคำตอบนั้นสามารถปรับแก้ไขได้โดยการสืบทอด หรือ การกลายพันธ์จนได้คำตอบที่เหมาะสมกับปัญหามากที่สุดนั่นเอง

"แล้ววิวัฒนาการกับการเขียนโคดมันจะเขียนยังไง?"

   ในการที่จะเขียนโคดเพื่อเลียนแบบการวิวัฒนาการของสิ่งมีชีวิตนั้นเราจะมองลึกลงไปอีก ของการวิวัฒนาการนั่นก็คือ Chromosome เพราะสิ่งมีชีวิตที่เกิดการกลายพัน หรือลูกที่เกิดจากการสืบพันธ์นั้นเกิดจาก การทำให้ Chromosome มีการเปลี่ยนแปลงกันทั้งสิ้นดังนั้นในการเขียน Code เราจำเป็นที่จะให้คำตอบในการแก้ปัญหานั้นเปรียบเทียบคล้ายกับ Chromosome นั่นเอง ซึ่งก่อนที่จะเริ่มเขียนโคดกันเรามาทำความเข้าใจของการวิวัฒนาการเมื่อมองในมุมมองของ Chromosome ซึ่งในการวิวัฒนาการนั้นจะมีขั้นตอนดังนี้
  1. การคัดสรร  คือการเลือก Chromosome ที่เหมาะสมกับธรรมชาติมากที่สุด ส่วน Chromosome ใหนที่ไม่เหมาะสมก็จะตายไป




ดังรูปจะเห็นว่า สิ่งมีชีวิตที่มี Chromosome1, Chromosome2, Chromosome4 จะถูกเลือกให้อยู่รอด ส่วนสิ่งมีชีวิตที่มี Chromosome3 จะตายไป เนื่องจาก Chromosome1, Chromosome2, Chromosome4 มีค่าความเร็วและความแข็งแรงมากกว่า Chromosome3
  2. การสืบพันธ์  คือการสืบพันธ์เพื่อให้ได้ Chromosome ตัวใหม่และหวังว่า Chromosome ตัวใหม่นั้นจะดีกว่าเดิม




ดังรูปจะเห็นว่า สิ่งมีชีวิตที่มี Chromosome1, Chromosom2 ได้ทำการสืบพันธ์กัน และได้ลูกมา 2 ตัวหรือก็คือ Chromosome5, Chromosome6 ซึ่งจะเห็นว่า Chromosome5, กับ Chromsome6 เกิดจากการแลกเปลี่ยนบางพันธุกรรมใน Chromosome1 กับ Chromosome2 จนทำให้เกิด Chromome5, กับ Chromome6 นั่นเอง
  3. การกลายพันธ์  คือ การทำให้ Chromosome มีการเปลี่ยนเปลงข้อมูลบางจุด




ดังรูปจะเห็นว่า chromosome5 เกิดการกลายพันธ์จนทำให้ค่าความเร็วมีค่ามากขึ้นกว่าของแม่และของพ่อ(นั่นก็คือ Chromosome1 กับ Chromosome2) นั่นเอง

"แล้วตกลงจะมาเขียนโคดยังไง?"

ในการเขียนโคดก็เอาขั้นตอนวิวัฒนาการดังกล่าวนี่แหละมาเขียนโคดซึ่งจะมีขั้นตอนดังนี้
1. Initial population
2. Fitness Function
3. Selection
4. Crossover
5. Mutation

1. Initial population
ในตอนเริ่มต้นจำเป็นจะต้องสร้าง Chromosome หลาย Chromosome ขึ้นมาซึ่ง สิ่งที่เรียกหลายๆ Chromsome ทั้งหมดนี้เราจะเรียกว่า ประชากรดังรูป



โดยข้างใน Chromosome ก็จะมีคำตอบอยู่แล้ว ซึ่งคำตอบเหล่านั้นเป็นคำตอบที่เกิดจากการมั่วทั้งหมดซึ่งอาจทำให้มีทั้งคำตอบที่ผิดมาก มีทั้งที่ผิดน้อย หรือใกล้เคียงกับความถูกต้องมากที่สุด เป็นต้น

2.Fitness Function
เมื่อเรามี Chromosome หลายๆตัวและแต่ละ Chromosome ก็จะมีคำตอบที่แตกต่างกัน ดังนั้นเราจำเป็นที่จะต้องมีการตรวจคำตอบว่า Chromosome แต่ละตัวให้คำตอบที่ใกล้เคียงกับความถูกต้องมากสุดเท่าไหร่ หรือก็คือเราจะทำการให้คะแนนของคำตอบแต่ละ Chromosome นั่นเองว่า คำตอบดีหรือไม่ ถ้าคำตอบดีหรือถูกต้องก็ได้คะแนนเยอะ ถ้าคำตอบไม่ดีหรือไม่ถูกต้องก็ใด้คะแนนน้อยเป็นต้น



3. Selection
คือการเลียนแบบการคัดสรรธรรมชาติโดยเลือกเอากลุ่ม Chromosome ที่ดีที่สุดมา N ลำดับซึ่งเราจะรู้ได้อย่างไรว่า Chromosome ใหนดีไม่ดีสามารถดูได้จากการใข้ Fitness Function จากข้อ 2 นั่นเอง



4. Crossover
ถ้าให้เปรียบเทียบจะคล้ายๆกับการสืบพันธ์ โดยทำการแลกเปลี่ยนข้อมูลระหว่าง 2 Chromosome(Chromosome ของพ่อแม่) จนเกิด Chromosome ใหม่ 2 Chromosome (Chromosome ของลูก)



จากรูปจะเห็นว่า Chromosome3 กับ Chromosome4 มาทำการ Crossover กัน จนเกิด Chromosome ใหม่ขึ้นมา 2 ตัวที่ชื่อว่า Chromosome5 กับ Chromosome6 ที่เกิดจากการสลับข้อมูลระหว่างคำตอบย่อยที่1 กับคำตอบย่อยที่2 หรือถ้าให้เปรียบเทียบก็เหมือนกับเราลอกคำตอบกับเพื่อนสองคนสลับข้อกันและหวังว่าจะทำให้เราถูกมากขึ้นนั่นเอง

5. Mutation
คือการกลายพันธ์ของ Chromosome โดยเกิดจากการสุ่มเปลี่ยนค่าบางค่าในข้อมูลของ Chromosome



ดังรูปจะเห็นว่าหลังจากที่เราทำการ Crossover จากข้อ 4 แล้วเราก็ทำการกลายพันธ์โดยการเลือก คำตอบย่อยที่2 มาเปลียนค่านั้นเอง
ถ้าให้เปรียบเทียบก็เหมือนกับเราเอาคำตอบย่อยมาบางข้อแล้วมามั่วคำตอบใหม่และหวังว่าหลังจากมั่วคำตอบแล้วจะทำให้คะแนนเพิ่มขึ้นนั่นเอง

6. Termination
คือการหาคำตอบที่เหมาะสมกับปัญหา โดยอาจจะดูค่า Fitness แล้วผลที่ได้จาก Fitness ตรงตามที่เราต้องการ หรืออาจจะเป็นค่า Fitness ในรุ่นลูกถัดไปเรื่อยๆไม่ค่อยมีการเปลี่ยนแปลง


โดยลำดับในการทำงานของ Genetic Algorithm นั้นจะเป็นดังนี้ครับ



จะเห็นว่าตอนแรกสุดจะทำการ Initial population ขึ้นมาจำนวนนึงเสร็จแล้วก็จะทำการคัดสรร(selector) เพื่อนำไป Crossover หลังจาก Crossover แล้วอาจจะมีการ Mutation ของข้อมูลเกิดขึ้น แล้วเราก็ทำการคัดสรรอีก(selector) วนไปเรื่อยๆจนกว่าเราได้ Chromosome หรือคำตอบที่เราพอใจ ก็จะทำการ Termination นั่นเองครับ

ถ้าให้เปรียบเทียบก็เหมือนกับเรานำคำตอบที่เกิดจากการมั่วขึ้นมา N คำตอบ (Initial population) เสร็จแล้วเราก็มาตรวจคำตอบที่เกิดจากการมั่วนี่แหละว่าใครได้มากใครได้น้อย เสร็จแล้วเราก็เอาคำตอบของพวกที่ได้คะแนนมาก(selector)มาสลับคำตอบข้อย่อยกัน(Crossover) เพื่อหวังว่าคำตอบใหม่ที่เกิดจากการสลับไปนั้นจะทำให้ได้คะแนนที่เพิ่มขึ้น และบางครั้งอาจจะลองเลือกข้อย่อยมามั่วเอง(Mutation) เพื่อหวังว่าข้อที่มั่วจะเป็นตัวที่ได้คะแนนมากกว่าคนอื่น หลังจากนั้นเราก็มาตรวจคำตอบว่าใครได้มากใครได้น้อย เสร็จแล้วเราก็เอาคำตอบของพวกที่ได้คะแนนมาก(selector) มาสลับคำตอบข้อย่อยกัน(Crossover) เพื่อหวังว่าคำตอบใหม่ที่เกิดจากการสลับไปนั้นจะทำให้ได้คะแนนที่เพิ่มขึ้น และบางครั้งอาจจะลองเลือกข้อย่อยมามั่วเอง(Mutation)เพื่อหวังว่าข้อที่มั่วจะเป็นตัวที่ได้คะแนนมากกว่าคนอื่น ทำแบบนี้วนไปเรื่อยๆจนกระทั้งได้คะแนนที่พอใจนั่นเอง(Termination)

สุดท้ายนี้หวังว่าบทความนี้จะช่วยเพิ่มความเข้าใจในการทำ Genetic Algorithm มากขึ้นและบทต่อไปเราจะนำความรู้เรื่อง Genetic Algorithm มาแก้ปัญหาในการจัดสถานที่เดินทางโดยใช้ระยะทางเดินทางที่น้อยที่สุดกันครับ ตัวอย่างเช่น เราต้องการไปทำบุญ 9 วัดซึ่งเรามีวัดในใจอยู่แล้ว ซึ่งเราต้องการเดินทางไปทำบุญ 9 วัดโดยใช้ระยะทางทั้งหมดน้อยที่สุด ดังนั้นเราจะนำ Genetic Algorithm นี้แหละมาทำการจัดลำดับการเดินทางแล้วหวังว่าการเดินทางนั้นจะใช้เวลาที่น้อยที่สุดครับ

แล้วพบกันใหม่ในบทความถัดไปครับ Genetic Algorithm2😊

Refference
https://towardsdatascience.com/introduction-to-genetic-algorithms-including-example-code-e396e98d8bf3
https://lukkiddd.com/genetic-algorithm-พันธุกรรมมหัศจรรย์-6314fc9afca5