ใครก็ได้ช่วยสอนการcode program นี้ให้ทีค่ะ

ภาษา c หรือ c++ หรือ C# หรือ JAVA หรือ VB ก็ได้จ้า
สมมติเรามีงานซึ่งสัมพันธ์กัน ที่เป็นแบบนี้

https://www.picz.in.th/image/TM0Gft

หรือที่เรียกว่า precedence constraint
1 กับ 2 ทำได้เลย ไม่มีงานก่อนหน้า
3กับ4 ทำได้ก็ต่อเมื่อ 1 ทำแล้ว
7 ทำได้เมื่อ 4กับ5 ทำแล้ว คร่าวๆประมาณนี้
เอาหละมาลุยกัน
ในโปรแกรมส่วนแรก เราจะสร้างลำดับการทำงานด้วยวิธีการในลักษณะนี้ (โปรแกรมที่1)

https://img.live/image/7nKl6q

คือเริ่มต้น เราจะเห็นว่า 1กับ 2 ไม่มีงานก่อนหน้า ดังนั้นโปรแกรมจะสุ่มเลือก 1 หรือ 2 ก็ได้ ในที่นี้สมมติว่าสุ่ม ได้ 1 ก่อน
พอ 1ถูกเลือก นั่นหมายความว่า 3 กับ 4 ก็สามารถทำได้จ้า ต่อมาเราจึงสุ่มเลือกงาน 2 หรือ 3 หรือ 4 ก็ได้ ในทีนี้สมมติโปรแกรมสุ่ม 4 ออกมา
ตอนนี้ชุดคำตอบจึงเรียงเป็น (1 4)  ทีนี้พอ 4 ถูกเลือกแล้ว ถึงแม้หลัง 4 จะมีงาน 7 แต่ยังไม่สามารถทำ 7 ได้เพราะ 5 ยังไม่ถูกทำจ้า
จึงเหลือที่เลือกต่อได้คือ 2 หรือ 3 ซึ่งในที่นี้สมมติว่า โปรแกรมเลือก 2 คำตอบตอนนี้จึงเป็น (1 4 2)  พอ 2 ทำแล้ว ทีนี้ 5 ก็สามารถทำได้ ต่อไปจึงสามารถสุ่มเลือกได้ระหว่าง 3 กับ 5  ทำแบบนี้จนกว่าจะครบ 8 งานเลย (โปรแกรมสุ่มเองจาก Avaliable setนะ)
พอเสร็จเราก็จะได้คำตอบแบบเรียงลำดับ ที่ไม่ขัดต่อความสัมพันธ์ก่อนหลัง
ซึ่งจากการrun รอบนี้ โปรแกรมให้คำตอบเป็น (1 4 2 5 3 7 6 8)
ต่อมา ชุดคำตอบจะถูกนำไป ผ่านกระบวนการทาง genetic algorithm ซึ่งชุดคำตอบมันอาจจะเป็นคำตอบ ที่มันเป็นไปไม่ได้(Infeasible offspring)

ทีนี้เรามาดูอีกโปรแกรมกัน (โปรแกรมที่2)

https://img.live/image/7nKKaK

เริ่มต้นที่ เรามีลำดับการเรียงงานอยู่ชุดนึง ในที่นี้คือ (2 7 1 4 5 3 6 8) ซึ่งถ้าเราพิจารณาจะพบว่า แบบนี้มันขัดต่อความสัมพันธ์นะ
โปรแกรมนี้ จะต้องนำ เจ้าเส้น (2 7 1 4 5 3 6 8) มาดูให้ออกว่า มันเป็นคำตอบที่เป็นไปไม่ได้นะแล้วเราก็จะซ่อมแซมมัน
โดย Avaliable set มีที่มาแบบเดียวกับ โปรแกรมแรกเลย(ช่วยทำให้ได้ทีเถอะ please)
เพียงแต่ว่า ในการสร้างลำดับขึ้นมาใหม่ (Repaired string) มันจะอิงจาก (2 7 1 4 5 3 6 8) (infeasible offspring) ด้วย
อย่างเช่น ในขั้นตอนแรก ตัวที่สามารถเลือกได้เพราะไม่มีงานก่อนหน้า คือ 1 กับ 2 แต่รอบนี้การจะเลือก 1 หรือ 2 นั้น เราจะเลือกจากการพิจารณาว่า ระหว่าง 1 หรือ 2  อะไรมาก่อนกัน จากตัว (2 7 1 4 5 3 6 8) ที่เราเอามาอิง ซึ่งเราจะพบว่า 2 มันมาก่อน 1 นะ จุดนี้เราจะให้โปรแกรมต้องเลือก 2 ออกมาก่อน ซึ่งทีนี้เมื่อ 2 ถูกเลือกแล้ว 5 ก็สามารถถูกเลือกได้ในขั้นถัดไป

ขั้นที่2 จะเห็นว่า โปรแกรมต้องเลือกระหว่าง 1 กับ 5 โปรแกรมก็จะต้องวนไปดูว่า 1 กับ 5 อะไรมาก่อนกันใน (2 7 1 4 5 3 6 8) ซึ่งพบว่า 1 มาก่อน ดังนั้นเลือก 1 ชุดคำตอบใหม่ตอนนี้จึงเป็น (2 1) พอ 1 ทำแล้ว 3กับ4 ก็ทำได้

ขั้นที่3 โปรแกรมต้องเลือกระหว่าง 3 4 5 เราก็ไปดูบน (2 7 1 4 5 3 6 8) พบว่า 4 มาก่อน ดังนั้นเลือก4 ชุดคำตอบตอนนี้ก็จะเป็น (2 1 4) ทำแบบนี้จนกว่าจะครบจ้า

จนในที่สุด คำตอบที่ได้ก็จะเป็นรูปแบบใหม่ที่ไม่ขัดกับความสัมพันธ์ ซึ่งในที่นี้คือ (2 1 4 5 7 3 6 8)

มันเป็นการทฤษฎีนึงของ topological sort แต่ว่า มันใช้การสุ่มเขามาเลือกจากเซตของงานที่เป็นไปได้สำหรับลำดับถัดไป ซึ่งต่างจาก Khan's algorithm และ dfs ตรงที่ ในการrun โปรแกรมแรกแต่ละครั้ง อาจได้ลำดับคำตอบที่ไม่เหมือนกัน แต่คำตอบนั้นไม่ขัดกับหลักความสัมพันธ์ก่อนหลัง ในขณะที่ Khan's algorithm และ dfs มันให้คำตอบเดิมเสมอจ้า หาพวกpseudo code หรือตัวอย่างโค้ดไม่ได้เลย มีเพียงแต่คนบอกว่าใช้วิธีนี้ แต่ source code ก็ไม่เคยหาได้เลย
ตอนนี้ทำ check box หน้าตาแบบนี้ ไว้ดูคู่ลำดับงานก่อนหลัง โยนให้ khan's algorithm อยู่จ้า

https://www.picz.in.th/image/TMzY5P

ความหมายเป็นแบบนี้จ้า
แถวที่ 1 ติ๊ก ถูก บน คอลัมน์  3 4
หมายถึง 1 ต้องทำก่อน ถึงเลือก 3 4 ได้
ส่วนในกรณีที่มีงานก่อนหน้าหลายงาน เช่น  8 ต้องทำ 6 กับ 7 ก่อน
เราก็จะติ๊กถูกบน แถว 6 คอลัมน์8 กับ แถว 7 คอลัมน์ 8 จ้า
ส่วนช่องที่เลขแถวกันคอลัมน์ตรงกัน เช่น 1,1 2,2 เราตั้งเป็นdefault ไว้ ไม่ให้เลือกจ้า
พี่ๆชาวโปรแกรมเมอร์คนไหนพอจะช่วยน้องได้บ้างคะ ช่วยทีเถอะนะคะ พลีส ขอความกรุณาและเห็นใจค่ะ แงงงงงง!! O_O" ทำไม่เป็นจริงๆ
ปล. ไม่ได้เรียนทางด้านคอมพิวเตอร์ มีความรู้ในการเขียนโปรแกรมเพียงเล็กน้อยค่ะ
แก้ไขข้อความเมื่อ
แสดงความคิดเห็น
โปรดศึกษาและยอมรับนโยบายข้อมูลส่วนบุคคลก่อนเริ่มใช้งาน อ่านเพิ่มเติมได้ที่นี่