- รับลิงก์
- X
- อีเมล
- แอปอื่นๆ
เขียนโดย
Komkrit Aree
ใน
- รับลิงก์
- X
- อีเมล
- แอปอื่นๆ
การหาค่าเหมาะสมที่สุดแบบกลุ่มอนุภาค (Particle Swarm Optimization) หรือ PSO พัฒนาขึ้นโดยอีเบอร์ฮาร์ดและเคนเนดี้ (J.Kennedy and R.Eberthart, 1995) โดยมีแนวคิดมาจากการจำลองวิธีการหาค่าเหมาะสมที่สุดจากพฤติกรรมการเดินทางหรือหาอาหารของฝูงสัตว์ โดยเฉพาะฝูงนก ฝูงปลา
ยกตัวอย่างเช่น มีนกฝูงหนึ่งกำลังบินสุ่มหาอาหารอยู่พื้นที่หนึ่ง ที่ซึ่งมีอาหารอยู่เพียงชิ้นเดียวในบริเวณนั้น นกทุกตัวไม่รู้ว่าอาหารอยู่ที่ตำแหน่งไหน แต่สัณชาตญานพวกมันรู้ว่ามันอยู่ห่างจากอาหารเท่าไหร่ โดยเมื่อพวกมันบินไปในแต่ละช่วง พวกมันจะหาระยะห่างของมันจากแหล่งอาหาร และนกทั้งฝูงจะเลือกบินตามนกตัวที่อยู่ใกล้อาหารมากที่สุด จากนั้นพวกมันก็จะบินช่วงต่อไป โดยที่นกทั้งฝูงจะทำซ้ำเช่นนี้ไปเรื่อยๆ จนพวกมันบินมาถึงแหล่งอาหาร จากวิธีการหาอาหารของฝูงนกเราจะเห็นว่า ในการกำหนดตำแหน่งระยะห่างของตัวมันจากแหล่งอาหาร และการตัดสินใจบินตามนกตัวที่บินอยู่ใกล้แหล่งอาหารมากที่สุด ในแต่ละช่วงจะใช้เวลาน้อยมาก จนเราดูเหมือนมันบินเกาะกลุ่มกันไปแบบต่อเนื่อง
PSO เป็นการจำลองการหาอาหารของฝูงนก ในการหาค่าเหมาะที่สุดแบบนี้ นกแต่ละตัวในฝูงจะถูกแทนด้วยอนุภาค (particle) ในอนุภาคแต่ละตัวจะมีค่า ฟิตเน็ส (fitness value) ที่บอกถึงระยะห่างของตัวมันจากแหล่งอาหาร โดยอนุภาคทั้งหมดจะบินตามอนุภาคที่มีค่าฟิตเน็ตที่ดีที่สุดในแต่ละช่วง/รอบ (Iteration)
แนวคิดของ PSO จะเริ่มต้นด้วยการสุ่มหาตำแหน่งของอนุภาค (ซึ่งตำแหน่งต่างๆ ของอนุภาคเหล่านั้นก็คือคำตอบที่เป็นไปได้) ขึ้นมาชุดหนึ่ง จากนั้นก็จะหาค่าเหมาะสมที่สุดด้วยการปรับปรุงค่าในแต่ละรอบของการตัดสินใจ โดยที่อนุภาคแต่ละตัวจะมีการปรับปรุงค่าด้วยการเปลี่ยนตำแหน่งตามค่าที่ดีที่สุด (Best) ซึ่งมี 2 ค่า ได้แก่
คำนวนค่าความเร็วใหม่ของอนุภาคตามสมการ 1.1
vik(t+1) = vik(t) + [c1 * r1 * (p(t) - xik(t))] + [c2 * r2 * (g(t) - xik(t))]
ปรับปรุงค่าตำแหน่งใหม่ของอนุภาคตามสมการ 1.2
xik(t+1) = xik(t) + vik(t+1)
** c1,c2 คือค่าคงที่ บางครั้งถูกเรียกว่า ค่าแฟคเตอร์การเรียนรู้ (เอาไว้ถ่วงน้ำหนักความจำ) โดยทั่วไปจะเท่ากับ 2 แต่ก็สามารถใช้ค่าอื่นๆ ได้ โดยที่จะมีช่วงระหว่าง [0,4] หรือ 0 ถึง 4
ค่า c1 = 0.729 และ c2 = 1.494 เป็นค่าที่เคอร์ (Clerc,1999) แนะนำ **
อัลกอริทึม PSO
** สำหรับตอนนี้คงขอจบเท่านี้ก่อน ตอนต่อไปจะเป็นเรื่องของขั้นตอนการทำงานของ PSO และจะลองมาคำนวณกันดูว่าแต่ละรอบการทำงานของ PSO ค่าที่ได้มีอะไรบ้าง ไว้พบกันใหม่ตอนต่อไปครับ
แหล่งอ้างอิง:
[1] บุญเจริญ ศิริเนาวกุล. ปัญญาประดิษฐ์ : ปัญญาเชิงกลุ่ม = Artificial Intelligence : Swarm Intelligence. -- กรุงเทพฯ : ท้อป, 2555.
[2] อาทิตย์ ศรีแก้ว. ปัญญาเชิงคำนวณ, Computational Intelligence. พิมพ์ครั้งที่ 1 (ฉบับปรับปรุงปี 2552), บจก. จรัลสนิทวงศ์การพิมพ์, กุมภาพันธ์ 2553
..........
ยกตัวอย่างเช่น มีนกฝูงหนึ่งกำลังบินสุ่มหาอาหารอยู่พื้นที่หนึ่ง ที่ซึ่งมีอาหารอยู่เพียงชิ้นเดียวในบริเวณนั้น นกทุกตัวไม่รู้ว่าอาหารอยู่ที่ตำแหน่งไหน แต่สัณชาตญานพวกมันรู้ว่ามันอยู่ห่างจากอาหารเท่าไหร่ โดยเมื่อพวกมันบินไปในแต่ละช่วง พวกมันจะหาระยะห่างของมันจากแหล่งอาหาร และนกทั้งฝูงจะเลือกบินตามนกตัวที่อยู่ใกล้อาหารมากที่สุด จากนั้นพวกมันก็จะบินช่วงต่อไป โดยที่นกทั้งฝูงจะทำซ้ำเช่นนี้ไปเรื่อยๆ จนพวกมันบินมาถึงแหล่งอาหาร จากวิธีการหาอาหารของฝูงนกเราจะเห็นว่า ในการกำหนดตำแหน่งระยะห่างของตัวมันจากแหล่งอาหาร และการตัดสินใจบินตามนกตัวที่บินอยู่ใกล้แหล่งอาหารมากที่สุด ในแต่ละช่วงจะใช้เวลาน้อยมาก จนเราดูเหมือนมันบินเกาะกลุ่มกันไปแบบต่อเนื่อง
PSO เป็นการจำลองการหาอาหารของฝูงนก ในการหาค่าเหมาะที่สุดแบบนี้ นกแต่ละตัวในฝูงจะถูกแทนด้วยอนุภาค (particle) ในอนุภาคแต่ละตัวจะมีค่า ฟิตเน็ส (fitness value) ที่บอกถึงระยะห่างของตัวมันจากแหล่งอาหาร โดยอนุภาคทั้งหมดจะบินตามอนุภาคที่มีค่าฟิตเน็ตที่ดีที่สุดในแต่ละช่วง/รอบ (Iteration)
แนวคิดของ PSO จะเริ่มต้นด้วยการสุ่มหาตำแหน่งของอนุภาค (ซึ่งตำแหน่งต่างๆ ของอนุภาคเหล่านั้นก็คือคำตอบที่เป็นไปได้) ขึ้นมาชุดหนึ่ง จากนั้นก็จะหาค่าเหมาะสมที่สุดด้วยการปรับปรุงค่าในแต่ละรอบของการตัดสินใจ โดยที่อนุภาคแต่ละตัวจะมีการปรับปรุงค่าด้วยการเปลี่ยนตำแหน่งตามค่าที่ดีที่สุด (Best) ซึ่งมี 2 ค่า ได้แก่
- ค่าที่ดีที่สุดของอนุภาค (pbest : particle best) คือค่าตำแหน่งที่ดีที่สุดของการเคลื่อนที่ที่ผ่านมาของตัวมันเอง
- ค่าที่ดีที่สุดของสากล (gbest : global best) คือค่าที่เป็นค่าที่ดีที่สุดการเคลื่อนที่ที่ผ่านมาของทั้งกลุ่ม (ฝูง)
- ความเร็วปัจจุบันของอนุภาคนั้น (velocity)
- ข้อมูลที่อนุภาคมีอยู่ (pbest)
- ข้อมูลรวมของอนุภาคทั้งกลุ่ม (gbest)
คำนวนค่าความเร็วใหม่ของอนุภาคตามสมการ 1.1
vik(t+1) = vik(t) + [c1 * r1 * (p(t) - xik(t))] + [c2 * r2 * (g(t) - xik(t))]
ปรับปรุงค่าตำแหน่งใหม่ของอนุภาคตามสมการ 1.2
xik(t+1) = xik(t) + vik(t+1)
** c1,c2 คือค่าคงที่ บางครั้งถูกเรียกว่า ค่าแฟคเตอร์การเรียนรู้ (เอาไว้ถ่วงน้ำหนักความจำ) โดยทั่วไปจะเท่ากับ 2 แต่ก็สามารถใช้ค่าอื่นๆ ได้ โดยที่จะมีช่วงระหว่าง [0,4] หรือ 0 ถึง 4
ค่า c1 = 0.729 และ c2 = 1.494 เป็นค่าที่เคอร์ (Clerc,1999) แนะนำ **
อัลกอริทึม PSO
** สำหรับตอนนี้คงขอจบเท่านี้ก่อน ตอนต่อไปจะเป็นเรื่องของขั้นตอนการทำงานของ PSO และจะลองมาคำนวณกันดูว่าแต่ละรอบการทำงานของ PSO ค่าที่ได้มีอะไรบ้าง ไว้พบกันใหม่ตอนต่อไปครับ
แหล่งอ้างอิง:
[1] บุญเจริญ ศิริเนาวกุล. ปัญญาประดิษฐ์ : ปัญญาเชิงกลุ่ม = Artificial Intelligence : Swarm Intelligence. -- กรุงเทพฯ : ท้อป, 2555.
[2] อาทิตย์ ศรีแก้ว. ปัญญาเชิงคำนวณ, Computational Intelligence. พิมพ์ครั้งที่ 1 (ฉบับปรับปรุงปี 2552), บจก. จรัลสนิทวงศ์การพิมพ์, กุมภาพันธ์ 2553
ความคิดเห็น
pso นี้ สามารถตั้ง range การค้นหาของตัวแปรแต่ละตัวได้มั้ยครับ
ตอบลบพอดีผมมีตัวแปร 11 ตัว และต้องการให้การค้นหาอยู่ใน range ที่ต้องการ เพื่อเอาไปใช้กับตัวควบคุม
แล้ววิธีการต้องทำอย่างไรหรอครับถ้าทำได้
ผมเป็นมือใหม่น่ะครับ ใช้บน MATLAB
ขอบคุณครับ :)
เมื่อไหร่พี่จะอธิบายขั้นตอนการทำงานของ PSO อ่ะค่ะ..อยากรู้กระบวนการทำงานของมันจัง พร้อมเขียนโค้ดแสดงผลPSO ด้วยนะค่ะ อธิบายให้ทีนะค่ะ ขอบคุณค่ะ
ตอบลบอยากได้วิธีการเขียนโค้ดเหมือนกันค่ะ ขอบคุณมากค่ะ
ตอบลบขอบคุณที่ติดตามนะครับ พอดีช่วงนี้ยุ่งมากเลยไม่มีเวลาเขียนบล็อกต่อสักเท่าไหร่ คิดว่าคงจะเขียนต่อให้จบในเรื่องของ PSO นะครับ ส่วนตัวผมจะใช้ Python ประมวลผลเป็นหลัก สำหรับคนที่ใช้ MATLAB แนะนำให้ลองค้นหาตัวอย่างดูนะครับ ซึ่งมีเยอะมากเลย
ตอบลบ