Tag: optimize

  • แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3

    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3

    บอกตามตรงว่าหนึ่งในสิ่งที่ผมชอบที่สุดในเกม Baldur’s Gate 3 คือการที่ Level Up แล้วเราสามารถเปลี่ยนอาชีพโดยการเพิ่ม Subclass ได้ รวมถึงการยอมให้เราสามารถ Respec Class ตัวละครได้ทุกตัว เพื่อเปลี่ยน Ability รวมถึงอาชีพและการอัป Skill ใหม่ตั้งแต่ต้น

    ดังนั้น ในบทความนี้เราจะลองมาสำรวจกันว่า ถ้าเราจะ Respec เพื่อสร้าง Build ตัวละครใหม่ มีแนวทางไหนน่าสนใจ และถ้าเราต้องการ Optimize ค่าบางอย่างในการ Level Up จนเต็ม Level 12 มีแนวทางคำนวณยังไงใน Excel

    ซึ่งขอออกตัวก่อนว่า การ Build ตัวละครใน BG3 นั้น ไม่มีสิ่งที่เรียกว่าดีที่สุด เพราะมันขึ้นกับความชอบส่วนตัวของเราเองด้วย ดังนั้นอ่านบทความนี้แล้ว ถ้าใครเห็นต่างจากแนวทางที่ผมบอก ก็สามารถ Comment แชร์ไอเดียกันได้เต็มที่นะครับ ^^

    วิธีการ Respec Class ตัวละคร

    เพียงแค่จ่ายตัง 100 ให้กับ Withers (ลุงกระดูก) ที่อยู่ใน Camp ของเรา ซึ่งเค้าจะโผล่มาหลังผ่านเควส Explore the Ruins (Dank Crypt) ในช่วงแรกๆ

    ซึ่งเราจะ Respec ตัวละครเราได้เสมอ เมื่อไหร่ก็ได้ ตัวไหนก็ได้ (ทุกตัว Level พอๆ กัน แม้ไม่ได้เอามาสู้)

    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 1

    Tips

    เราสามารถขโมยตังจาก Wither คืนเมื่อไหร่ก็ได้ (มันไม่โกรธ ไม่สนใจด้วยซ้ำ) ดังนั้นมันคือตู้ ATM เคลื่อนที่ชัดๆ 555 (ตอนที่ผมเพิ่งรู้ว่าขโมยคืนได้นี่ได้คืนที 3000 เลย สะสมมานานจัด 555)

    แปลว่า เราสามารถทดสอบสิ่งใหม่ๆ ได้ตลอดเวลา ขอแค่มี Level กับ Item ถึงจุดที่ต้องการ แต่ที่เปลี่ยนไม่ได้ก็มีนะ เช่น เผ่าพันธุ์ของตัวละคร เรื่องของการอัปพลังหนอน เป็นต้น

    เรื่องของ Level Up

    เรื่องสำคัญที่ควรรู้คือ

    • Level สูงสุดของตัวละครแต่ละตัว คือ Level 12 เท่านั้น
    • ในแต่ละการ Level Up เราจะเปลี่ยน Class (อาชีพ) เป็นอะไรก็ได้เลย ต่างกันในแต่ละ Level ได้ (เรียกว่า Multi-Class) ไม่ได้มีเกณฑ์ Attribute ขั้นต่ำของแต่ละอาชีพ (แต่จะเหมาะป่าวอีกเรื่อง)
      • สมมติเป็น Monk 6 Level + Rogue 3 Level + Fighter 3 Level แบบนี้ได้ เพราะรวมกันไม่เกิน 12 เป็นต้น (ตอนอัปสลับลำดับไปมาได้)
      • หรือจะบ้าบอทั้ง 12 Level เป็นคนละ Class กันหมดเลยก็ได้ (มี 12 Class พอดี)
    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 4
    เพิ่ม Class (Multi-class กดตรงนี้)
    • แต่ละ Class จะมี Proficiency ที่ต่างกันไป เช่น ใส่เกราะ หรืออาวุธที่ถนัดต่างกัน
    • แต่ละ Class เมื่อถึงจุดหนึ่งจะเลือก Subclass (อาชีพย่อย) ได้อีก ซึ่งจะมี Skill แตกต่างกัน และมีความสามารถเฉพาะทาง นั่นคือแตกแขนงความเป็นไปได้ออกไปอีก
    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 5
    อัปยังไงก็ได้ ให้ Level แต่ละ Class รวมกันไม่เกิน 12
    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 6
    Multiclass แบบบ้าบอ คือเป็นทุกอาชีพ แต่ Level 1 หมดเลย 555

    เป้าหมายในบทความนี้

    เวลาเราจะ Optimize อะไรก็ตาม เราจะต้องมีเป้าหมายที่อยากได้ ซึ่งในบทความนี้ สมมติว่าการ Build ตัวละครผมมีเป้าหมายหลักๆ ที่จะได้ 4 เรื่อง คือ

    • Feat
    • Extra Attack
    • Action Surge
    • Bonus Attack

    Feat

    แต่ละ Class เมื่อ Level Up ถึงจุดหนึ่ง จะสามารถเลือก Feat ได้ (ขึ้นกับ Class Level ไม่ใช่ Character Level) เพื่อกำหนดแนวทางพัฒนาความสามารถของตัวละครได้หลายแบบ (ทุก Class มี Feat. ให้เลือกแบบเดียวกัน)

    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 7

    โดยที่แต่ละ Class จะมีจุดที่เลือก Feat. ได้หลายรอบ

    • ทุก Class สามารถเลือก Feats ได้ตอน Level 4, 8 และ 12
    • Fighter : ได้เลือกเพิ่มที่ Level 6
    • Rogue : ได้เลือกเพิ่มที่ Level 10

    ดังนั้นสรุปได้ดังนี้

    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 13

    การที่เกมออกแบบมาแบบนี้ แปลว่า ถ้าเราอยากได้ Feat 4 รอบ มีอยู่ 2 แนวทาง (ซึ่งอันนี้ไม่ต้อง Optimize ใน Excel ก็พอคิดได้ ถ้าเราเห็นภาพแบบนี้) คือ

    • ต้องเป็น Fighter หรือ Rogue ล้วนทั้ง 12 Level
    • เป็น Fighter 8 Level แล้ว Multiclass เป็นอาชีพอื่นอีก 4 Level

    อย่างไรก็ตาม ยังมีอีกปัจจัยที่สำคัญมาก ก็คือ หลายๆ Class จะมีความสามารถพิเศษที่ดีมากๆ ในบาง Level ทำให้การตัดสินใจ Multiclass ยากขึ้นไปอีก!!

    ตัวอย่างความสามารถพิเศษที่ส่งผลมากๆ เลยอันหนึ่งคือเรื่องของ Extra Attack รวมถึงพวก Bonus Action เพิ่มเติม

    เพิ่ม Extra Attack

    คือความสามารถที่ถ้าเราใช้ Action ทำการ Attack ศัตรูแล้ว เราจะใช้ Extra Attack เพื่อโจมตีเพิ่มเติมได้! ซึ่งดีมากๆ

    ซึ่ง Extra Attack นั้นสามารถได้มาจากหลากหลายวิธีการ เช่น

    • Barbarian : level 5
    • Bard (College of Valour หรือ College of Swords) : level 6
    • Fighter : level 5 (Extra 1 รอบ) และ level 11 (Extra 2 รอบ)
    • Monk : level 5
    • Paladin : level 5
    • Ranger : level 5
    • Warlock (Pact of the Blade) : level 5 *

    *หมายเหตุ : ปกติแล้ว Extra Attack จะมีผลแค่จากอาชีพเดียวเท่านั้น (ไม่ Stack กัน) ยกเว้น Deepened Pact ของ Warlock (Pact of the Blade) ที่ดัน Stack กับ Extra Attack ของ Class อื่นได้ (ยกเว้นความยากระดับสูงสุดคือ Honour mode จะไม่ Stack)

    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 14

    ที่บอกว่า Extra Attack ของ Warlock มัน Stack กับ Extra Attack ของ Class อื่นได้คือ ต้องทำการ Pack Weapon ใน Main Hand ก่อนนะ นั่นคือมันน่าจะ Stack กับ Unarmed Strike (มือเปล่า) ของ Monk ไม่ได้ [ใครทำได้บอกด้วย]

    ส่วนการตี Extra Attack จะตีด้วยอะไรก็ได้ เข่น ใช้ธนู (ที่ไม่ได้ Pact) ยังได้เลย

    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 15

    เพิ่ม Action ด้วย Action Surge

    นอกจาก Extra Attack แล้ว เรายังมีวิธีเพิ่ม Action ได้อีกรอบ ด้วย Action Surge ได้ ด้วยการเป็น Fighter Level 2 นะครับ (แต่ใช้ได้แค่ 1 ครั้งต่อ Short Rest เท่านั้น)

    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 16

    เพิ่ม Bonus Action

    นอกจาก Extra Attack กับ Action Surge แล้ว ยังมีอีกความสามารถหนึ่งที่เจ๋งมาก ก็คือ Fast Hand ซึ่งเป็นความสามารถของ Thief (ที่เป็น Subclass ของ Rogue) ซึ่งเลือกได้ตอน Level 3 ซึ่งถ้าเป็น Thief แล้ว เราจะมี Bonus Action 2 อันไปเลย

    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 17

    ได้ Bonus Action 2 อันเลย แบบนี้

    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 18

    ดังนั้นถ้าสรุปเป็นตารางให้เห็นภาพ ตอนนี้จะเป็นแบบนี้

    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 19

    พอเห็นแบบนี้แล้ว จะพบว่านี่คือสาเหตุสำคัญที่ Fighter กับ Rogue นั้นเป็นหนึ่งใน Class ยอดนิยมในการ Multiclass สำหรับการต่อสู้สายกายภาพ เลย เพราะมันให้ของดีมากๆ ตลอดทาง

    แนวทางการ Optimize ใน Excel

    ผมลองผู้สูตรแล้วใช้ Solver เพื่อเลือกว่าจะ Up Class อะไรดี เพื่อให้ได้หลายๆ อย่างตามที่ต้องการ

    ซึ่งสูตรที่เขียนไม่ใช่ Linear จึงใช้ Simplex LP ไม่ได้ ก็เลยต้องใช้ Solver แบบ GRG Non-Linear ซึ่งจะทำงานช้ากว่า และ จะอาจจะไม่ได้จุด Global Optimize ที่แท้จริง

    ดังนั้นผมจะทำการ Group อาชีพที่มีลักษณะการ Attack คล้ายๆ กันเข้าด้วยกัน จะได้คำนวณเร็วขึ้น ได้แบบนี้

    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 20
    ภาพรวม
    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 21
    ให้ดูแนวทางการเขียนสูตร
    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 22
    เงื่อนไข Solver

    ผลการแนะนำหลายแบบจาก Solver

    แล้วผมมีการกำหนด Weight ให้แต่ละเรื่อง สุดท้ายลอง Optimize หลายๆ แบบได้ดังนี้

    เน้นที่ภาพรวม

    Weight เป้าหมาย

    Feats : 35%, Action Surge : 15%, Extra Attack : 30%, Bonus Attack : 20%

    สิ่งแรกที่มัน Optimize ตาม Criteria ที่ผมตั้งไว้เลย คือ

    การเป็น Fight12 ทั้ง 12 Level = เป็นแนวทางที่ดีมากอยู่แล้ว

    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 23

    zoom ชัดๆ

    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 24

    เน้นที่ จำนวน Attack+Extra+Bonus

    Weight เป้าหมาย

    Feats : 10%, Action Surge : 10%, Extra Attack : 45%, Bonus Attack : 35%

    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 25

    Fighter 6 + Rogue 6 ก็ได้ Action เยอะสะใจ แถม Feats ก็เยอะ

    ถ้ามีความต้องการเจาะจง

    สมมติว่าเรามีความต้องการเจาะจงบางอย่าง เราก็ระบุลงไปได้ เช่น

    อยากให้ Warlock ขั้นต่ำต้องถึง Level 3 ก็ระบุได้เลย

    Weight เป้าหมาย

    Feats : 25%, Action Surge : 15%, Extra Attack : 40%, Bonus Attack : 20%

    ผลที่ได้บอกว่า Fighter 6 + Warlock 6 ก็จะได้ Feats เยอะด้วย Extra เยอะด้วย

    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 26

    สมมติกำหนดว่าจะเป็น Monk + Rogue แบบนี้ก็ให้มันช่วยคิดได้ ว่าจะกี่ Level ดี

    Feats : 30%, Action Surge : 10%, Extra Attack : 40%, Bonus Attack : 20%

    มันแนะนำว่า Monk 8 + Rogue 4 ได้ Feats เยอะดี

    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 27

    เปลี่ยน Objective เป็น Damage/Turn

    ถ้าเราเปลี่ยนวิธีคิด Objective ไปเลย ไปใช้การประมาณการ Damage/Turn แทน ก็เป็นแนวทางที่น่าสนใจครับ ซึ่งมีการ Assume Base Damage พื้นฐานเอาไว้ และมีการคิด Factor ตัวคูณสำหรับแต่ละปัจจัย

    เช่น Feat 1 อันจะทำให้ Damage แรงขึ้น 10% (สมมติ) ถ้า 4 อันก็ base *(1+factor)^4 เป็นต้น

    อันนี้โปรแกรมแนะนำเป็น Fighter 12 (มันเก่งแบบง่ายจริงๆ)

    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 28

    ซึ่งแบบนี้จะ มี 4 Feats (แต่ละ feat ช่วยให้ Damage พื้นฐานแรงขึ้น) และยังได้ Extra Attack ตีได้หลายที 2 รอบ จากนั้นมี Action Surge ที่ทำให้ทั้ง Attack และ Extra Attack ได้อีกที ซึ่งถ้าทำตามนี้ก็จะมี Bonus Attack ตามปกติแค่นั้นรอบเดียว

    แต่ถ้าอยากให้มี Multiclass มีการ Cap ไว้ไม่ให้ใช้ Class Level 12

    อันนี้แนะนำเป็น Fighter 6 + Warlock 6 (มีการ Cap ไว้ไม่ให้ใช้ Fighter 12)

    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 29

    ซึ่งแบบนี้จะ มี 3 Feats และยังได้ Extra Attack จากนั้นมี Action Surge และยังคงมี Bonus Attack รอบเดียวเช่นกัน

    แต่ถ้าลองคิด Build ที่ Action Surge หมด (ไม่มีผล) ดูสิว่ามันจะแนะนำอะไร?

    อันนี้แนะนำเป็น Warlock 5 + Barbarian,Monk,Paladin,Ranger 7
    (หรือจะสลับกันเป็น Warlock 7 ก็ได้)

    แนวทาง Optimize การ Level Up ใน Baldur’s Gate 3 30

    แต่การ Optimize อาจไม่ Make Sense ก็ได้

    โปรแกรมพยายาม Optimize ตามปัจจัยที่ผมเขียนเท่านั้น เช่น Attack, Extra, Bonus, Feats แต่ยังมีอีกหลายปัจจัย ที่จริงๆ แล้วมีผลมากในเกม เช่น

    • Ability Score แต่ละอาชีพเข้ากันหรือไม่?
    • บางทีการอยู่ใน Class อันใดอันหนึ่งเยอะๆ จะยิ่งได้ Damage แรงกว่า เช่น Rogue จะได้ Sneak Attack ที่แรงขึ้นเรื่อยๆ หรือ Warlock จะได้ Eldritch Blast ที่ยิงได้หลายเส้นมากขึ้น (ที่ Level 5 กับ 10) เป็นต้น ตรงนี้ก็ยังไม่ได้เอามาคิด
    • Proficiency ใน equipment item ต่างๆ ได้อย่างที่ต้องการมั๊ย?
    • Skill หรือ Spell มัน combo กัน หรือเสริมกับเพื่อนในทีมได้รึเปล่า? (ในบทความนี้ผมไม่ได้พูดเรื่อง Spell เลยแม้แต่น้อย)
    • เรามี Item ใส่ตัวละครที่เหมาะกับ Class นั้นหรือไม่?
    • อีกเยอะแยะไปหมดดดด

    ถ้าผมอยากจะได้การ Build ตัวละคร ที่ Optimize สุดๆ ผมต้องใส่ปัจจัยพวกนี้มาในสูตรให้หมด ซึ่งก็จะซับซ้อนขึ้นไปอีกมากกกๆๆๆๆๆๆ ซึ่งอาจไม่ Practical แล้ว (ถ้าผมใส่หมดทุกปัจจัย ผมคงไปช่วยเค้าทำเกมดีกว่า 555)

    สรุป

    การจะ Optimize อะไรได้ เราต้องมีความรู้เรื่องนั้นเป็นอย่างดีก่อน จึงจะกำหนดเงื่อนไขได้ถูกต้องและครบถ้วย ยิ่งเงื่อนไขซับซ้อนยิ่งเขียนยาก และอาจจะใช้เวลา Optimize นาน

    ถ้าเราลดทอนความซับซ้อนได้ โดยผลลัพธ์ไม่เพี้ยนจากเดิมมาก ก็จะให้ผลดีมากในชีวิตจริง

    อย่างไรก็ตาม สำหรับเกม BG3 นั้น เงื่อนไขมันซับซ้อนมากๆ (อาจมากกว่าเรื่องการทำในงานจริงๆ ก็ได้ 555) ดังนั้นการ Optimize ใน Excel นี้เราสามารถใช้เป็นแนวทางเบื้องต้น หรือใช้เป็นตัวทดลองเปลี่ยนค่าเล่นดูได้ ก่อนจะไปกด Respec ใหม่จริงๆ กับ Wither อีกทีก็ได้ครับ

    ว่าแล้วผมขอตัวไป Respec ตัวละครเล่นก่อนล่ะครับ บายๆ ขอบคุณที่อ่านจนจบครับ ^^

    ใครยังไม่ได้อ่าน 2 ตอนแรก ลองไปอ่านดูได้นะครับ

  • สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ

    ความสามารถอย่างนึงที่ Excel มีมานานมากแล้ว และทำได้ดีมากๆ ก็คือเครื่องมือ Solver ซึ่งเป็น Add-in ที่มีมาให้กับ Excel อยู่แล้วไม่ต้องไปโหลดที่ไหน (แค่ต้องกด Enable ให้มันทำงานแค่นั้น)

    การใช้ Solver นั้นเหมาะกับงานที่ต้องการแก้ปัญหาในเชิง Optimization หรือหาคำตอบที่ดีที่สุดภายใต้ข้อจำกัด(หรือเงื่อนไข) ที่มีอยู่ ซึ่งเป็นอะไรที่เจ๋งมากๆ ในการทำงานจริง เพราะในชีวิตจริงเรามักจะเต็มไปด้วยข้อจำกัดเช่นกัน

    และในบทความนี้ผมจะขอยกตัวอย่างการใช้ Solver ที่จะช่วยแก้ปัญหาต่างๆในการทำงานให้ เพื่อที่เพื่อนๆจะได้นำไปปรับใช้กับงานของตัวเองได้ครับ โดยมีตัวอย่างหลากหลายตั้งแต่ Product Mix, การจัดงาน, การตั้งราคา, เส้นทางการวิ่งรถ และการตัดแบ่งวัตถุดิบ บอกได้คำเดียวว่า “พลาดไม่ได้เด็ดขาด!”

    ขั้นตอนการใช้ Solver

    การใช้ Solver นั้นมีขั้นตอนคร่าวๆ ดังนี้

    1. Enable Solver Add-in (ถ้ายังไม่ได้ทำ) : ให้ไปที่ File -> Excel Options -> Add-in -> Go… -> ติ๊ก Solver Addin
      สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 31
    2. เขียนสูตรผูกความสัมพันธ์ เพื่อสร้าง Model ระหว่าง Variable Input (ตัวแปรต้น) , Constrain (ข้อจำกัด) และ Objective Output (ผลลัพธ์เป้าหมาย) ที่อยากได้ให้เรียบร้อย นั่นคือ หากลองเปลี่ยน Input แล้ว Output ต้องเปลี่ยนตามอย่างถูกต้องให้ได้ซะก่อน
    3. เรียกใช้ Solver โดยกำหนดว่าต้องการ Maximize หรือ Minimize ค่า Objective Output โดยเลือกว่าจะให้เปลี่ยน Variable Input ตัวไหน ภายใต้เงื่อนไขของข้อจำกัด (Constrain) อะไร

    หลักการทำงานของ Solver

    หลักการทำงานของ Solver มันจะพยายามเปลี่ยนค่า Variable Input ไปเรื่อยๆ (สูงสุดได้ 200 Cells) ภายใต้ข้อจำกัดที่เรากำหนด เพื่อหาคำตอบว่าค่าใดทำให้เกิด Objective Output ได้ตรงตามที่เราต้องการมากที่สุด โดยที่มี Objective ได้แค่ค่าเดียวเท่านั้น (ถ้าเรามีเป้าหมายหลายอย่าง ต้องพยายามรวบเป็นค่าเดียว รวมถึงสามารถใส่ Weight ช่วยเอาได้)

    เรื่องที่สำคัญ ที่หลายคนมักมองข้ามคือการเลือก Solving Method ว่าเป็นแบบใด ซึ่งเลือกได้ 3 แบบ คือ

    • Simplex LP : ความสัมพันธ์ระหว่าง Input กับ Output, Input และ Constrain นั้นทุกตัวมีความต่อเนื่องกันเป็นเส้นตรง (LP=Linear Programming นั่นคือตัวแปร x ยกกำลังแค่ 1) ซึ่งรูปแบบนี้จะการันตีได้ว่า ถ้า Solver เจอคำตอบแล้วจะเป็นคำตอบที่ดีที่สุดระดับ Global แล้วจริงๆ
    • GRG Non Linear : ความสัมพันธ์ระหว่าง Input กับ Output อย่างน้อยตัวใดตัวหนึ่งมีความต่อเนื่องกันแต่ไม่ได้เป็นเส้นตรง (เช่น เส้นโค้ง) ถ้าเป็นแบบนี้ อาจจะมีบางกรณีที่เส้นโค้งนั้นอาจจะหาค่าที่ดีที่สุดได้แค่ภายใต้ขอบเขต Local เท่านั้น ไม่ใช่ระดับ Global เพราะมันดันเข้าใจว่าจุดยอดเขาที่เจอคือจุดที่ Optimize แล้ว ทั้งๆ ที่จริงๆ ยังมียอดเขาที่สูงกว่าอีกยอดนึง
      • วิธีทำให้ค่าที่ได้ดีขึ้นคือ ติ๊ก Option Multi Start เพื่อให้เริ่มหาที่หลายๆ จุด
    • Evolutionary : ความสัมพันธ์ระหว่าง Input กับ Output อย่างน้อยตัวใดตัวหนึ่งไม่ได้มีความต่อเนื่องกัน เช่น มี IF, VLOOKUP, INDEX ทำให้ค่าผลลัพธ์หรือ Constrain เวลาคำนวณจาก Variable มันจะกระโดดไปมาได้ ซึ่งวิธีสุดท้ายนี้ผลลัพธ์จะอยู่ในระดับ Good Solution คือ ดีกว่าค่าที่ใส่ลงไปแต่แรกเท่านั้น ไม่ได้ดีในระดับ Local ด้วยซ้ำ
      • วิธีที่ช่วยได้คือลอง Solve หลายๆ รอบ รวมถึงเพิ่ม Mutation Rate ใน Option เป็นต้น

    ในบทความสอนการ Optimize ด้วย Calculus ผมเคยอธิบายความหมายของ Global, Local Max Min ไว้ ลองไปอ่านดูได้ครับ

    เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 3
    https://www.mathsisfun.com/algebra/functions-maxima-minima.html

    ถ้าเป็นไปได้ ควรจะทำให้ Solve แบบ Simplex LP ให้ได้ เพราะมันทั้งเร็วที่สุดและได้ค่าที่ Optimize จริงๆ ถ้าใครงงและเลือกไม่ถูก ผมก็แนะนำว่าให้เลือก Simplex LP ก่อน ถ้ามัน Solve ไม่ได้ค่อยไปเลือก Non-Linear และ Evolutionary ตามลำดับครับ 555

    ซึ่งขั้นตอนที่ยากที่สุดในการทำงานกับ Solver ก็คือขั้นตอนการเขียนสูตรผูกความสัมพันธ์เพื่อสร้าง Model ขั้นตอนนี้มันก็ใช้ทักษะการเขียนสูตรซึ่งก็มีทั้งยากและง่ายแล้วแต่สถานการณ์ บางทีก็เป็นแค่สูตร SUM ธรรมดา บางทีอาจจะมีเงื่อนไขมากมายทำให้ต้องมี IF, SUMIFS, SUMPRODUCT, VLOOKUP, INDEX, MATCH หรืออะไรเต็มไปหมดแล้วแต่ความซับซ้อนของ Model ที่แต่ละคนต้องทำขึ้นมา

    ดังนั้นใครที่ยังเขียนสูตรไม่ค่อยเก่ง ก็จะลำบากกับขั้นตอนนี้มากหน่อย ยังไงก็ลองดูตัวอย่างที่ผมจะทำให้ดูแล้วลองเอาประยุกต์ใช้อีกทีได้นะครับ ในบทความนี้ก็จะมีให้ดูหลากหลายแบบเลยล่ะ

    เพื่อไม่ให้เสียเวลาลองไปดูตัวอย่างกันเลยครับ

    ตัวอย่าง 1 : Product Mix ที่ทำให้เกิดกำไรสูงสุด

    ตัวอย่างนี้ผมเคยทำเป็นคลิปวีดีโอไว้ให้แล้ว เป็นตัวอย่างสุดฮิตที่เวลาสอน Solver ก็ต้องมีการพูดถึงเคสแบบนี้ นั่นก็คือ เราเป็นโรงงานผลิตสินค้า สามารถผลิตสินค้าได้หลายชนิด แต่ละชนิดก็มีกำไรต่อหน่วยต่างกัน และต้องใช้ทรัพยากรต่างกัน ทีนี้โรงงานเรามีทรัพยากรจำกัด จึงต้องคิดว่าจะใช้ทรัพยากรที่มีนั้นผลิตสินค้าอะไรบ้างอย่างละกี่ชิ้น เพื่อให้ได้กำไรสูงสุดนั่นเอง (ปัญหาแบบนี้เรียกว่า Product-Mix Problem ครับ)

    Step การทำงาน

    ผูกสูตร

    การผูกสูตรใน Model นี้ก็ไม่มีอะไรมากไปกว่าการคูณและการบวกธรรมดาๆ แต่เพื่อให้เขียนสูตรสั้นลงเลยใช้ SUMPRODUCT มาช่วยแทนการคูณทีละคู่แล้วบวกกันแค่นั้นเอง

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

    เช่นในช่องกำไรที่เขียนว่า

    =SUMPRODUCT(C3:E3,C5:E5)

    ถ้าเขียนแบบยาวๆ ก็ต้องทำแบบนี้ ( คือ คูณกันแต่ละคู่ แล้วค่อยจับรวมกัน ซึ่งมันคือ SUMPRODUCT นั่นเอง)

    =C3*C5+D3*D5+E3*E5

    ซึ่งช่องทรัพยกรที่ใช้ไปก็ใช้หลักการเดียวกัน ซึ่งจะได้สูตรทั้งหมดดังนี้

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 32

    เรียกใช้ Solver

    พอมั่นใจว่าผูกสูตรเสร็จหมดแล้วก็เรียกใช้ Solver โดยไปที่ Data -> Solver ได้เลย แล้วระบุสิ่งต่างๆ ดังนี้

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 33
    • Objective (เป้าหมาย) : เป้าหมายของเราในที่นี้คือ ต้องการได้กำไรสูงสุด ดังนั้นต้องเลือกช่อง G5 (กำไร) และเลือกเป็น Max (สูงสุด) นั่นเอง
    • Variable (ตัวแปรต้น) : การจะไปถึงเป้าหมายที่ต้องการนั้นต้องเปลี่ยนค่าในช่องไหน ซึ่งก็คือจำนวนที่จะผลิตนั่นเอง (C3:E3)
    • Constrain (ข้อจำกัด) : ข้อจำกัดคือ ทรัพยากรที่ใช้ (F9:F11) ต้องไม่เกิน (น้อยกว่าหรือเท่ากับ) ทรัพยากรที่มีอยู่ (G9:G11) และการผลิตสินค้า ต้องมีจำนวนชิ้น (C3:E3) เป็นจำนวนเต็ม (int) เท่านั้น

    Solving Method : สำหรับโจทย์ข้อแรกนั้น เราเลือก Simplex LP ได้ เพราะความสัมพันธ์ระหว่าง Objective กับ Variable และ Constrain กับ Variable นั้นเป็นเส้นตรงทั้งหมด (ตัวแปร x ทุกตัว (C3,D3,E3) นั้นยกกำลัง 1 ทั้งหมดเลย) ดังนี้ จึงควรเลือก Simplex LP นั่นเอง

    • Objective กำไร = Maximize : 500C3 + 300D3 + 100E3
    • แรงงาน = 12C3 + 1.5D3 + 0.5E3 <=500
    • พื้นที่โกดัง = 12C3 + 8D3 + 1E3 <=2200
    • เงินลงทุน = 300C3 + 150D3 + 50E3 <=70000

    พอ Solve ปุ๊ปมันจะขึ้นแบบนี้ ซึ่งบอกว่า

    • Solver found a solution = ได้คำตอบแล้ว
    • All Constraints and Optimality conditions are satisfied. = ทำตามเงื่อนไขและ optimize ค่าได้ทั้งหมด

    แถมยังมี tips บอกมาข้างล่างอีกว่า ถ้าใช้ Simplex LP แล้ว แปลว่าเจอ global optimal solution แล้วนั่นเอง

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 34

    พอกด ok จะเห็นผลลัพธ์เป็นดังนี้

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 35

    ซึ่งแปลว่ามันแนะนำให้ผลิต A 150 ชิ้น C 400 ชิ้น โดยไม่ต้องผลิต B เลยนั่นเอง แบบนี้จะทำให้ได้กำไรสูงสุด คือ 115,000 บาทนั่นเอง

    ทีนี้ถ้าเกิดข้อมูลเปลี่ยนแปลงไป เช่น สินค้า C ใช้เงินลงทุน 100 แทนที่จำเป็น 50 ผลลัพธ์ที่ Solve ได้ก็อาจเปลี่ยนไปอีก โดยเราสามารถกดรัน Solver เพื่อ Solve ใหม่ได้เลย ไม่ต้องแก้การตั้งค่าอะไรแล้ว เพราะมันจะจำการตั้งค่าเดิมไว้ให้ สะดวกดีมากๆ

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 36

    ตัวอย่าง 2 : จัดงานให้ช่าง

    สมมติว่าเราเป็นผู้รับเหมา รับงานมา 5 งาน แต่สามารถส่งงานให้ช่างได้หลายคน แต่ละคนก็มีค่าจ้างต่างกัน และบางคนก็ทำงานบางงานไม่เป็นด้วย เราจะจัดงานให้ช่างยังไงเพื่อให้ต้นทุนต่ำสุด โดยที่ต้องทำงานครบทุกงาน และช่างแต่ละคนรับงานได้สูงสุดแค่ 2 งานเท่านั้น (ซึ่งปัญหาแนวนี้เรียกว่า Assignment Problem ครับ)

    โดยที่ค่าจ้างช่างสำหรับแต่ละงานเป็นดังนี้

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 37

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

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

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 38

    ทีนี้ถ้าเราเอา Model นี้ไปรัน Solver เลยตรงๆ เราต้องมานั่งเล็ง Variable Input โดยหาทางเว้นงานที่ช่างบางคนทำไม่เป็นอีก (ที่เป็นตัว x) ซึ่งจะยุ่งยากมาก ดังนั้นเราจึงมี Trick ในการทำคือ ให้ใส่ Cost ในงานที่ทำไม่เป็นไปสูงๆ เลย เช่น เลข 99999 Solver จะได้ไม่เลือกทำงานนั้นให้เรา

    ดังนั้น Model จะออกมาเป็นดังนี้

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 39

    ทีนี้ก็เรียกใช้ Solver โดยที่

    • Objective : เราต้องการต้นทุนต่ำสุด คราวนี้จึงต้องเลือก Min ช่อง H3
    • Variable : ช่องที่จะให้ Solver เปลี่ยนค่าเล่นได้ คือ B13:F19
    • Constrain :
      • ผลรวมแต่ละคอลัมน์ (B20:F20) เป็น 1
      • ผลรวมแต่ละแถว (G13:G19) ไม่เกิน 2
      • ค่า Variable B13:F19 เป็น Binary (Bin) คือได้แค่ค่า 0,1 เท่านั้น
    • Solving Method : เป็น Simplex LP เนื่องจากสมการเป็นเส้นตรงทั้งหมดเช่นเดิม
      • เช่น ต้นทุนรวม = 1300B13+1200C13+1300D13+2100E13…. ไปเรื่อยๆ ทุกตัวเป็นกำลัง1 หมด
      • ข้อจำกัด เกิดจาก B13+C13+D13+E13… <=2 ทุกตัวก็กำลัง 1 หมด

    สรุปเลือกดังนี้

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 40
    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 41

    กำหนดเงื่อนไขของช่างแต่ละคน งานแต่ละงาน

    ถ้าหากช่างแต่ละคน Capacity ไม่เท่ากัน ก็อาจกรอกค่า Capacity เอาไว้ในตารางได้ เช่น ให้กด Change ที่ Constrain เดิม โดยเปลี่ยน Constraint จากเลข 2 เป็น Capacity ที่เตรียมไว้นั่นคือ H13:H19 ได้เลย

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 42

    ถ้างานแต่ละงานต้องการจำนวนช่างไม่เท่ากัน ก็ระบุเงื่อนไขได้คล้ายๆ กับเรื่องของ Capacity เลย ง่ายมั้ยล่ะ!

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 43

    ตัวอย่าง 3 : การตั้งราคาสินค้า

    สมมติว่าเราเป็นบริษัทที่มีผลิตภัณฑ์อยู่ 2 ตัว เป็นสินค้าประเภทเดียวกันแต่เป็นรุ่นเล็กกับรุ่นใหญ่ การตั้งราคาตัวนึงจะส่งผลไปที่ราคาอีกตัวนึงได้ด้วย

    จากการวิจัยพบว่าความสัมพันธ์ระหว่าง ราคาต่อหน่วย และปริมาณที่จะขายได้ของผลิตภัณฑ์แต่ละตัวเป็นดังนี้

    • Q1 = 1000-2P1+1.2P2
    • Q2 = 3000+0.1P1-0.5P2

    เราอยากรู้ว่าตั้งราคาสินค้าทั้งสองตัวนี้เป็นเท่าไหร่ดีจึงจะได้ผลกำไรสูงสุด โดยที่ปัจจุบันตั้งอยู่ที่ P1=1500 และ P2=5000 ตามลำดับ

    ซึ่งเราจะเขียน Model คำนวณรายได้รวมออกมาได้ดังนี้

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 44

    นอกจากนี้หากเราอยากให้ปริมาณออกมาเป็นบวกเสมอ ก็ใส่ Constrain เข้าไปได้ ส่วนราคาถ้าอยากได้จำนวนเต็มก็ใส่เงื่อนไขเข้าไปได้เช่นกัน

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 45

    แต่ข้อนี้หาก Solve ด้วย Simplex LP เหมือนเดิมมันจะไม่ยอมแล้ว

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 46

    หากติ๊กที่ Linearity Report แล้ว Ok จะเห็นว่าปัญหาอยู่ที่ไหน

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 47

    ที่สมการที่เราคิดรายได้รวมไม่ใช่ Linear เพราะมันเกิดจากการเอาราคาไปคูณปริมาณ ซึ่งปริมาณดันคำนวณมาจากราคาอีกทีนึงด้วย ทำให้เกิด Term ที่เป็นราคากำลังสองขึ้นมานั่นเอง

    ดังนั้นในข้อนี้เราต้องแก้ Solving Method เป็น GRG Nonlinear แล้วค่อย Solve ครับ

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 48

    จะเห็นว่าคราวนี้ผลลัพธ์ออกมาได้รายได้มากกว่าเดิมเยอะเลย เวลาใช้งานจริงๆ ก็ไม่ต้องใช้เลขราคานี้เป๊ะๆก็ได้ แต่น่าจะเห็นแนวทางแล้วนะครับ

    หรือถ้าเรามีเงื่อนไขอะไรเพิ่มอีก ก็ใส่ไป เช่น ราคา Product1 ห้ามเกิน 2000 ไม่งั้นแพงไป ก็แค่ใส่ Constrain เพิ่มไปเลยครับ

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 49

    ตัวอย่าง 4 : จัดเส้นทางการเดินรถโดยที่ต้นทุนต่ำสุด

    สำหรับตัวอย่างนี้จะเป็นเรื่องของการ Optimize เส้นทางการเดินรถเพื่อให้พนักงานขายเดินทางไปเยี่ยมลูกค้า โดยรู้ตำแหน่งของลูกค้าแต่ละเจ้าว่าอยู่พิกัดไหน สิ่งที่เราต้องการคือ หาเส้นทางการวิ่งรถโดยที่ใช้ระยะทางการวิ่งที่น้อยที่สุด เพื่อทำให้ Cost ต่ำสุดนั่นเอง ปัญหาแบบนี้มีชื่อภาษาอังกฤษเรียกว่า Travelling salesman problem

    สมมติว่าพิกัดทั้ง 10 ตำแหน่งเป็นดังนี้

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 50

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

    ระยะทางระหว่างสองจุด (ด้านเฉียงของสามเหลี่ยมมุมฉาก)

    =SQRT((X1-X2)^2+(Y1-Y2)^2)

    สรุปได้ดังนี้

    =SQRT(($C18-F$15)^2+($D18-F$16)^2)
    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 51

    ทีนี้เพื่อป้องกันไม่ให้มันวิ่งจากจุดเดียวกันไปยังจุดเดียวกัน เราจะแก้สูตรให้ระยะห่างระหว่างจุดเดียวกันเป็นเลขเยอะๆ ไปเลยเช่น 9999 Solver มันจะได้ไม่เลือกเส้นทางนั้น

    =IF(SQRT(($C18-F$15)^2+($D18-F$16)^2)=0,9999,SQRT(($C18-F$15)^2+($D18-F$16)^2))
    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 52

    ต่อไปเราจะสร้างการจัดสินใจ ว่าจะเลือกวิ่งเส้นทางไหน โดยการตัดสินใจให้เป็นเลข 0 (ไม่วิ่ง) ,1 (วิ่ง) และคำนวณผลรวมด้านขวาและด้านล่างออกมา จากนั้นคำนวณระยะทางรวมจากการใช้ SUMPRODUCT ปกติ

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 53

    จากนั้นเรียกใช้ Solver โดย Min ระยะทางรวม และให้ Variable เป็น F32:O41 แล้วตั้งให้ Constrain เป็นแบบ Binary

    นอกจากนั้นตั้ง Constrain

    • ให้ผลรวมด้านขวาเป็น 1 ทั้งหมด (หมายถึงว่า ทุกจุดเป็นต้นทางแค่ 1 ครั้ง)
    • ให้ผลรวมด้านล่างเป็น 1 ทั้งหมด (หมายถึง ทุกจุดเป็นปลายทางแค่ 1 ครั้ง)
    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 54

    พอ Solve ปุ๊ปมันจะได้แบบนี้

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 55

    จะเห็นว่ามันทำการจับคู่ Point ที่อยู่ใกล้กัน แล้ววิ่งหากันเองซะงั้น (เช่น จาก 1->9 และ 9->1 ใหม่) เพราะเงื่อนไขที่เราตั้งไว้มันไม่ครอบคลุมว่าห้ามวิ่งกลับที่เดิมนั่นเอง

    หากเราจะป้องกันไม่ให้เกิดเหตุการณ์ที่ไม่ต้องการ ก็ต้องใส่เงื่อนไขเพิ่มไปอีก เช่น เส้น1ไป9 + เส้น 9ไป1 ต้องได้ <=1 (คือห้ามเป็น 1 ทั้งคู่) พอ Solve ปุ๊ป Loop ปัญหานั้นๆ ที่เราดักไว้ก็จะหายไป

    แต่เราต้องไปไล่กำจัด Loop ปัญหาอีกเรื่อยๆ จนหมด เช่น ถ้าเรากำกจัดวิ่งไปกลับของ 2 จุดได้ เราก็ต้องมาดักกรณีวิ่งไปกลับแบบ 3 จุดอีก เช่น จากรูป มันบอกว่าจาก 1->9 ->6 ->1 ใหม่ เราก็ต้องมาดักเงื่อนไขอีกว่า N32+K40+F37 <= 2 คือ ห้ามเป็น 1 ทั้ง 3 อัน เป็นต้น

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 56
    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 57

    เราต้องการทำให้วิ่งไปกลับครบ 10 จุด ห้ามมี Loop ย่อยๆ เลยแม้แต่ Loop เดียว แบบนี้ต้องเขียนเงื่อนไขดักเยอะมากๆๆ การมานั่งไล่ดัก Loop ปัญหา เป็นวิธีที่โหดร้ายเกินไป ดังนั้นเราจะเปลี่ยนแนวคิดไปแก้ด้วยวิธีอื่น

    เปลี่ยนมุมมองการแก้ปัญหาไปใช้ All Different

    เราจะเปลี่ยนมุมมองการแก้ปัญหา ไปใช้การเลือกลำดับการวิ่ง 1-10 แทน โดยที่ลำดับนี้เป็นเลขแบบไม่ซ้ำกัน แล้วคำนวณมาว่าวิ่งลำดับใดจะให้ผลลัพธ์ที่ดีที่สุด ซึ่งความสัมพันธ์ของสูตรจะไม่ได้เป็นเส้นต่อเนื่องกันแล้ว จึงต้องใช้แบบ Evolutionary มาช่วย ควบคู่กับ Constrain แบบ All Different (ตัว Variable จะได้ค่าเป็น Integer ไม่ซ้ำกัน)

    ดังนั้นเราจะแก้ Model ใหม่เป็นดังนี้ เราจะให้ Solver ใส่เลข 1-10 ลงไปในลำดับ (คอลัมน์ D) นี้

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 58

    โดยที่เราเขียนสูตรรอไว้แล้วว่าพอมีเลข 1-10 แล้วระยะทางรวมจะเป็นเท่าไหร่

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 59

    จากนั้นใน Solver ก็ตั้งค่าดังนี้

    • หลักๆ คือให้ Variable >=1 และ <=10 และมีค่าต่างกันทั้งหมด (dif)
    • ส่วน Solving Method ใช้ Evolutionary เพราะค่าจาก INDEX หรือการ Lookup มันกระโดดไปมาไม่ต่อเนื่องกันแน่นอน
    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 60

    ซึ่งพอ Solve แล้วมันจะคิดนานกว่า Simplex LP มากๆ เพราะมันต้องสุ่มตัวเลขใส่ลงไปจนกว่าจะได้คำตอบ (อันนี้ก็ต้องรอไปนะ…)

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 61

    มันให้คำตอบออกมาว่า วิ่งจาก 9->6->7->10->3->2->4->1->8->5->9 ซึ่งจะมีระยะทางรวม 66.761

    โดยมันขึ้นมาว่า

    • Solver cannot improve the Current solution = ทำให้คำตอบดีขึ้นกว่านี้ไม่ได้ (ภายใต้เวลาที่กำหนด เช่น ภายใน Max Time without improvement ที่ตั้งไว้ มันหาตัวที่ดีขึ้นไม่ได้แล้ว)
    • All Constraints are satisfied. = ทำตามเงื่อนไขได้ทั้งหมด

    สังเกตว่ามันไม่ได้บอกว่าคำตอบที่ได้นั้น Optimal แค่บอกว่าทำให้ดีขึ้นไม่ได้แล้ว นั่นคือยังมีความเป็นไปได้ที่ผลลัพธ์ยังดีขึ้นได้กว่านี้อีก ซึ่งเราสามารถลองกด Solve ใหม่ได้เพื่อดูว่าค่าดีขึ้นหรือไม่ โดยอาจเปลี่ยน Mutation Rate ให้เยอะขึ้น ให้ Max Time มากขึ้น เป็นต้น

    แต่ที่ผมลองเลขที่ได้ไม่เปลี่ยนจาก 66.761 แล้ว แต่อาจได้ค่าวนกลับอีกทางคือ

    9->5->8->1->4->2->3->10->7->6->9 ซึ่งก็คือวงเดิมนี่แหละ แค่กลับอีกทาง

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 62

    หากเราลองเอามา Plot กราฟ (Sort ตามลำดับที่ Solve ได้) ก็จะได้ดังนี้

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 63

    สมมติว่ามีข้อกำหนดว่า ต้องเริ่มที่จุด 1 แล้วจบที่ จุด 10 แบบไม่ต้องวน

    เราลองแก้ Model เล็กน้อย โดย Fix ลำดับ 1 กับ 10 เอาไว้เลย ดังนี้

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 64

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

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 65

    จากนั้นการตั้งค่า Solver ก็ให้แก้เลขจาก 2-9 แทน และขอบเขตตัวแปรก็น้อยลงเป็นดังนี้

    Tips : ถ้าไม่อยากมานั่งแก้ Range ก็สามารถใช้การตั้งชื่อ Defined Name มาช่วยได้ครับ

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 66

    พอ Run แล้วปรากฏว่า Solver ไม่ยอมให้ AllDifferent มีค่าขอบเขต Lower โดยไม่ใช่ 1 และก็บอกว่าค่า Upper จะต้องเท่ากับจำนวน Variable เท่านั้น แปลว่าผมต้องใส่เป็นเลข 8

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 67

    ดังนั้นผมจะแก้ Model อีกเล็กน้อย ให้มันใส่เลข 1-8 ก็ได้ แล้วผมค่อยบวก 1 ให้เป็น 2-9 อีกที

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 68

    ซึ่งหากลองใส่เลข 1-10 ตามลำดับไปก่อน แล้วPlot กราฟ จะได้ระยะทางและรูปร่างการวิ่งดังนี้ อันนี้คือแบบไม่ได้วางแผนใดๆ ทำตามลำดับข้อมูลปกติ

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 69

    ทีนี้เราจะลองหาว่าจะวิ่งยังไงให้ดีที่สุด?

    solver

    พอกด Solve จะได้ดังนี้

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 70

    ซึ่งจะวิ่งจาก 1->8->5->9->6->2->4->3->7->10 นั่นเอง

    หากเราลองเอามา Plot กราฟ (Sort ตามลำดับที่ Solve ได้) ก็จะได้ดังนี้

    solver

    ส่วนถ้าใครอยากรู้ว่า วิ่งยังไงให้เปลืองระยะทางมากที่่สุด ก็จะลองปรับค่า Objective เป็น Max ดูได้ครับ ผลที่ได้จะทุเรศมากดังนี้ 555

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 71

    ตัวอย่าง 5 : Optimize การตัดแบ่งวัตถุดิบ

    โจทย์คือ เราซื้อวัตถุดิบมาแบบชิ้นใหญ่ แล้วต้องเอามาตัดแบ่งเพื่อผลิตสินค้าตามที่กำหนด เราต้องหาวิธีตัดให้มีประสิทธิภาพมากสุด (โจทย์แบบนี้เค้าเรียกกันว่า Cutting stock problem ครับ)

    ตัวอย่างนี้ผมเคยเขียนบทความและทำเป็นคลิปไว้ให้แล้ว เป็นเนื้อหาที่ค่อนข้าง Advance (มีการใช้ Power Query ช่วยด้วย) ใครสนใจสามารถดูคลิปได้เลย (เคยทำไว้นานแล้วแทบไม่มีคนดู 555)

    สรุป

    จากตัวอย่าง 4 (การวิ่งรถ) จะเห็นได้ชัดเลยว่าการวางแผนที่ดี จะช่วยให้ระยะทางที่วิ่งรถน้อยลงไปมาก จากที่ไม่วางแผนเลยต้องวิ่งระยะ 97.78 แต่ถ้าวางแผนให้วิ่งน้อยสุดจะวิ่งแค่ 62.23 เท่านั้น (ประหยัดขึ้นถึง 37%) ส่วนถ้าตั้งใจวิ่งให้ยาวที่สุด จะยาวถึง134.93 (ซึ่งยาวขึ้นจาก Base 37% )

    ดังนั้นคุณอยากให้ค่าใช้จ่ายน้อยลง แต่ได้ผลลัพธ์เท่าเดิม ก็อย่าลืม Optimize ธุรกิจของคุณด้วยนะครับ ^^

    ใครสนใจเรื่อง Solver โดยละเอียด สามารถศึกษาได้จากคอร์สออนไลน์ที่ผมทำไว้อันนี้ได้ครับ

    คอร์สออนไลน์ การทำ Optimization ด้วย Excel Solver สำหรับงานวางแผน

    สอนใช้ Excel Solver เพื่อช่วย Optimize และตัดสินใจเชิงธุรกิจ 72

    คุณกำลังมองหาวิธีพัฒนาทักษะ Excel ของคุณไปสู่อีกระดับหรือไม่ ?
    คุณต้องการแก้ปัญหาที่ซับซ้อนและตัดสินใจให้ดีมากขึ้นในธุรกิจ ชีวิตส่วนตัว หรือการเรียนหรือไม่ ?

    คำตอบอยู่ที่นี่แล้ว! เพราะหลักสูตรนี้ คือหลักสูตรที่ครอบคลุมการเรียนรู้ในการเพิ่มประสิทธิภาพและค้นหาวิธีแก้ปัญหาที่ดีที่สุดสำหรับปัญหาต่าง ๆ (Optimization) โดยใช้เครื่องมือ Excel Solver ที่มีอยู่แล้วใน Excel ทุก Version

    ประโยชน์ที่จะได้จากคอร์สนี้

    • ทำความเข้าใจอย่างลึกซึ้งเกี่ยวกับ Excel Solver และการนำไปใช้ในสถานการณ์ต่าง ๆ ผ่านตัวอย่างกรณีศึกษาที่หลากหลาย เช่น
              – การวางแผนการผลิตสินค้า
              – การจัดสรรพนักงานให้เป็นไปตามเป้าหมาย
              – การจัดสรรเวลาให้มีประสิทธิภาพสูงสุด
              – การใช้ Budget ให้คุ้มค่าที่สุด แบบมีเงื่อนไขซับซ้อน
              – การวางแผนการลงทุน
              – การวางแผนการลงทุนสร้างโรงงาน
              – ส่งของจากศูนย์กระจายสินค้าให้ต้นทุนต่ำที่สุด
              – การหาเส้นทางที่สั้นที่สุด (Shortest Path)
              – การวางแผนลำดับเส้นทางการเดินทาง (Traveling Salesman)
              – การเปลี่ยนเครื่องจักรให้คุ้มค่า
              – การวางแผนในเชิงการหาตำแหน่งที่เหมาะสมในเชิงพื้นที่ (Set Covering)
    • ทำความเข้าใจวิธีจัดลำดับความสำคัญของวัตถุประสงค์หลายรายการและค้นหาวิธีแก้ปัญหาที่ดีที่สุด
    • เพิ่มทักษะ Excel ของคุณและปรับปรุงความสามารถในการตัดสินใจของคุณ
    • เพิ่มคุณค่าให้ตัวคุณได้อย่างมหาศาล เพราะการ Optimize ทางธุรกิจสามารถสร้างผลกำไรเพิ่มให้องค์กรได้จริง
    • เพิ่มความโดดเด่นในใบสมัครงานของคุณ ด้วยการเพิ่มทักษะที่โดดเด่น และหายากในตลาดแรงงานไทย
  • วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel

    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel

    ต่อเนื่องจากบทความการบริหารโครงการ หรือ Project Management ด้วย Excel ที่ผมได้เขียนไปก่อนหน้านี้ ซึ่งเป็นเรื่องของการทำ Gantt Chart คราวนี้ผมจะขอพูดถึงเรื่องของการวางแผนโดยใช้ Critical Path หรือคือเส้นทางการทำงานที่สำคัญที่สุด ซึ่งถ้าหากงานใดงานหนึ่งใน Path นั้นเกิดการ Delay ปุ๊ปจะทำให้โครงการโดยรวม Delay ทันที

    ซึ่งเราจะคำนวณพวก Early Start, Early Finish, Late Start, Late Finish ของแต่ละงานแบบอัตโนมัติครับ บอกไว้ก่อนว่าสูตรในบทความนี้ค่อนข้างซับซ้อน(มาก) กรุณาทำใจก่อนดู 555

    โดยผมใช้ภาพประกอบจากบทความนี้ ซึ่งมีอธิบายเรื่องวิธีการคำนวณแบบ Manual ให้ด้วย แต่ผมจะอธิบายวิธีการทำแบบ Auto ใน Version Excel ให้ดูครับ

    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 73
    รูปจาก https://pmstudycircle.com/2014/01/critical-path-method-cpm-in-project-management/

    วิธีการอ่านรูปคือ

    • A,B,C คือชื่อของงานย่อยๆ
    • ตัวเลขในกล่องสี่เหลี่ยมคือ ระยะเวลาที่ต้องใช้ในการทำงานนั้นๆ
    • ลูกศรที่ชี้คือทำงานนั้นเสร็จแล้วต้องทำงานอะไรต่อ (แสดงความ dependency กัน) เช่น งาน B จะเริ่มทำได้เมื่อ A และ D เสร็จแล้วทั้งคู่เท่านั้น

    Assumption

    สมมติว่าทำงานนึงเสร็จวันที่ 5 งานที่ต้องทำลำดับต่อไปจะเริ่มได้เร็วสุดวันที่ 6 นะครบ (ถือว่าวันที่ 5 คือสิ้นวันแล้ว)

    องค์ประกอบในการคำนวณ

    มีองค์ประกอบอยู่ 4 ตัวที่สำคัญ คือ

    • Early Start (ES) : งานนั้นๆ จะเริ่มเร็วสุดได้เมื่อไหร่ = Early Finish ของ Activity ก่อนหน้าอันสุดท้าย + 1 นั่นเอง
    • Early Finish (EF) : งานนั้นๆ จะเสร็จได้เร็วสุดเมื่อไหร่ = Early Start + Duration ของงาน -1 (เพื่อ adj ให้นับวันเริ่มด้วย)
    • Late Finish (LF) : งานนั้นๆ จะเสร็จได้ช้าสุดเมื่อไหร่ = Late Start ของ Activity ถัดไปอันแรก -1
    • Late Start (LS) : งานนั้นๆ จะเริ่มได้ช้าสุดเมื่อไหร่ = Late Finish – Duration + 1

    บันทึกข้อมูลดิบใน Excel

    เราบันทึกข้อมูลลงไปประมาณนี้

    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 74

    เริ่มคำนวณ ES และ EF

    เราจะต้องคำนวณ Early Start (ES) ก่อน ซึ่งคำนวณมาจาก

    Early Start (ES) = Early Finish ของ Activity ก่อนหน้าอันสุดท้าย + 1

    ซึ่ง Early Finish ของ Activity ก่อนหน้าอันสุดท้าย ถ้าไม่มีก็คือถือว่าเป็น 0 ไปนั่นเอง ซึ่งเราใช้ IF มาดักได้

    Early Start (ES) = IF(C2="",0,EFก่อนหน้า)+1

    ส่วน EFก่อนหน้า เรายังไม่มี ก็ต้องคำนวณออกมาก่อน ซึ่งทำได้โดยใช้สูตรที่ว่า

    Early Finish (EF) = ESตัวนั้น + Duration -1 

    ซึ่งพอเขียนสูตรลงไป ณ ตอนนี้จะได้ดังนี้

    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 75

    ซึ่ง EF ก่อนหน้า มันอาจมีหลายตัวก็ได้ เช่น กิจกรรม B มีก่อนหน้าคือ A กับ D ซึ่งเราต้องทำการ Lookup ค่า EF ของ A กับ D ออกมา แล้วหาค่า MAX

    การจะ Lookup แล้วมา MAX ได้ เราจะทำการคำนวณแบบ Array ให้มีค่าทุก item ในช่องเดียวกัน ซึ่ง Excel ไม่มีฟังก์ชัน Split ตรงๆ ผมเลยต้องใช้ฟังก์ชัน FILTERXML มาช่วยในการ Split ดังนี้ (เทคนิคการดึงค่าด้วย FILTERXML ผมเรียนรู้มาจากคลิป Excel Wizard อันนี้ ซึ่งต้องใช้ Excel 2013 ขึ้นไป)

    ถ้าอยาก Split ค่า A ,D ใน C4 ออกมาเป็น Array ผมสามารถเขียนสูตรได้ดังนี้

    ใน I4

    =FILTERXML("<a><b>"&SUBSTITUTE(C4,",","</b><b>")&"</b></a>","//b")

    <a> กับ <b> ใส่อะไรก็ได้ แค่เป็นชื่อ tag เปิดปิดคล้ายๆ ภาษา HTML ให้ FILTERXML ใช้เลือก item ที่ต้องการได้ (ในที่นี้ผมเลือก item ที่ชื่อ tag ว่า b

    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 76

    จากนั้นค่อยทำการ Lookup EF ดังนี้

    =INDEX(E:E,MATCH(H4#,A:A,0))
    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 77

    ซึ่งพอรวบ 2 สูตรเข้าด้วยกัน และใช้ MAX ครอบอีกทีจะได้ดังนี้

    ใน I4

    =MAX(INDEX(E:E,MATCH(FILTERXML("<a><b>"&SUBSTITUTE(C4,",","</b><b>")&"</b></a>","//b"),A:A,0)))
    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 78

    จากนั้นเอาสูตรไปแทนคำว่า EF ก่อนหน้าที่เราเขียนทิ้งไว้ตอนแรก ใน D4 แล้ว copy ให้ครบทุกแถวจะได้ดังนี้

    ใน D3

    =IF(C3="",0,MAX(INDEX(E:E,MATCH(FILTERXML("<a><b>"&SUBSTITUTE(C3,",","</b><b>")&"</b></a>","//b"),A:A,0))))+1
    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 79

    ซึ่งถ้าใครมี Excel 365 อันล่าสุดจะมีฟังก์ชัน LET มาให้ใช้ ซึ่งจะช่วยให้เราประกาศตัวแปรในสูตรได้ ซึ่งจะช่วยแบ่งสูตรให้อ่านง่ายขึ้นได้มากดังนี้ ซึ่งจะได้ผลลัพธ์เดียวกันกับสูตรข้างบนนะ

    =LET(prepareText,"<a><b>"&SUBSTITUTE(C3,",","</b><b>")&"</b></a>",
    split,FILTERXML(prepareText,"//b"),
    MaxEFBefore,MAX(INDEX(E:E,MATCH(split,A:A,0))),
    IF(C3="",0,MaxEFBefore)+1)
    

    ที่นี้จะเห็นว่างานที่จะเสร็จเป็นอันสุดท้ายคือ C ซึ่งจะไปจบวันที่ 31 ไอ้เส้นทางที่จบที่ C นี่แหละ คือ Critical Path ล่ะ

    เดี๋ยวต่อไปเราจะคำนวณ LF กับ LS นะครับ โดยจะคำนวณ LF ก่อน เพราะเรารู้แล้วว่าต้องจบไม่เกิน 31 นะ

    ปรับตารางให้ทำงานง่ายขึ้น

    เพื่อให้ง่ายขึ้น จากนั้นผมจะเพิ่มคอลัมน์อีกอัน เพื่อคำนวณว่า งานนั้นมีอะไรต่อหลังบ้าง?

    ถ้ามี Excel 365

    ซึ่งการคำนวณถ้าใครมี Excel 365 เราเขียนสูตรง่ายๆ เลย แค่นี้ (Assume ว่าชื่อ Task ไม่ได้มีคำเป็น Subset ของกันและกัน)

    ใน F6

    =FILTER(A:A,ISNUMBER(FIND(A6,C:C)),"")
    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 80

    ซึ่งสามารถใช้ TEXTJOIN ช่วยรวบเพื่อแสดงผลออกมาก็ได้ดังนี้

    ใน F3

    =TEXTJOIN(",",TRUE,FILTER(A:A,ISNUMBER(FIND(A3,C:C)),""))
    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 81

    ถ้าเป็น Excel เก่ากว่า 365

    ถ้าใครไม่มี Excel 365 หรือเป็น Version เก่าๆ ที่ไม่มี FILTER หรือ TEXTJOIN การคำนวณจะค่อนข้างซับซ้อนมากหน่อย (แถมใช้ LET ไม่ได้อีก) เช่นใช้ FIND หาตัวที่ต้องการ แล้วเอาลำดับแถวมา แล้วใช้ SMALL คัดสิ่งที่ต้องการเป็นต้น ดังนี้

    ใน F6

    =INDEX(A:A,SMALL(IF(ISNUMBER(FIND(A6,C:C)),ROW(C:C)),ROW(A1:INDEX(A:A,(COUNT(IF(ISNUMBER(FIND(A6,C:C)),(ROW(C:C)))))))))
    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 82

    การไม่มี TEXTJOIN ผมจะไม่ขอรวบเป็น B,E นะครับเพราะเท่าที่ผมลอง ถ้าไม่มี CONCAT หรือ TEXTJOIN มันไม่น่าจะรวบแบบ Array ได้ เดี๋ยวเราจะเอาสูตรยาวๆ นี้ไปคำนวณ LF เลยทีเดียว

    คำนวณ LF และ LS

    สำหรับ LF นั้น = Late Start ของ Activity ถัดไปอันแรก -1 แต่ถ้าเป็น Activity สุดท้ายแล้ว (ไม่มีตัวต่อ ก็จะเท่ากับค่า MAX ของ EF)

    ดังนั้นเราจะเขียนสูตรได้ว่า ถ้าตัวตามหลังไม่มี ก็ให้ LF เป็น MAX EF เลย

    =IF(F3="",MAX(E:E),LSอันแรก -1)

    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 83

    จากนั้นเราคำนวณ LS ก่อน

    = LateFinishอันนั้น - Duration + 1
    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 84

    คราวนี้เราจะกลับมาคำนวณ LF ที่ค้างไว้ โดย LS อันแรก ก็คือต้อง Lookup LS ของงานต่อหลังมา แล้วหาค่า MIN

    ถ้ามี Excel365 จะเป็นแบบนี้

    ใน I4

    =MIN(INDEX(H:H,MATCH(FILTER(A:A,ISNUMBER(FIND(A4,C:C)),""),A:A,0)))
    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 85

    จากนั้นเรายัดสิ่งนี้เข้าไปแทนคำว่า LS อันแรก ใน G4 แล้ว Copy Paste ให้ครบทุกแถว

    ใน G3 สูตรจะเป็น

    =IF(F3="",MAX(E:E),MIN(INDEX(H:H,MATCH(FILTER(A:A,ISNUMBER(FIND(A3,C:C)),""),A:A,0))) -1)

    แล้วเราก็จะได้ผลลัพธ์ครบทุกช่องตามต้องการแล้ว

    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 86

    ถ้าเป็น Excel เก่ากว่า 365

    หลังจากลองเขียนสูตรแบบเต็มสรีม และอ้างทั้งคอลัมน์แล้วปรากฏว่าเครื่องรับไม่ไหว 555

    เดี๋ยวต้องปรับให้สูตรมัน Efficient มากขึ้น โดยผมขอเขียนเผื่อไว้ถึงแค่แถว 1000 พอนะครับ เพราะการอ้างทั้งคอลัมน์การคำนวณจะช้ากว่ามากเลย (คงไม่มีงานถึง 1000 งานหรอกมั้ง)

    และการจะเช็คว่ามีงานต่อหลังหรือไม่ จริงๆ เขียนสูตรเท่านี้ก็น่าจะพอ ผลลัพธ์จะ Efficient กว่าเดิมที่เราต้องดึงมาทุกค่า

    =MIN(IFERROR(FIND(A3,$C$3:$C$1000),""))=0
    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 87

    จากนั้นใน LF กับ LS ก็ทำตาม Step ข้างบน เป็นแบบนี้

    ใน G3

    =IF(F3,MAX($E$3:$E$1000),LSแรก-1)

    ใน H3

    =G3-B3+1
    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 88

    คราวนี้เราจะลองทำการ Lookup แบบใช้ Excel Version เก่าบ้าง

    ใน I6

    =INDEX($A$3:$A$1000,SMALL(IF(ISNUMBER(FIND(A6,$C$3:$C$1000)),ROW($C$3:$C$1000)-ROW($C$2)),ROW($A$1:INDEX(A:A,(COUNT(IF(ISNUMBER(FIND(A6,$C$3:$C$1000)),(ROW($C$3:$C$1000)-ROW($C$2)))))))))
    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 89

    จากนั้นทำการ LookupLS แล้วหาค่า MIN

    ใน I3 จะเป็นแบบนี้

    =MIN(INDEX(H:H,MATCH(INDEX($A$3:$A$1000,SMALL(IF(ISNUMBER(FIND(A3,$C$3:$C$1000)),ROW($C$3:$C$1000)-ROW($C$2)),ROW($A$1:INDEX(A:A,(COUNT(IF(ISNUMBER(FIND(A3,$C$3:$C$1000)),(ROW($C$3:$C$1000)-ROW($C$2))))))))),A:A,0)))

    คราวนี้เรายัดสูตรนี้ลงไปในคำว่า LSแรก ในคอลัมน์ G

    ใน G3 จะเป็นแบบนี้

    =IF(F3,MAX($E$3:$E$1000),MIN(INDEX(H:H,MATCH(INDEX($A$3:$A$1000,SMALL(IF(ISNUMBER(FIND(A3,$C$3:$C$1000)),ROW($C$3:$C$1000)-ROW($C$2)),ROW($A$1:INDEX(A:A,(COUNT(IF(ISNUMBER(FIND(A3,$C$3:$C$1000)),(ROW($C$3:$C$1000)-ROW($C$2))))))))),A:A,0)))-1)

    แล้วเราก็จะได้ผลลัพธ์สุดท้ายตามต้องการ

    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 90

    สรุปสูตรที่บรรทัดที่ 3 ของแต่ละอัน

    Excel 365

    D3 : Early Start

    =LET(prepareText,"<a><b>"&SUBSTITUTE(C3,",","</b><b>")&"</b></a>",
    split,FILTERXML(prepareText,"//b"),
    MaxEFBefore,MAX(INDEX(E:E,MATCH(split,A:A,0))),
    IF(C3="",0,MaxEFBefore)+1)

    E3 : Early Finish

    =D3+B3-1

    F3 : งานต่อหลัง

    =TEXTJOIN(",",TRUE,FILTER(A:A,ISNUMBER(FIND(A3,C:C)),""))

    G3 : Late Finish

    =IF(F3="",MAX(E:E),MIN(INDEX(H:H,MATCH(FILTER(A:A,ISNUMBER(FIND(A3,C:C)),""),A:A,0))) -1)

    H3 : Late Start

    =G3-B3+1

    Excel เก่ากว่า 365

    D3 : Early Start (ต้องมี Excel 2013 ขึ้นไป เพราะใช้ FILTERXML)

    =IF(C3="",0,MAX(INDEX(E:E,MATCH(FILTERXML("<a><b>"&SUBSTITUTE(C3,",","</b><b>")&"</b></a>","//b"),A:A,0))))+1

    E3 : Early Finish

    =D3+B3-1

    F3 : เป็นตัวสุดท้าย

    =MIN(IFERROR(FIND(A3,$C$3:$C$1000),""))=0

    G3 : Late Finish

    =IF(F3,MAX($E$3:$E$1000),MIN(INDEX(H:H,MATCH(INDEX($A$3:$A$1000,SMALL(IF(ISNUMBER(FIND(A3,$C$3:$C$1000)),ROW($C$3:$C$1000)-ROW($C$2)),ROW($A$1:INDEX(A:A,(COUNT(IF(ISNUMBER(FIND(A3,$C$3:$C$1000)),(ROW($C$3:$C$1000)-ROW($C$2))))))))),A:A,0)))-1)

    H3 : Late Start

    =G3-B3+1

    จัดเรียงหน้าตาและทำ Gantt Chart

    จากนั้นจัดเรียงคอลัมน์ใหม่ให้เหมาะสม เช่น ให้ LS ขึ้นก่อน LF โดย Cut แล้ย้ายคอลัมน์ซะ

    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 91

    จากนั้นขั้นตอนการใส่สี จะทำได้ 2 แบบ คือ แบบแรก เขียนสูตรให้ออกมาเป็น Code ตัวเลข 0,1,2 ตามเงื่อนไขดังนี้

    • 0 = ไม่อยู่ในช่วงไหนเลย
    • 1 = อยู่ในช่วงของ LS-LF
    • 2 = อยู่ในช่วงของ ES-EF

    โดยจะใส่สูตรแบบนี้ ที่ช่อง I3 แล้ว Copy ไปใช้ทั้งตาราง แล้วเราก็ใส่ Conditional Format ให้เหมาะสมตามแต่ละเลข

    =IF(AND(I$2>=$D3,I$2<=$E3),2,IF(AND(I$2>=$G3,I$2<=$H3),1,0))
    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 92

    หรือจะทำอีกแบบคือ ใส่ Conditional Format 2 อัน สำหรับในช่อง ES-EF กับ LS-LF ก็ได้ ซึ่งในบทความนี้ผมจะใช้วิธีนี้แทนที่จะเขียนเลข 0,1,2 ออกมา

    สำหรับ ES-EF เราจะทำเป็น Pattern สีเขียว จะได้มองทะลุด้านหลังได้ ซึ่งเขียน Conditional Format แบบ Custom ดังนี้ (เลือกพื้นที่เริ่มจาก I3)

    =AND(I$2>=$D3,I$2<=$E3)
    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 93

    สำหรับ LS-LF เราจะทำเป็นสีเหลือง ซึ่งเขียน Conditional Format แบบ Custom ดังนี้ (เลือกพื้นที่เริ่มจาก I3)

    =AND(I$2>=$G3,I$2<=$H3)
    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 94

    ซึ่งเราจะเรียงเอาสีเขียวขึ้นก่อน ไม่งั้นเดี๋ยวจะมองไม่เห็น

    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 95

    แค่นี้เราจะเห็นได้ชัดเลยว่าสามารถเริ่มงานอะไรได้ตั้งแต่ตอนไหน เริ่มได้ช้าสุดตอนไหน

    และเราจะสังเกตได้ง่ายเลยว่าตรงไหนคือ Critical Path ซึ่งก็คืองานที่สองสีซ้อนกัน 100% ทั้งงานนั่นเอง (ไม่มีเวลาให้ Late ได้เลย)

    ซึ่งทุกอย่างจะเปลี่ยนแบบอัตโนมัติทั้งหมดด้วย!

    ลองเปลี่ยน Dependency

    ลองแก้โจทย์ว่างาน G ต้องทำงาน B ให้เสร็จก่อนดู

    จะเห็นว่าตัวเลขทุกอย่างเปลี่ยนตามหมดเลย

    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 96

    ซึ่งถ้าลอง Sort ตาม LS อาจจะดูง่ายขึ้นได้ดังนี้

    วิธีคำนวณ Critical Path Method ในงานบริหารโครงการ ด้วย Excel 97

    สรุป

    วิธีที่แสดงในบทความนี้ ใช้เทคนิคการเขียนสูตรซึ่งใช้ Excel 2013 ขึ้นไป (เพราะใช้ FILTERXML) ถ้าใครมี Excel version เก่ากว่านี้ แล้วมีวิธีดีๆ อย่างอื่นอีก ก็ลองมาแชร์กันได้นะครับ

  • เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด

    เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด

    ตอนก่อนหน้านี้เราได้เรียนรู้ทั้งเรื่องการหาอนุพันธ์และการอินทิเกรทไปแล้ว ในตอนนี้เราจะมาดูวิธีประยุกต์ใช้ความรู้เรื่องอนุพันธ์เพื่อทำ Optimization โดยการหาจุดสูงสุดต่ำสุดกันซักหน่อยครับ

    การทำ Optimization ด้วยการหาอนุพันธ์

    เวลาเรามีฟังก์ชันอะไรซักอย่าง แล้วอยากจะหาว่าจุดสูงสุดหรือจุดต่ำสุดในช่วงที่สนใจอยู่ที่ตำแหน่งไหน? เราจะทำยังไงกับมันได้บ้าง?

    ก่อนจะไปหาค่าที่ทำให้เกิด “จุดสูงสุด” หรือ “จุดต่ำสุด” เราไปรู้จักอีกคำนึงก่อน นั่นก็คือ Critical Value หรือ ค่า x ที่ทำให้เกิดจุดวกกลับ (Extreme Point) ของเส้นกราฟซะก่อน

    optimization maximize minimize

    ซึ่งจุดวกกลับก็จะมี 2 ลักษณะอีกคือ

    • ถ้าความชันของกราฟเปลี่ยนจากบวก ไป0 แล้ว ไปลบ แสดงว่าจุดวกกลับนั้นเป็นแบบตัว A ซึ่งก็น่าจะทำให้เกิดจุดต่ำสูงสุด
    • ถ้าความชันของกราฟเปลี่ยนจากลบ ไป0 แล้ว ไปบวก แสดงว่าจุดวกกลับนั้นเป็นแบบตัว U ซึ่งก็น่าจะทำให้เกิดจุดต่ำสุด

    แปลว่าถ้าเราหาสมการของอนุพันธ์ได้ แล้วเอามาเทียบกับค่า 0 ก็จะสามารถแก้สมการหาได้ว่า x ค่าใดทำให้เกิดความชันเป็น 0 บ้าง ซึ่งก็คือค่าที่ทำให้เกิดจุดวกกลับนั่นเอง

    จาก y=x^3-10x^2

    เมื่อ Diff แล้วจะได้แบบนี้

    y'=3x^2-20x

    เดี๋ยวผมลอง Plot กราฟดู

    เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 98

    จะเห็นชัดเลยว่าจุดวกกลับนั้นมีค่า y’ เป็น 0 จริงๆ

    ดังนั้นเราเอา 3x^2-20x=0 แล้วแก้สมการ

    แยกตัวประกอบเทียบกับ 0

    x(3x-20)=0

    จะได้ว่า

    • x=0 หรือ
    • 3x-20=0 ซึ่ง x=20/3 = 6.667 นั่นเอง

    ทีนี้ถ้าเราอยากจะ Test ว่า จุดที่เราแก้สมการมาได้ เช่น x=0, x= 6.6667 นั้น จุดไหนเป็นประเภทจุดวกกลับแบบไหน เป็นแบบจุดสูงสุด หรือ ต่ำสุด โดยไม่อยาก Plot กราฟออกมา หรือไม่อยากจะมานั่งดูค่าบริเวณใกล้เคียง เราก็สามารถทดสอบได้จากการหาค่า y” ที่จุด x นั้นๆ นั่นเอง

    เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 99
    • ถ้าค่า y” ที่ x นั้นๆ มากกว่า 0 =ความชัน (y’) มีอัตราการเปลี่ยนแปลงเป็นบวก (แปลว่า ความชันเพิ่มจาก – 0 + ) แสดงว่าเป็นจุดวกกลับแบบต่ำสุด (ชันจาก – 0 + คล้าย กับว่าถึงเวลาที่เป็นขาขึ้นแล้วนั่นเอง )
    • ถ้าค่า y” ที่ x นั้นๆ น้อยกว่า 0 =ความชัน (y’) มีอัตราการเปลี่ยนแปลงเป็นลบ (แปลว่า ความชันเพิ่มจาก + 0 – ) แสดงว่าเป็นจุดวกกลับแบบสูงสุด

    ในกรณีตัวอย่างของเรา ที่จุดที่แก้สมการมาได้ 2 ตัว

    • ที่จุด x=0 , y” =-20 ซึ่งเป็นลบ แสดงว่าเป็นจุดวกกลับแบบจุดสูงสุด
    • ที่จุด x=6.667, y”=20 ซึ่งเป็นบวก แสดงว่าเป็นจุดวกกลับแบบจุดต่ำสุด

    อย่างไรก็ตาม จุดวกกลับสามารถมีได้หลายแบบ และมีได้หลายจุดด้วย เรามารู้จักคำศัพท์ที่เกี่ยวข้องกันนิดนึง

    • จุดวกกลับที่เป็นประเภทสูงสุดทั้งหมด เรียกว่าเป็น จุดสูงสุดสัมพัทธ์ (Relative Maximum หรือ Local Maximum)
      • ในกราฟ y คือจุดที่ x=0,y=0
      • ในกราฟ y’ ไม่มี เพราะไม่มีจุกวกกลับรูปตัว A เลย
    • จุดวกกลับที่เป็นประเภทต่ำสุดทั้งหมด เรียกว่าเป็น จุดต่ำสุดสัมพัทธ์ (Relative Minimum หรือ Local Minimum)
      • ในกราฟ y คือ จุดที่ x=6.667, y=-148.148
      • ในกราฟ y’ คือ จุด x=3.333, y’= -33.33
    • คำว่าสัมพัทธ์ พูดง่ายๆ ก็คือ เมื่อลองเทียบกับบริเวณข้างๆ แล้วเป็นยังไง

    ทีนี้มาดูแบบสัมบูรณ์กันบ้าง

    • แต่ถ้าจุดใดที่ฟังก์ชันมีค่ามากที่สุดจริงๆ เมื่อเทียบกับทุกจุด แบบนี้เรียกว่า จุดสูงสุดสัมบูรณ์ (Absolute Maximum หรือ Global Maximum)
      • ในกราฟ y ไม่มี เพราะ x เพิ่มขึ้นเรื่อยๆ แล้ว y ก็เพิ่มขึ้นไปจนถึง infinity
    • แต่ถ้าจุดใดที่ฟังก์ชันมีค่าน้อยที่สุดจริงๆ เมื่อเทียบกับทุกจุด แบบนี้เรียกว่า จุดต่ำสุดสัมบูรณ์ (Absolute Minimum หรือ Global Minimum)
      • ในกราฟ y ไม่มี เพราะ x ลดลงเรื่อยๆ แล้ว y ก็ลดลงไปจนถึง -infinity
      • ในกราฟ y’ คือ จุด x=3.333, y’= -33.33
      • จะเห็นว่าจุดที่เป็น Absolute Max/Min ก็จะเป็น Relative Max/min ด้วยเสมอ แต่ในทางกลับกันไม่ใช่นะ

    นอกจากวิธีนี้แล้ว การหาค่าจุดสูงสุดต่ำสุดด้วยเครื่องมืออื่นๆ ก็มีดังนี้

    หาค่าจุดสูงสุดต่ำสุดด้วยเครื่องมืออื่นๆ

    ใช้ Excel Solver

    หากจะใช้ Excel ทำ Optimization เราจะใช้ Solver Add-in มาทำ เพราะมันเป็นเครื่องมือที่มีมากับ Excel อยู่แล้ว และเก่งกว่า Goal Seek ตรงที่หาค่า Min, Max ได้ และใส่ข้อจำกัดหรือ Constrain ได้ด้วย

    วิธีการเรียกใช้ Solver ให้ไปที่ File -> Excel Options -> Add-in -> Go… -> ติ๊ก Solver Addin

    เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 101

    เช่น เราสามารถให้ Solver ทำการ

    • Set Objective : หาค่า y (B3) น้อยสุด (Min)
    • By Changing Variable Cell : โดยที่ให้เปลี่ยนค่า x (A3) ไปเรื่อยๆ
    • Subject to the Constraints : โดยมีข้อจำกัดคือ x>=0
    เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 102

    Solving Method ให้เลือก GRG Nonlinear เพราะเราก็ได้เห็นแล้วว่าสมการระหว่างค่า x กับ y นั้นเป็นเส้นโค้ง ไม่ใช่เส้นตรง

    พอกด Solve : จะได้ว่า Solver ก็สามารถหาค่า x ที่ทำให้ y ต่ำสุดได้ 6.667 เช่นกัน

    เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 103

    หรือจะทำอีกแบบนึงคือ Solve หาค่า x ที่ทำให้ y’ เป็น 0 (Value of : 0) โดยที่ x>=0.1 ก็ได้เช่นกัน พอ Solve ก็จะได้คำตอบเดียวกัน

    เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 104
    เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 105

    ใช้เว็บ Wolfram Alpha

    เขียนสิ่งที่ต้องการรู้ในเว็บ Wolfram Alpha ซึ่งเป็นเว็บด้านการคำนวณทางคณิตศาสตร์โดยเฉพาะ บอกเลยว่าโคตรโกง!! เพียงแค่ใส่สมการแล้วมันแก้ให้เลยแบบนี้ก็ได้

    3x^2-20x=0

    เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 106

    เอาจริงๆ ใส่สมการดังเดิมแบบนี้ไปเลยยังได้ minimize maximize y=x^3-10x^2

    เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 107

    ตัวอย่างเชิงประยุกต์ : ออกแบบภาชนะที่ต้นทุนต่ำสุด

    ถ้าต้องทำทรงกระบอกบรรจุน้ำปริมาตร 1 ลิตรพอดี (แบบมีฝาปิดด้วย) ควรจะทำทรงกระบอกรัศมี (r) เท่าไหร่ สูง (h) เท่าไร่ จึงจะประหยัดวัตถุดิบที่ใช้ผลิตมากที่สุด

    เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 108

    จะเห็นว่าการที่จะประหยัดวัตถุดิบให้ได้มากที่สุด ก็คือ ต้องทำให้พื้นที่ผิวน้อยที่สุดนั่นเอง (นี่แหละคือการ Optimization)

    พื้นที่ผิว

    ซึ่งพื้นที่ผิวคิดจาก พื้นที่ฝาและก้น รวมกับพื้นที่ผิวทรงกระบอกด้านข้าง

    พื้นที่ฝาและก้น : เป็นพื้นที่วงกลม 2 อัน ฝาปิดบนกับฐานข้างล่าง

    = PI()*r^2 * 2 อัน

    พื้นที่ผิวรอบๆ : มาจากทรงกระบอกด้านข้าง = เส้นสอบรูปวงกลม *ความสูง

    =2*PI()*r*h
    พื้นที่ผิวรวม A(r,h) = 2* PI()*r^2 + 2*PI()*r*h

    ปริมาตร

    ปริมาตร V = PI()*r^2 *h

    ย้ายข้างให้เหลือ h ตัวเดียว

    h = V/(PI()*r^2)

    เราเอา h ที่เป็นข้อจำกัดนี่ เข้าไปแทนในสมการพื้นที่ A ซะ เพื่อให้ฟังก์ชันของพื้นที่เขียนอยู่ในรูปแบบของ r ตัวเดียว

    พื้นที่ผิวรวม A(r) = 2* PI()*r^2 + 2*PI()*r* V/(PI()*r^2)

    ตัดไปตัดมา จะได้ว่า

    A(r) = 2* PI()*r^2 + 2V/r

    หากเรา diff หา A’ จะได้ว่า

    A'(r) = 4* PI()*r - 2V/r^2

    ถ้าเรา Solve หา r ที่ทำให้ A'(r) เป็น 0 จะได้ว่า

    4* PI()*r = 2V/r^2
    V = 2 * PI()* r^3
    r = (V / 2 * PI() )^(1/3)

    V ในที่นี้ที่เราต้องการปริมาตรคือ 1000 cm3 ก็แทนค่าเลย

    r  = (1000 / (2 * PI()))^(1/3) = 5.419261 m นั่นเอง

    ส่วนความสูง h เรารู้ความสัมพันธ์ของมันอยู่แล้ว ก็แทนค่าตัวแปรเลย

    h = V/(PI()*r^2) = 1000/(PI()*5.419261^2) = 10.83852 cm

    หากเราลอง Plot กราฟด้วย Excel ที่ V=1000 จะได้เห็นภาพ ดังนี้

    เรียน Calculus ด้วย Excel ตอนที่ 3 : Optimization หาจุดสูงสุด จุดต่ำสุด 109

    ที่ r ประมาณ 5.4 ทำให้ Aต่ำสุดจริงๆ เพราะว่า

    A’ อยู่ที่ประมาณ 0 ส่วน A” มีค่าเป็น + แสดงว่า A’กำลังชันขึ้น แสดงว่าเป็นจุดวกกลับแบบต่ำสุดนั่นเอง

    สารบัญ Calculus

  • Power Query Speed Up Tips : รวมเทคนิคแก้ปัญหา Power Query ช้า ให้ทำงานเร็วขึ้น

    Power Query Speed Up Tips : รวมเทคนิคแก้ปัญหา Power Query ช้า ให้ทำงานเร็วขึ้น

    ในบทความนี้จะเป็นการรวบรวมเทคนิคและความรู้ความเข้าใจในการที่จะแก้ปัญหา Power Query ช้า ให้ทำงานเร็วขึ้น เพราะหากคุณเริ่มใช้ Power Query เป็น คุณจะเริ่มใช้มันกับทุกสถานการณ์ หากคุณเริ่มทำมันเยอะพอ คุณคงต้องเคยเจอปัญหาว่าบางทีมันทำงานช้ามากตอนที่กด Refresh All เพื่ออัปเดทข้อมูล ไม่ว่าจะเป็นใน Excel หรือ Power BI ก็ตาม เพื่อไม่ให้เสียเวลา เรามาเริ่มกันเลยครับ

    ตั้งค่า Data Load ให้เหมาะสม

    ปกติแล้วเวลาเราทำงานกับ Power Query เรามักจะสร้าง Query Step ย่อยๆ ขึ้นมาระหว่างทาง แล้วสุดท้ายก็เอามาใช้จริงแค่บาง Query เท่านั้น นอกนั้นเป็นตัวทด ซึ่งตัวทดควรจะ Load ออกมาแบบ Connection Only จริงมั้ยครับ?

    ทีนี้ถ้าเราต้องมานั่งกด Close & Load to… Connection Only ทุกอันก็คงเสียเวลาแย่เลย ดังนั้นเราสามารถตั้งค่า Default การ Load เอาไว้ให้เป็น Connection Only ไว้ก่อน โดยไปที่ File –>Option & Settings –> Query Options –> Data Load

    ตรงนี้มีจุดที่ปรับได้ 3อันคือ

    Power Query Speed Up Tips : รวมเทคนิคแก้ปัญหา Power Query ช้า ให้ทำงานเร็วขึ้น 110

    1.Default Load ซึ่งผมแนะนำให้กดแบบ Specific custom default แล้วเอาติ๊กออกไปให้หมด เพื่อให้มันออกมาเป็น Connection Only นั่นเอง (ถ้าอยากจะ Load Query ไหนออกมาเป็นอย่างอื่น ก็กดคลิ๊กขวาที่ Query แล้วกด Load to… ได้)

    2. โหมด Fast Data Load : ถ้าติ๊กอันนี้ ไอ้เครื่องหมาย i เค้าบอกว่า Query จะ Load ผลลัพธ์ออกไปใช้งานเร็วขึ้น แต่ระหว่างโหลดเครื่องอาจจะนิ่งๆ แฮงๆ ไปชั่วครู่ (เพราะว่ามันทุ่มเทพลังทั้งหมดไปที่การ Load ละมั้ง) แต่ที่ผมเคยลองผลลัพธ์ก็ไม่เห็นจะต่างกันเท่าไหร่เลยครับ 555

    3. ตั้งค่า Cache : ตัวนี้จริงๆ ไม่ควรเกี่ยวกับการ Load โดยตรง แต่เกี่ยวกับการ Preview Data ให้ดูใน Query Editor มากกว่า (เพราะการ Preview มันเอามาจาก Data ที่เก็บใน Cache) แต่ตรงนี้ผมลองตั้งเยอะๆ แล้วทำให้เร็วขึ้นเล็กน้อยเฉยเลย… ดังนั้นใครมี Hdd เหลือก็ตั้งเยอะหน่อยก็ได้ครับ ไม่เสียหาย

    ตั้งค่า Allow data preview to download in the background ให้เหมาะสม

    คำสั่ง Allow data preview to download in the background นี้อยู่ใน Query Option -> Data Load

    Power Query Speed Up Tips : รวมเทคนิคแก้ปัญหา Power Query ช้า ให้ทำงานเร็วขึ้น 111

    คำสั่งนี้เอาไว้ทำอะไร?

    ปกติแล้วเวลา Power Query Get Data มาเตรียมให้เรา Transform เล่น ใน Power Query Editor มันจะเอาข้อมูลมา 1000 แถว ให้เราเห็นภาพผลลัพธ์ก่อน อันนี้แหละที่เรียกว่า Data Preview (ที่เอาจากข้อมูล Cache ที่เก็บในข้อที่แล้ว)

    หากเราติั๊ก Allow data preview to download in the background เอาไว้ มันจะเป็นการบอกให้ Power Query คอย Update ตัว Preview สำหรับทุกๆ Query และที่สำคัญเวลาที่เรากด Refresh All มันก็จะ Load Preview สำหรับทุก Query ใหม่ด้วย!! ซึ่งตรงนี้แหละที่มันเสียเวลา

    ข้อสรุปคือ

    • หากคุณมี Query เยอะๆ โดยเฉพาะ Query ที่ไม่ได้ Load Data ออกมาจริงๆ การไม่ติ๊กจะทำให้ Load เร็วกว่า
    • อย่างไรก็ตาม ข้อเสียของการเอาออก คือ เวลากดเปลี่ยน Step หรือกดไปดู Query ตัวอื่นใน Query Editor เจ้า Data Preview จะโหลดช้ากว่าเดิม

    รายละเอียดเคสที่ disable option นี้ช่วยได้ สามารถอ่านได้ในนี้

    ใช้ Power Query ใน Power BI แทน Excel !

    ไม่รู้เหมือนกันว่าทำไม เหมือน 2 ตัวนี้มันจะทำงานไม่เหมือนกัน 100% ถ้าใช้ Power Query ใน Power BI มันจะ Load เร็วกว่า Excel นิดหน่อย

    ซึ่งถ้าเราเคยทำงานใน Excel อยู่แล้ว ไม่จำเป็นต้องไปสร้าง Query ใน Power BI ใหม่ทั้งหมดนะ เราสามารถคลิ๊กขวา Copy Query จาก Excel ไป Power BI ได้เลย

    Power Query Speed Up Tips : รวมเทคนิคแก้ปัญหา Power Query ช้า ให้ทำงานเร็วขึ้น 112

    จากนั้นไป Paste ใน Power Query Editor ของ Power BI

    Power Query Speed Up Tips : รวมเทคนิคแก้ปัญหา Power Query ช้า ให้ทำงานเร็วขึ้น 113

    ผลลัพธ์ : เคสผมลองแล้วเร็วขึ้น 10% ครับ

    อย่างไรก็ตาม หาก Query มีการดึงไฟล์จาก Workbook ตัวเองไว้ มันจะเอามาลง Power BI ตรงๆ ไม่ได้ เพราะใน Power BI มันไม่มี Excel.CurrentWorkbook ครับ มีแต่ Excel.Workbook

    เข้าใจหลักการของการ Reference / Duplicate Table

    หลายๆ คนอาจจะคิดว่า หากเราเขียน Query1 ไว้แล้ว จากนั้นทำการ Reference Query1 ไปใช้ใน Query2,3,4,… อีกหลายๆ อัน แล้วต้องการ Load ผลลัพธ์ออกหมดทุกอัน มันจะคำนวณ Query1 แค่ครั้งเดียวตอนแรก หลังจากนั้นไม่ต้องคำนวณอีกแล้ว อันนี้เป็นความเข้าใจที่ผิดนะครับ

    เพราะการ Reference Query จริงๆ มันก็คือเหมือนเอา Code ของ Query1 มาใส่ใน Query อื่นๆ ที่อ้างอิงมันไปด้วยอยู่ดี แต่เหมือนเป็น Let…in… ซ้อนใน Let…in… ของ Query อื่น เช่น

    Query1 ผมเขียนว่า

    let
        Step1 = 3+2,
        Step2 = Step1*100
    in
        Step2

    จากนั้นผมสร้าง Query 2 แล้ว Reference ข้อมูลจาก Query1 จะได้สูตรใน Query2 ว่า

    let
        Source = Query1
    in
        Source

    จากนั้นผมก็ทำนู่นนี่ใน Query 2 ไปอีก เช่น

    let
        Source = Query1,
        Step1 = Source+55,
        Step2 = Step1/10
    in
        Step2

    แบบนี้เวลามันทำงานจริง มันจะเหมือนว่า Copy Code ใน Query1 มาใส่ใน Query 2 ก่อนจะทำงาน เช่น

    let
        Source = 
            let
                Step1 = 3+2,
                Step2 = Step1*100
            in
                Step2  
        ,
        Step1 = Source+55,
        Step2 = Step1/10
    in
        Step2

    ซึ่งเวลามันทำงานก็จะประมาณนี้

    Power Query ช้า

    ดังนั้นมันก็จะคำนวณทุกสิ่งทุกอย่างใน Query1 ใหม่อยู่ดี (ยกเว้นว่า Query1 ไม่ต้อง Load ออกมา คือเป็นตัวทดเฉยๆ มันก็จะรันแค่ที่ Query2 นี่แหละ)

    ดังนั้นประโยชน์ของ Reference Query ก็แค่ว่า หากเราไปแก้ Query1 แล้ว ตัวต้นทางของ Query2 จะเปลี่ยนตามอัตโนมัติ ซึ่งต่างจาก Duplicate ซึ่งหากเราไปแก้ Query1 แล้ว ตัว Code ใน Query2 จะไม่ได้เปลี่ยนตามนั่นเอง

    ใช้ Table.Buffer อย่างเหมาะสม

    คำสั่ง Table.Buffer มีความสามารถในการเก็บข้อมูลในตารางเข้าสู่ Memory (คนละอันกับ Cache ที่จะเก็บบน HDD) เพื่อที่เวลามีการเรียกใช้อีก มันจะได้ไม่ต้องไปเอาข้อมูลจาก Data Source ใหม่ทุกครั้ง

    Table.Buffer(table as table) as table

    เคสที่ผมเคยใช้ ผมใช้มันกับ Table ที่ต้องมีการอ้างถึงหลายรอบใน Query เดียวกัน (ที่อ้างถึงเพราะเป็นการ Filter ช้อมูลจาก Table นั้นคล้ายๆ Vlookup Approximate Match) ซึ่งมีการอ้างถึง Table นั้นเท่ากับจำนวน Row ใน Table หลัก ซึ่งมีหลายพันครั้ง

    Code ก่อน buffer

    let
        //Source เป็นการดึงผลลัพธ์จากอีก Table นึงมาทำงานต่อ
        Source=SystemEmployee,
        
        #"Added Custom" = Table.AddColumn(Source, "Custom", 
                (main)=>Table.SelectRows(Source,
                        (sub)=>sub[EnNo]=main[EnNo] and (sub[DateonlyNum]=main[DateonlyNum] or (sub[DateonlyNum]=(main[DateonlyNum]+1) and sub[Mode]=6 )))),
        
        ....

    พบว่าไฟล์ที่เป็นต้นทางจริงๆ ขนาดแค่ 209K แต่ Power Query ดันขึ้นว่า Read Data ไป 900 MB++ (เพราะมันอ่านจาก Source ใหม่ไม่รู้กี่รอบ)

    Code หลัง buffer

    let
        //เพิ่มการ Buffer ให้ Source เพราะว่ามีการเรียกใช้ Source หลายรอบด้วย Table.SelectRows ใน Step ถัดไป
        Source=Table.Buffer(SystemEmployee),
        
        #"Added Custom" = Table.AddColumn(Source, "Custom", 
                (main)=>Table.SelectRows(Source,
                        (sub)=>sub[EnNo]=main[EnNo] and (sub[DateonlyNum]=main[DateonlyNum] or (sub[DateonlyNum]=(main[DateonlyNum]+1) and sub[Mode]=6 )))),
        
        ....
        

    หลังจากใช้เทคนิคTable.Buffer แล้ว ในเคสของผมก็ช่วยลดเวลา Load ไปได้ประมาณ 10-15% (ควรลองทดสอบด้วยนะ เพราะบางเคสทำแล้วอาจจะแย่ลงได้ เนื่องจาก Table.Buffer มันจะทำการอ่านข้อมูลเข้า Ram ทั้งหมดตอนที่ Buffer เลย)

    อีกทั้งเลขที่ขึ้นว่า Load ข้อมูลจาก Data เท่าไหร่แล้ว มีขนาดใกล้เคียงกับ Data จริงคือ 209kb ไม่ใช่ 900MB++ เหมือนตอนที่ไม่ได้ Buffer (เห็นแล้วตกใจมาก!!)

    แปลว่าในตัวอย่างที่แล้วเรื่อง Reference/Duplicate Query สมมติเราไปสร้าง Query ซักตัวมาใช้ Table.Buffer Query1 ไว้ จากนั้นให้ Table อื่นอ้างอิง Query นั้นไปใช้ มันก็ไม่ช่วยอะไรอยู่ดี เพราะจะกลายเป็นทุก Query จะต้อง Buffer ใหม่ตลอดเวลานั่นเอง

    สรุปแล้ว Table.Buffer จะมีประโยชน์ก็ต่อเมื่อ ใช้กับ Query ที่มีการเรียก Table นั้นๆ หลายรอบใน Query เดียวกันเท่านั้น

    พยายามทำให้ข้อมูลให้เหลือน้อยก่อนทำ Operation อื่น

    สมมติการ Transform ข้อมูลเรามี 2 เรื่องที่ต้องทำ คือ Add Column คำนวณบางอย่าง กับ Filter ให้เหลือข้อมูลบรรทัดที่ต้องการ

    ถ้าเป็นไปได้เราควรจะ Filter ก่อน Add Column เพื่อที่ว่า Power Query จะได้คำนวณน้อยลงเท่าที่จำเป็นจริงๆ ไม่ใช่คำนวณทั้งหมดแล้วดันไป Filter ทิ้งทีหลัง แบบนั้นเสีย Resource เปล่าๆ (ยกเว้นว่า ไอ้ Column ที่ add มาคือเงื่อนไขของการ Filter ถ้างั้นเราก็จำเป็นต้อง Add ก่อน จริงมะ?)

    นอกจากนั้น ก่อนจะใช้ Table.Buffer ในตัวอย่างที่แล้ว หากเราเลือกให้เหลือเฉพาะข้อมูลที่จำเป็นก่อนจะทำการ Buffer มันก็น่าจะช่วยให้ Load Query เร็วขึ้นเช่นกัน ซึ่งผมลองปรับ Query แล้วปรากฏว่าเร็วขึ้น 30%

    let
      Source = SystemEmployee,
      MyBufferTable = Table.Buffer(
        Table.SelectColumns(Source, {"EnNo", "Mode", "DateonlyNum", "DateTime"})  ),
      #"Added Custom" = Table.AddColumn(
        Source, "Custom", 
        (main) => Table.SelectRows(
          MyBufferTable, 
          (sub) => sub[EnNo] = main[EnNo] and (sub[DateonlyNum] = main[DateonlyNum]
            or (sub[DateonlyNum] = (main[DateonlyNum] + 1) and sub[Mode] = 6))
        )
      ),
    ...

    พยายามทำให้ Step เหลือน้อยๆ

    เราสามารถแก้ Code ให้มีจำนวน Step น้อยลงได้ ซึ่งเท่าที่ทดสอบดู Query ก็จะเร็วขึ้นเล็กน้อยด้วย

    แต่การทำแบบนี้ได้ ต้องเข้าใจโครงสร้างของ M Code ที่อ้างอิง Step ก่อนหน้ามาทำงานต่อ

    เช่น แทนที่จะเขียนแบบนี้

    let
        Source = Query1,
        Step1 = Source+55,
        Step2 = Step1/10
    in
        Step2

    การเขียนแบบนี้จะเร็วกว่าเล็กน้อย

    let
        Step2 = (Query1+55)/10,
    in
        Step2

    รวมถึงการกำจัด Step ที่ไม่จำเป็น เช่น Add Custom Column ไปแล้ว มาเปลี่ยนชื่อทีหลัง หากเราเปลี่ยนชื่อไปเลยใน Step Add Custom Column ก็จะเร็วกว่า เป็นต้น

    คลิปทดสอบการแก้ปัญหา Power Query ช้า

    รายละเอียดของเทคนิคในคลิปนี้ค่อนข้างซับซ้อน ใครสนใจสามารถดูได้ที่นี่ ซึ่งรวมหลายเทคนิคด้วยกันคือ

    • การยกเลิก Allow data preview to download in the background
    • ใช้ Table.View มาช่วยบอกให้ Power Query รู้ลักษณะ Structure ของ Data Source โดยไม่ต้องไปลองดึงมาจริงๆ
    • ยกเลิกการเช็ค Data Privacy
    • ยกเลิก Parallel Load กรณีที่เอา Data เดิมหลายรอบ

    เทคนิคอื่นๆ

    ใครมีเทคนิคอื่นๆ ก็อย่าลืมมาแชร์กันด้วยนะครับ

  • วิธี Optimize การตัดแบ่งวัตถุดิบ ด้วย Excel Solver

    วิธี Optimize การตัดแบ่งวัตถุดิบ ด้วย Excel Solver

    • ในคลิปจะสอนวิธีการเลือก Pattern การตัดวัตถุดิบ (Cutting) ให้ครบตาม Demand ที่ต้องการ และต้องได้ต้นทุนต่ำที่สุดด้วย Excel Solver (เริ่ม 0:00)
    • อีกทั้งยังสอนการใช้ Power Query ช่วยสร้าง Pattern การตัดวัตถุดิบให้ครบทุกแบบแบบอัตโนมัติด้วย (เริ่ม 19:00)
    • บอกเลยว่าคลิปนี้ยาวและค่อนข้างซับซ้อน แต่ใครดูจบน่าจะได้แนวทางไปทำให้ธุรกิจมีกำไรมากขึ้นได้เลยล่ะ