วันพฤหัสบดีที่ 7 มิถุนายน พ.ศ. 2561

ขั้นตอนวิธีที่ทำให้ TCAS รอบ 3 สามารถเลือกอันดับได้

ไม่ได้เขียนบล็อกมานานตั้งแต่ต้นปีเหมือนเดิมเพราะยุ่งมาก แต่วันนี้รู้สึกอยากเขียนเรื่อง TCAS สักหน่อย เพราะตัวเองก็ต้องศึกษาระบบนี้ เนื่องจากลูกก็สอบเข้ามหาวิทยาลัยปีนี้ และก็มองเห็นปัญหาว่าระบบในรอบ 3 นี้มันจะมีปัญหากั๊กที่แน่ ก็เลยบอกลูกว่ายังไงก็ต้องตั้งใจให้เต็มที่ทำคะแนนให้สูง ๆ เข้าไว้ และลูกก็ทำได้ ดังนั้นเขาไม่ใช่เด็กที่มีปัญหาในรอบนี้แต่อย่างใด ประกอบกับเขาอยู่สายศิลป์-คำนวณ และคณะที่เขาเลือกปีนี้ก็มาแยกสายวิทย์ กับสายศิลป์-คำนวณพอดี ดังนั้นก็ยิ่งเข้าทางเขา สำหรับใครที่ไม่ได้ตามข่าวหรือยังไม่ค่อยเข้าใจระบบนี้สามารถอ่านได้จากบทความนี้นะครับ

https://www.the101.world/from-admission-to-tcas/

และปัญหาที่เกิดขึ้นสามารถอ่านได้จากบทความนี้นะครับ

 https://www.khaosod.co.th/special-stories/news_1173473

ปัญหาหลักที่เกิดในรอบ 3 ก็คือการกันที่กันหรือเรียกว่ากั๊กที่ครับ ระบบก่อนหน้า TCAS ก็กั๊กกัน แต่พวกที่เลือกหมอเขาจะประกาศผลไปต่างหากอยู่แล้ว และในระบบก่อนหน้านี้ แต่ละมหาวิทยาลัยจะบริหารจัดการกันเอง ด้วยการเรียกเด็กที่ติดสำรองมาแทนเด็กที่ติดตัวจริงที่ไม่มาสอบสัมภาษณ์ (เพราะเลือกที่อื่นไปแล้ว) แต่ในปีนี้ที่ประชุมอธิการบดีแห่งประเทศไทย (ทปอ.)  ซึ่งเป็นผู้คิดระบบ TCAS ไม่รู้มีอะไรมาดลใจ ให้เอาพวกหมอมารวมในรอบรับตรงนี้ด้วย และไม่ให้มีการเรียกสำรองอีกต่างหาก ผลก็คือเกิดมหกรรมการกั๊กที่อย่างเป็นรูปธรรมตามลิงก์ข้างบนครับ

มีคนถามทปอ.ว่าทำไมรอบ 3 ไม่ทำเหมือนรอบ 4 คือให้เรียงลำดับที่ตัวเองต้องการแล้วก็ให้ติดเฉพาะอันดับสูงสุดที่ตัวเองเลือกไว้ ทปอ.บอกทำไม่ได้ เพราะในรอบ 3 นี้คณะและมหาวิทยาลัยต่าง ๆ ใช้เกณฑ์ไม่เหมือนกัน เช่นบางคณะเอาแต่ GAT/PAT บางคณะใช้ 9 วิชาสามัญ ดังนั้นต้องให้เด็กติดทุกสาขาที่ผ่านเกณฑ์แล้วให้เด็กตัดสินใจเลือกทีหลัง (ซึ่งเป็นที่มาแห่งมหกรรมการกั๊กที่)

ผมลองมานั่งคิดดูว่าทำไม่ได้จริงหรือ คิดไปคิดมาก็เห็นว่าน่าจะทำได้นะ ก็เลยมาเขียนบทความนี้เพื่อลองเสนอว่าถ้าจะออกแบบโปรแกรมรอบรับตรงร่วมกันให้สามารถทำให้เด็กเลือกอันดับได้และติดอันดับสูงสุดอันดับเดียวจะทำยังไง หลักการคืออย่างนี้ครับ หนึ่งเลยเอาพวกหมอออกไปอยู่ในรอบต่างหาก (จริง ๆ จะไม่แยกก็ได้ แต่จะทำให้ระบบต้องทำงานหนักโดยไม่จำเป็น เพราะพวกหมอเขามีระบบของเขาอยู่แล้ว) จากนั้นรอบรับตรงร่วมกันก็ให้เด็กเลือกที่ต้องการได้ 4 อันดับ จากนั้นก็ส่งชื่อเด็กให้มหาวิทยาลัยทำการเรียงลำดับคะแนนของเด็กตามเกณฑ์ที่แต่ละคณะใช้ หรือทปอ.จะเขียนโปรแกรมทำให้เองก็แล้วแต่ เช่นคณะไหนใช้แต่ GAT/PAT ก็คำนวณโดยใช้แค่ GAT/PAT และเรียงลำดับมา โดยคะแนนของเด็กที่อยู่ในช่วงจำนวนที่คณะจะรับจะเรียกว่าเป็นตัวจริง ส่วนที่เหลือก็จะเป็นตัวสำรอง เช่นบัณชีจุฬาจะรับ 150 คน เด็กที่อยู่ใน 150 คนแรกก็เป็นตัวจริงของบัญชีจุฬา ที่เหลือก็เป็นตัวสำรอง

เมื่อได้คะแนนเรียงตามลำดับมาแล้วก็เริ่มทำการจัดอันดับตามที่นักเรียนเลือก  โดยรอบแรกก็จัดจากอันดับที่เลือกเป็นอันดับ 1 ก่อน ดังนี้

ทำจนกว่า จะไม่มีนักเรียนที่สามารถจัดอันดับ 1 ได้ (คือทำจนสามารถจัดนักเรียนทุกคนที่เลือกอันดับ 1 ได้ หรือจนกว่าคณะที่เลือกเป็นอันดับ 1 ของนักเรียนเต็มแล้ว) 
   อ่านข้อมูลของนักเรียนโดยอ่านจากอันดับ 1 ที่เลือก 
   ถ้านักเรียนติด (อยู่ในกลุ่มตัวจริง ของอันดับ 1 ที่เลือก)  
        เขียนข้อมูลนักเรียนและสาขาที่ติด
        เช็คว่านักเรียนติดอันดับ 2 3 และ 4 ด้วยหรือไม่ ถ้าติดอันดับใด ให้ลบชื่อนักเรียนออกจากสาขาที่ติดนั้น   แล้วเลื่อนอันดับสำรองถัดไปของสาขานั้นเข้ามาเป็นตัวจริง (พูดง่าย ๆ นี่คือการเรียกตัวสำรองนั่นเอง) 
กลับไปที่ต้นลูป

เมื่อทำจบรอบนี้เราก็จะได้นักเรียนที่ได้สาขาที่ตัวเองเลือกเป็นอันดับ 1

รอบต่อไปก็ทำเหมือนกันแต่ทำอันดับ 2 3 และ 4 ตามลำดับ ซึ่งถ้าถึงอันดับ 4 แล้วนักเรียนก็ยังไม่ติดก็แสดงว่านักเรียนไม่ติดในรอบนี้ ต้องไป TCAS รอบ 4 ต่อไป

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

มีความเห็นอะไร หรือเห็นว่าขั้นตอนวิธีที่นำเสนอมีข้อบกพร่องอะไรก็สามารถแลกเปลี่ยนกันได้ครับ