ตอนนี้ผมกำลังเขียน macro ใน Excel เป็นโปรแกรมจัดตารางเบรคอัตโนมัต โดยคนใช้เพียงแค่ระบุจำนวนคนที่เข้าทำงานแต่ละกะ
แล้วโปรแกรมจะจัดออกมาเป็นช่วงเวลาว่ารอบนี้เบรคกี่โมงบ้าง รายละเอียดย่อยๆก็คือ
-กะเริ่มต้นคือ 8:30 ต่อไปทุกๆครึ่งชม.จนถึง 15:30 โดยจำนวนคนในกะแต่ละวันอาจจะไม่เท่ากัน
-ทุกคนทำงาน 8 ชั่วโมงครึ่ง(รวมเวลาเบรค) ก็คือ กะ 8:30 เลิก 17:00 และกะสุดท้าย 15:30 เลิก 24:00
-แต่ละคนจะมีเบรค 3 ครั้ง เบรคแรก 15 นาที เบรคที่2 1 ชม. เบรคสุดท้าย 15 นาที
เงื่อนไขในการจัดตารางเบรคมี 2 อย่าง
- การจัดต้องคำนึงถึงจำนวนคนที่ทำในช่วงเวลานั้นๆด้วย โดยจะดูจากจำนวนคนที่ทำงานทั้งหมด - จำนวนคนเบรคในเวลานั้น
และจำนวนคนทำนั้นต้องเพิ่มขึ้นเรื่อยๆตั้งแต่ 8:30 จนไปสูงสุดที่เวลา 15:30 (อาจมีขึ้นลงเล็กน้อยได้บ้าง แต่โดยรวมแล้วต้องเพิ่มขึ้น)
และคงที่ไปเรื่อยๆ(ขึ้นลงเล็กน้อยได้) แล้วเริ่มลดลงตั้งแต่ 17:00
- ช่วงเวลาที่เบรคควรจะเหมาะสมกับคนที่เบรค เพื่อให้ไม่ทำงานเหนื่อยเกินไปด้วย
อธิบายเพิ่มเติม ดูรูปด้านล่างประกอบนะครับ
-ข้อมูลที่เป็น Input จะมีแค่จำนวนคนที่เข้าในแต่ละเวลา ก็คือช่อง In เท่านั้น(โดยจำนวนคนแต่ละวันไม่เท่ากัน)
-เข้า 8:30 เลิกงาน 17:00 เข้า 9:30 เลิก 17:30 ...........
-ข้อมูลที่ต้องการจากโปรแกรมก็คือด้านขวาจะมีบอกเวลาเข้า เวลาเบรคและช่องสำหรับลงชื่อ สร้างขึ้นมาอัตโนมัติ
-ส่วนที่จะมองเป็นหลักตามเงื่อนไขแรกก็คือช่อง AutoIn(จำนวนคนที่ Login ทำงานเวลานั้น) ซึ่งได้มาจาก ManP(จำนวนคนที่เข้ามาทำงานแล้วเวลานั้น) ลบกับ Break(คนที่เบรคในเวลานั้น) โดยตามเงื่อนไขคือจะเพิ่มจำนวนขึ้นเรื่อยๆตั้งแต่เริ่มจนมาสูงสุดที่ประมาณ 15:30 และเริ่มลดลงตั้งแต่ 17:00(รอบ 8:30 เลิกงาน)
http://images.temppic.com/21-01-2007/images_ads/165_1169353731.jpg
ส่วนที่เป็นโจทย์ก็คือทำยังไงให้โปรแกรมจัดเวลาได้เข้ากับเงื่อนไขทั้ง 2 อย่างได้ โดยมีแค่ข้อมูลจำนวนคนเข้า
ปัญหาที่ผมพบก็คือเมื่อพยายามจัดให้ตามเงื่อนไขแรก(AutoIn ขึ้นลงถูกต้อง)เงื่อนไขที่2ในเรื่องของเวลาที่แต่ละคนเบรคก็จะได้ออกมาไม่ดี หรือถ้าพยายามทำให้พร้อมกันทั้ง 2 เงื่อนไข จะกลายเป็นว่าเวลาได้ออกมาไม่ครบ
จะมีเงื่อนไขย่อยๆอย่างเช่น
-เวลาเบรคที่ 2 ก็จะขึ้นอยู่กับเบรคแรกที่ได้ไป
-เวลาเบรคที่จัดแต่ละรอบก็ควรจะกระจายไปถ้าหากมีคนน้อย
ไฟล์ตัวอย่างนะครับ http://download.yousendit.com/FA467DE06B5FE78F
ขอบคุณล่วงหน้าสำหรับทุกคนที่เข้ามาอ่านนะครับ
กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น
เนื่องจาก file มัน expire แล้ว
เลยอาศัยข้อมูลในรูป jpg
แล้วทดลองเขียนโปรแกรมโดยใช้หลักการ genetic algorithm
ทดลองดูได้ผลประมาณนี้
(ไม่ได้ตรวจสอบความถูกต้องนะ แค่เห็นไกล้เคียงก็พอใจแล้ว)
number คือ จำนวนคน ณ ขณะนั้น (ไม่นับพวก break)
valid คือจำนวนคน ที่ลบ พวก break แล้ว
จะเห็นว่าได้ constraint ที่มากขึ้นเรื่อยๆ จน 15:00 แล้วคงที่
แล้วเริ่มลดลงเมื่อ 17:30
ข้อมูลการ break ของแต่ละคน ประมาณนี้
ส่วนวิธี จะค่อยๆอธิบายนะ
library ที่ใช้คือ pygene
จริงๆอยากใช้ ruby แต่ ruby ไม่มี Genetic algorithm library ดีๆเลย
เอ้ย กดนาทีเดียวกัน อืมกำลังหา python ga พอดีเลย
อันที่ 3 ยังเป็นวุ้นอยู่เลยครับ
ส่วน 2 อันแรก ปริมาณเอกสารไกล้เคียงกัน
ดูจำนวน code แล้ว อันแรก น่าจะภาษีดีกว่านะครับ
ในการใช้ GA สิ่งแรกที่เราต้องนิยามก็คือ Gene
เปรียบเทียบกับสิ่งมีชีวิตอย่างเราแล้ว gene แต่ละตัวจะเป็นตัวกำหนด
คุณสมบัติต่างๆของเรา (เช่น gene ตัวนี้กำหนดสีผิว)
ใน pygene มี class สำหรับให้เราเลือกใช้สร้าง gene หลายแบบเชียว
เช่น IntGene, FloatGene
แต่สำหรับ โจทย์นี้ ผมเลือกสร้าง Gene เอง
โดยเลือก gene หนึ่งตัวแทนคนหนึ่งคน
ซื่อภายใน gene จะมีข้อมูล 3 ตัวคือ
ช่วงเวลา break ครั้งที่ 1, ครั้งที่ 2, ครั้งที่ 3
เริ่มด้วยการสร้าง class เพื่อ represent ข้อมูล คนหนึ่งคนก่อน
(ขออภัยในความเยิ่นเย้อของ python, เพราะพึ่งหัดเขียน)
เสร็จแล้วก็ implement gene ขึ้นมา
โดย method ที่สำคัญที่ต้อง override ก็คือ
__add__ -> จะเกิดอะไรขึ้น ถ้าจับ gene 2 ตัวมาผสมกัน
ในที่นี้ลองใช้วิธีหาค่าเฉลี่ย
mutate -> ในการสืบทอดของแต่ละรุ่น จะเกิดการกลายพันธ์
ของเรากำหนดให้มีการกลายพันธ์ที่ เวลาที่ break เลื่อนขึ้นหรือลดลง 1 unit (15 นาที)
random -> รู้สึกจะใช้ตอนที่เริ่มสร้าง gene ครั้งแรก
พอมี gene แล้ว ก็ต้องมี Organism
หรือโครงสร้างที่เกิดจากการรวมตัวของ gene
ในโจทย์นี้ Organism ก็คือผลลัพท์ของการจัดตารางของคนทั้งหมดรวมกัน
สมมติมีคน 43 คน
Organism นี้ก็จะมี 43 gene
Organism นี้จะถูกใจเราหรือไม่ เราก็จะดูที่ Fitness function
ค่านี้คือค่าที่บอกว่า Organism นั้นๆดีพอที่จะอยู่รอดต่อไปในรุ่นหน้าหรือไม่
ถ้าไม่ดีพอ ก็จะตายไป แต่ถ้าดีพอ ก็อาจจะไปจับคุ่กับอีก organize หนึ่ง
แล้วเกิดลูกที่มีคุณสมบัติดีขึ้น
ใน pygene Fitness function ที่เข้าไกล้ 0
จะถือเป็นเป็น Organism ในอุดมคติ
เริ่มด้วยการกำหนด ตารางเข้าทำงาน
แต่ละ element แทนคนหนึ่งคน
ตัวเลขแสดงเวลาที่เข้างาน
0 -> 8:30,1 -> 8:15,...
สร้าง genome โดยใช้ inList เป็นข้อมูล
ตัว genome ใน pygene นั้นกำหนดให้ใช้ dict
ก็เลยต้องตั้งชื่อให้ด้วย
จากนั้นก็นิยาม Organism
ประเด็นต่างๆ ส่วนใหญ่จะอยุ่ที่ fitness function อย่างเดียว
อย่างในที่นี้มี fitness creteria อยุ่ 3 แบบก็คือ
ในคน 1 คน ช่วงเวลาการ break ของแต่ละ break ควรห่างกันประมาณ 2 ชั่วโมง
(15 นาที่เท่ากับ 1 unit, 2 ชั่วโมง เท่ากับ 8 unit)
รวมๆแล้ว ช่วงเวลา break กับทำงาน ร่วมกันแล้วต้องไม่เกิน 9 ชั่วโมง,
ตัวเลขต้องไม่เท่ากับ 0 หรือติดลบ
จำนวนคนที่ active ในช่วงเวลาหนึ่งๆ ต้องค่อยๆเพิ่มขึ้น
จนถึง 15:30 แล้วคงที่ จากนั้นก็ค่อยๆลดลงเมื่อถึงเวลา 17:xx
ตรงนี้เราใช้วิธีสร้าง graph ขึ้นมา แล้วเปรียบเทียบค่าว่า
พฤติกรรม organism เราสอดคล้องกับ graph นี้ไหม
เมื่อมี gene แล้ว มี organism แล้ว
สุดท้ายก็มี Population ที่ประกอบด้วย organism หลายๆตัว
เวลา run ก็ประมาณนี้
ทดลองแค่ 4 รุ่นพอ (เยอะๆแล้วเจ๊ง มั่วหมดเลย)
Note: จริงๆผมก็ไม่รู้หรอกว่า theory ของ GA จริงๆเป็นอย่างไร
ขอใช้คำของคุณ Dome
"program โดยใช้สัญชาตญาน"
มั่วไปเรื่อยๆ
สุดยอดเลยครับ คุณ pphetra เช้านี้ผมนั่งค้นเรื่อง GA ทั้งช่วงเช้าเลย พอจะเข้าใจบ้างนิดหน่อย และไปเจอ อีกเรื่องหนึ่งคือ ant colony รู้สึกเค้าจะลองเอามาใช้แก้ปัญหา Traveling Salesman Problem เหมือนกัน พอจะให้ความรู้เพิ่มเติม (ถ้าเขียนโปรแกรมให้ดูได้ด้วยก็ดีอะ):-)
อืม ผมเข้าใจมดน้อยกว่าอนุภาคและพันธุกรรมนะ particle swarm จะโอเคกว่า…
ใส่ crossover กับ ตาย ซักนิดน่าจะดีขึ้น หวังพึ่ง X-Men มากๆ จะกลายเป็น Doom
โอ้ว ผมลืมไปเลยว่าใช้ GA ช่วยได้
ใช้ lib สำเร็จรูปรึเปล่าครับ หรือว่าเขียนสด
ผมยังไม่เข้าใจเรื่อง GA เลยครับ พออธิบายคร่าวไ้ด้มั้ยครับ หรือว่า เราเปิดห้องเกี่ยวกับ algorithm พวกนี้มาแลกเปลี่ยนคุยกัน ดีอะป่าวอะ
เซียนอย่างคุณ pphetra น่าจะช่วยได้ หุหุ
เรื่องของเรื่องคือ
จริงๆ แล้วมันเหมาะกับ GA มาก เพราะมันสนแค่ผลลัพธ์ และต้องการฟังก์ชั่นเพื่อประเมินความถูกต้องของผลลัพธ์ นอกนั้นก็มั่วแบบมีหลักการ เพื่อให้ลู่เข้าเร็วนิดนึง
ลองอ่านดูแล้วปะครับ http://th.wikipedia.org/wiki/%E0%B8%82%E0%B8%B1%E0%B9%89%E0%B8%99%E0%B8%...
http://en.wikipedia.org/wiki/Genetic_algorithm
โอ้ สุดยอดเลยครับ ผมคงต้องเวลาอ่านอีกซักระยะถึงจะเข้าถึง ยังไงก็ขอบคุณคุณ pphetra มากครับ รวมถึงคนอื่นที่ช่วยตอบด้วยครับ
ว่าแต่ GA แบบนี้ใน VB.net มีมั้ยนะ ลองหาใน google เจอแต่ ebook -_-"
GA lib ใน vb ไม่น่าจะมีนะ
แต่ GA มันไม่ค่อยโหดมาก น่าจะ implement ขึ้นมาเองได้
ต้องกลับไปอ่าน GA โดยด่วน
โลกมันวิ่งแซงผมไปไกลแล้วนะนี่...
เจอเพิ่มเติมจาก Google Code
http://code.google.com/p/pgap/ Python
http://code.google.com/p/noein/ C#
คงต้องหาหนังสือ GA มาอ่านบ้างแล้ว ใครพอมี ebook ให้โหลดบ้างมั้ยครับ ยังไงจะลองพยายามทำดูครับ ขอบคุณมากๆ
นั่งทำความเข้าใจอยู่นาน พอจะมองภาพออกแล้วนอกจากส่วนที่เป็นฟังก์ชั่นที่ 3 ที่เป็นการเทียบกราฟน่ะครับ การสร้างกราฟขึ้นมาแล้วเปรียบเทียบนี้ใช้วิธีเทียบกันอย่างไรครับ
พอเข้าใจในทางแนวคิด แต่เวลานำลงมาเขียนในโปรแกรมจะเขียนเป็นรูปแบบอย่างไรครับ ช่วยชี้แนะด้วย
เริ่มด้วยเรากำหนด graph จำนวนคน ในอุดมคติ ณ ช่วงเวลาใดๆขึ้นมาก่อน
จากนั้น เราก็นำ organism ของเรามา คำนวณว่า
ถ้าเวลา break ออกมาแบบนั้นๆแล้ว
จำนวนคน ณ ช่วงเวลาต่างๆของเราเป็นอย่างไร
ในแต่ละช่วงเวลา
นำค่าที่ได้ - ค่าที่อยากให้เป็น ยกกำลัง 2 (เพื่อไม่ให้เป็นเลขลบ)
ผลรวมก็คือ fitness value
(ถ้าตรงเป๊ะตามที่อยากให้เป็น ก็จะได้ fitness เป็น 0)
function
maketableที่เห็น ก็คือการแปลงรูป gene ให้ออกมาในรูปตารางเพื่อที่จะได้เอาไปเปรียบเทียบ graph
พึ่งจะรู้ว่ามี GA แล้วก็ algorithm อื่นๆ อีกเต็มเลย วิ่งไม่ทันแล้ว T^T
Ruby on new Rails(user) >.<
มาถามเพิ่มเติมใหม่ จริงๆแล้วผมเขียน python ไม่เป็น เลยจะถามว่า
def mutate(self):
x = int(uniform(1,3))
if uniform(-1,1) > 0:
y = 1
else:
y = -1
uniform(1,3)
uniform(-1,1)
นี่หมายถึงอะไรเหรอครับ เป็นการสุ่มค่าหรือเปล่าครับ
เมธอดนี้เอาไว้กลายพันธุ์เพื่อสร้าง Mutant นี่แหละ X-Men ถ้าโชคดีก็ได้ Magneto แต่ถ้าโชคร้ายอาจจะกลายเป็น Rogue
ดูกันชัดๆ มันไม่ได้ทำอะไรมาก ก่อนอื่นก็
xคือช่วงเวลาที่ต้องการเปลี่ยนแปลง 1 คือช่วงก่อนเบรคแรก 2 คือช่วงหลักเบรคแรก 3 คือหลังเบรคที่สองต่อมาก็ มั่วว่าจะ ลด
-1หรือเพิ่ม1โดยที่มีโอกาส 50% เนื่องจากuniform(-1,1)จะให้ค่าเป็นเลขจำนวนจริงในช่วง -1 ถึง 1 พอได้ค่า x y ก็เอาไปใช้เรียกplus()เพื่อเอาค่า y ไปเปลี่ียนในเบรคที่กำหนดบางทีก็รุ้สึกทึ่งกับ GA
ตรงที่มันเป็นเรื่องของ random แท้ๆเลย
อืม ขอบคุณมากครับ คงต้องแกะโคด ไปทำGAเอง รวมทั้งเขียนโปรแกรมให้เสร็จในสัปดาห์หน้า ตายแน่ๆงานปกติก็ต้องทำ T__T