การเขียนโปรแกรมทางพันธุกรรมเป็นวิธีที่มีโปรแกรมเขียนคอมพิวเตอร์สำหรับคุณ!
อย่าคิดว่า "โปรแกรม" เช่น MS Word ให้นึกถึง "โปรแกรม" ดังต่อไปนี้:
function(x){ return x*2; }
ฟังก์ชั่นนี้ (หรือโปรแกรม) โดยตัวมันเองไม่มีเหตุผลที่จะมีอยู่ เรากำลังมองหาวิธีการแก้ไขปัญหา หากคุณต้องการหาผลรวมของตัวเลขสองตัวคุณเพียงแค่เปิดเครื่องคิดเลขและทำคณิตศาสตร์ เกิดอะไรขึ้นถ้ามีคนให้ตารางต่อไปนี้แก่คุณและขอให้คุณหาความสัมพันธ์ระหว่างresult
และx
กับy
:
x y result
99 1 (3.02)
79 88 2.01
21 62 5.01
84 52 (6.58)
12 70 5.54
67 18 0.73
ข้อมูลนี้เป็นข้อมูล "การฝึกอบรม" ของคุณ คอมพิวเตอร์ของคุณจะใช้ข้อมูลนี้เพื่อสร้างสมมติฐานบางอย่างจากนั้นคุณจะทดสอบกับข้อมูลจริง
สมมติว่าคุณไม่ทราบสถิติและตัดสินใจว่าปัญหานี้ยากเกินกว่าที่จะคาดเดาได้ด้วยตัวคุณเองดังนั้นคุณจะได้คอมพิวเตอร์ที่จะช่วยคุณค้นหา
ให้คอมพิวเตอร์สร้างการคาดเดาแบบสุ่ม
คุณมีคอมพิวเตอร์ที่สร้างคำตอบได้ล้านคำและดูว่ามีคำตอบใดติดไหม (เดาว่า ... ล้านครั้ง!) ต่อไปนี้เป็นตัวอย่างของการเดาสองสามข้อ:
function(x,y){ return x+y; } // wrong
function(x,y){ return x/1*1*1*1*1*1+y; } //wrong, silly
คุณอาจจะรู้หรือไม่ก็ได้ แต่ฟังก์ชั่นหรือโปรแกรมสามารถแสดงเป็นต้นไม้ได้ตัวอย่างเช่นฟังก์ชั่นที่สองจะเป็น:
(+ (/ x (* 1 (* 1 (* 1 (* 1 (* 1 1)))) y)
คุณสามารถทำให้มันดูเหมือนต้นไม้มากขึ้นโดยการเยื้องลงไปเช่นนั้น (btw, ค้นหาสัญกรณ์โปแลนด์ย้อนกลับและไวยากรณ์เสียงกระเพื่อม ... แต่คุณจะเข้าใจว่าทำไมเราจึงแสดงโปรแกรมเช่นนี้ในไม่ช้า):
(+
(/ x
(* 1
(* 1
(* 1
(* 1
(* 1 1))))
y)
( +
อยู่ที่ด้านบนมีสอง "ใบ" ของ/
และy
. /
ตัวเองมีเด็กหลายคนอื่น ๆ )
นี่คือเหตุผลที่คุณอ่านมากเกี่ยวกับ "ต้นไม้" ในการเขียนโปรแกรมทางพันธุกรรม ในกรณีใด ๆ เราเสียบค่าของx
และy
ลงในฟังก์ชั่นนี้และมันให้คำตอบที่ผิด ไม่น่าแปลกใจเลยว่าเมื่อเราสร้างสิ่งนี้แบบสุ่ม
ตอนนี้คุณตัดสินใจที่จะสร้างโซลูชั่นดังกล่าวเป็นล้าน พวกเขาทั้งหมดผิด อย่างไรก็ตามคุณสังเกตเห็นว่าคำตอบบางคำตอบใกล้กว่าคำตอบที่ถูกกว่า กล่าวอีกนัยหนึ่งการแก้ปัญหาบางอย่างนั้น "พอดี" มากกว่าวิธีอื่น ๆ โปรดทราบว่าคอมพิวเตอร์ไม่ทราบว่า "ถูกต้อง" และ "ผิด" ดังนั้นคุณต้องจัดเตรียม "ฟังก์ชันการออกกำลังกาย" ของคุณเอง ฟังก์ชั่นนี้ได้รับการส่งมอบโซลูชั่นที่เป็นไปได้ข้อมูลการฝึกอบรมและมีหน้าที่รับผิดชอบในการบอกระบบ GP ว่า "เหมาะสม" กับโซลูชันนี้อย่างไร อย่างที่คุณสามารถจินตนาการได้ฟังก์ชั่นนี้มีการเรียกใช้หลายล้านครั้งในหลายล้านครั้ง
สิ่งที่ทำให้ GP แตกต่าง
นี่คือสิ่งที่ทำให้การเขียนโปรแกรมทางพันธุกรรมแตกต่างจากการคาดเดาป่า คุณตัดสินใจที่จะทำการเดาอีกรอบหนึ่งล้านครั้ง อย่างไรก็ตามคุณทำได้อย่างชาญฉลาดขึ้นเล็กน้อย คุณรับการคาดเดา 10% อันดับแรก (ค่าที่เดาได้ใกล้เคียงกับค่าจริง) และทำให้เป็นส่วนหนึ่งของรุ่นที่สอง คุณยังใช้วิธีแก้ปัญหาเหล่านี้จำนวนมาก (อาจเหมือนกัน 10% ... ฉันจำไม่ได้) และตัดสินใจที่จะ
คุณสุ่มเลือกสองวิธีสุ่มเลือก sub-trees และเริ่มทำการแลกเปลี่ยน ดังนั้นส่วนหนึ่งของการแก้ปัญหา A สิ้นสุดลงภายใต้โซลูชัน B และในทางกลับกันคุณแค่ "ข้าม" มัน นอกจากนี้คุณยังใช้วิธีแก้ปัญหาและเพียงแค่ "กลายพันธุ์" พวกเขา ... ใช้ทรีย่อยและ 'ไขมัน' เล็กน้อย (เฮ้ถ้าวิธีแก้ปัญหาแย่มาก
วิธีคิดที่ดีคือสิ่งต่อไปนี้แม่และพ่อของคุณมีคุณลักษณะบางอย่างเช่นสีผมความสูงความเป็นไปได้ของโรค ฯลฯ คุณในฐานะที่เป็นเด็กสืบทอดคุณสมบัติที่แตกต่างจากทั้งพ่อและแม่ของคุณ ถ้าพ่อแม่ของคุณทั้งคู่เป็นนักกีฬาโอลิมปิกคุณก็จะเป็นนักกีฬาที่ยอดเยี่ยมใช่มั้ย นักชีววิทยาสังคมวิทยาและนักประวัติศาสตร์อาจมีปัญหากับความคิดนี้ แต่นักวิทยาศาสตร์คอมพิวเตอร์ไม่ได้เกี่ยวข้องกับคุณธรรมของสุพันธุศาสตร์ที่นี่ พวกเขาเห็น "ระบบ" ทำงานได้ดีมากในการจัดหาโซลูชั่นดังนั้นพวกเขาจึงตัดสินใจสร้างแบบจำลองในซอฟต์แวร์
ถ้ามันไม่ตรงกับชีววิทยา แต่ก็ยังให้คำตอบที่ดี ... นักวิทยาศาสตร์คอมพิวเตอร์หลายคนรวมกันพูดว่า "อะไรก็ตามที่เพื่อนและขอบคุณสำหรับคำศัพท์" โปรดทราบว่าพี่น้องของคุณทุกคนและไม่เหมือนกันแน่นอน ... ถึงแม้พวกเขาจะมีพ่อแม่คนเดียวกัน แต่ละคนมียีนที่กลายพันธุ์ด้วยเหตุผลใดก็ตาม (โปรดอย่าแสดงสิ่งนี้กับนักชีววิทยาประเด็นคือเพื่อทำความเข้าใจแรงจูงใจเบื้องหลังคำศัพท์มากมาย)
ดังนั้นตอนนี้เรากำลังทำให้คอมพิวเตอร์สร้างโปรแกรมหลายล้านโปรแกรมและวัดความเหมาะสมของโปรแกรม ทางออกที่ดีที่สุดอยู่รอดในรุ่นต่อไป นอกจากนี้เรายัง "กลายพันธุ์" และข้ามไปที่ "ประชากร" (สังเกตว่าภาษาพันธุศาสตร์และชีววิทยากำลังใช้งานอยู่) เมื่อมีการสร้างรุ่นที่สองฟิตเนสจะถูกวัดอีกครั้ง เนื่องจากรุ่นนี้มีทางออกที่ดีที่สุดจากรุ่นก่อนหน้าและเราได้ข้ามและกลายพันธุ์โซลูชันที่ดีที่สุด (รวมถึงประชากรทั่วไป - เพื่อรักษาความหลากหลาย) คนรุ่นนี้ควรจะดีกว่ารุ่นก่อนอย่างน้อยเล็กน้อย
เราทำสิ่งนี้ต่อไปเป็นเวลาหลายชั่วอายุคน แต่ละรุ่น (หวังว่า) จะให้ทางออกที่ดีกว่าและดีกว่าจนกว่าเราจะได้คำตอบที่ถูกต้อง ตัวอย่างเช่น:
(+ (- 2.2 (/ x 11) (* 7 (cos y))))
ลองดูที่นี่ถูกต้อง!
(ฉันคัดลอกมาจากhttp://en.wikipedia.org/wiki/Genetic_programmingซึ่งมีการแสดงกราฟิกของต้นไม้ต้นนี้ด้วย)
อัตราต่อรองและสิ้นสุด
มีบางประเด็นที่สำคัญเช่นวิธีการทำคุณตัดสินใจที่ "ขั้ว" คือ ( +, -, *, /, cos, sin, tan
) พร้อมใช้งานกับระบบ GP ของคุณว่าคุณจะเขียนฟังก์ชั่นการออกกำลังกายและวิธีการที่จะจัดการกับระบบโปรแกรมที่ไม่ใช่ sensical เช่น(1 + cos)
หรือ(2 / "hello")
(คนอื่น)
มันค่อนข้างน่าเบื่อที่จะพัฒนาสมการ มันน่าสนใจมากขึ้นถ้าชุดเทอร์มินัลของคุณมีลักษณะดังต่อไปนี้: (ไฟ, สัมผัสศัตรู, เคลื่อนไหว, ... ) และฟังก์ชั่นการออกกำลังกายของคุณจะวัดสุขภาพของคุณและจำนวนซากศพของสัตว์ประหลาดต่อสู้
ฉันเขียนสิ่งนี้จากความทรงจำส่วนใหญ่ แต่นี่เป็นแนวคิดพื้นฐาน ฉันทำ GP ในช่วงวิทยาลัยของฉัน คุณควรเล่นกับมันแน่นอน ไม่ต้องกังวลเกี่ยวกับการทำความเข้าใจคำศัพท์ทั้งหมดเพียงดาวน์โหลดระบบ GP ฟรีวิ่งผ่านตัวอย่างเล็ก ๆ น้อย ๆ เพื่อทำความเข้าใจและสร้างตัวอย่างที่น่าสนใจของคุณเอง (ค้นหาความสัมพันธ์ระหว่างชุดข้อมูลต่าง ๆ ลองเชื่อมโยงกับเกม API ฯลฯ )