stanford-oval/wikipedia huggingface dataset:
แบบแผนโรงงานนามธรรม
ข้อได้เปรียบ

เพราะว่า Abstract Factory Design Pattern ได้ใช้ประโยชน์ของ Information Hiding ทำให้ผู้ใช้ไม่ต้องสนใจเรื่องเลือก Factory Class ที่เหมาะสมด้วยตนเอง สิ่งที่ทำก็เพียงแค่เรียกใช้งานผ่าน Abstract Interface แล้ว Object ที่เหมาะสมก็จะถูกสร้างให้โดยอัตโนมัติ
เพิ่มความสามารถในการ Reuse เนื่องจาก Factory Class เป็น Concrete Class ที่ Derive มาจาก Abstract Factory Class ซึ่งในการเรียกใช้เราสามารถเรียกผ่าน Abstract Factory ได้ทันทีทำให้เมื่อเราต้องการที่จะเพิ่ม Factory ใหม่ลงไปสามารถทำได้โดยการสร้างคลาสใหม่ที่ Derive มาจาก Abstract Factory Class แล้ว Implement ใหม่ ซึ่งจะไม่ส่งผลต่อการเรียกใช้ของผู้ใช้ที่เรียกผ่าน Abstract Factory Class
ข้อเสียเปรียบ

เช่นเดียวกันกับแบบแผนการออกแบบซอฟต์แวร์อื่น ๆ แบบแผนโรงงานนามธรรมมีรูปแบบการออกแบบที่ค่อนข้างซับซ้อน อาจเป็นการเพิ่มความซับซ้อนโดยไม่จำเป็น เป็นการเพิ่มความสะดวกในการ design แต่เพิ่มความซับซ้อนในการทำงานของคอมพิวเตอร์ทำให้แบบแผนโรงงานนามธรรมไม่เหมาะสำหรับงานที่ต้องการความเร็วสูง ๆ ในคอมพิวเตอร์ที่ทรัพยากรค่อนข้างจำกัด และแบบแผนโรงงานนามธรรมจะต้องทำงานเพิ่มในขั้นตอนแรก ๆ ของการออกแบบด้วย
ตัวอย่าง > Java

/*
 * GUIFactory example
 */
abstract class GUIFactory {
    public static GUIFactory getFactory () {
        int sys = readFromConfigFile ("OS_TYPE") ;
        if (sys == 0) {
            return new WinFactory () ;
        } else {
            return new OSXFactory () ;
        }
    }

    public abstract Button createButton () ;
}


class WinFactory extends GUIFactory {
    public Button createButton () {
        return new WinButton () ;
    }
}


class OSXFactory extends GUIFactory {
    public Button createButton () {
        return new OSXButton () ;
    }
}


 
abstract class Button {
    public abstract void paint () ;
}


class WinButton extends Button {
    public void paint () {
        System.out.println ("I'm a WinButton") ;
    }
}

 
class OSXButton extends Button {
    public void paint () {
        System.out.println ("I'm an OSXButton") ;
    }
}

 
public class Application{
    public static void main (String[] args) {
        GUIFactory factory = GUIFactory.getFactory () ;
        Button button = factory.createButton () ;
        button.paint () ;
    }
    // Output is either:
    //   "I'm a WinButton"
    // or:
    //   "I'm an OSXButton"
}
แบบแผนอินเทอร์พรีเตอร์

แบบแผนตัวแปลคำสั่ง หรือ แบบแผนอินเทอร์พรีเตอร์ (Interpreter pattern) เป็นแบบแผนการออกแบบซอฟต์แวร์ ที่ใช้ในกรณีที่ขอบเขตของปัญหาสามารถถูกอธิบายในลักษณะที่เป็นภาษาและกฎที่แน่นอนตายตัว เราสามารถสร้างคลาสที่เป็นตัวแทนขององค์ประกอบของภาษา จัดเรียงเข้าด้วยกันเพื่ออธิบายปัญหาหนึ่ง ๆ และแปลหรือประเมินผลโดยใช้โครงสร้างที่ได้จัดเรียงไว้นั้น ตัวอย่างเช่น สูตรคณิตศาสตร์ต่าง ๆ หรือยกตัวอย่างให้เฉพาะเจาะจงเช่น สูตรเรขาคณิตสำหรับหาพื้นที่รูปสามเหลี่ยม
พื้นที่รูปสามเหลี่ยม = 1/2 * ความยาวฐาน * ความสูง
การนำไปใช้งาน

จากการที่ปัญหาส่วนใหญ่เมื่อถูกอธิบายในแบบที่เป็นนิยามภาษาจะมีลักษณะที่เป็น recursive คือปัญหาใหญ่ ๆ จะถูกแก้ได้โดยการแบ่งแยกเป็นปัญหาย่อย ๆ และแก้ปัญหาย่อย ๆ ลงไปตามลำดับ ๆ จนในที่สุดถึงปัญหาที่ไม่จำเป็นต้องแบ่งย่อยอีก ทำให้องค์ประกอบของแบบแผนอินเทอร์พรีเตอร์มีลักษณะเดียวกับแบบแผนคอมโพสิต
องค์ประกอบของแบบแผนอินเทอร์พรีเตอร์มีดังนี้
อินเตอร์เฟสหรือคลาสแบบแอ็บสแตรคเป็นแม่แบบที่นิยามพฤติกรรมที่แต่ละอ็อบเจกต์ของอินเทอร์พรีเตอร์ต้องมี
คลาสที่สามารถมีองค์ประกอบอื่นของอินเทอร์พรีเตอร์ได้
คลาสที่เป็นส่วนปลาย ไม่สามารถมีองค์ประกอบอื่นได้
คลาสสำหรับเป็นบริบท (context) หรือองค์ประกอบที่ใช้ในการประเมินผล
ตัวอย่างโปรแกรม > ภาษาจาวา

ตัวอย่างโปรแกรมเพื่อคำนวณหาพื้นที่รูปสามเหลี่ยมโดยสูตร พื้นที่รูปสามเหลี่ยม = 1/2 * ความยาวฐาน * ความสูง
อินเตอร์เฟส Expression เป็นแม่แบบของส่วนประกอบต่างๆ ของคอมโพสิต นิยามเมธอด evaluate() เพื่อให้แต่ละองค์ประกอบประเมินผลในส่วนของตัวเองและองค์ประกอบย่อยที่อยู่ภายใต้ ในที่นี้เราใช้ HashMap เป็น context เพื่อส่งผ่านค่าคัวแปรไปให้คลาสชนิด Variable ใช้ในการประเมินผล
import java.util.HashMap;

public interface Expression {
    public double evaluate(HashMap<String, Double> context) throws Exception;
}
คลาส Multiplication เปรียบเสมือนเครื่องหมายคูณ สามารถมีองค์ประกอบย่อยได้สองตัวคือตัวคูณข้างซ้ายและตัวคูณข้างขวา
import java.util.HashMap;

public class Multiplication implements Expression {
    private final Expression operand1;
    private final Expression operand2;

    public Multiplication(Expression operand1, Expression operand2) {
        this.operand1 = operand1;
        this.operand2 = operand2;
    }

    public double evaluate(HashMap<String, Double> context) throws Exception {
        return operand1.evaluate(context) * operand2.evaluate(context);
    }
}
คลาส Division เปรียบเสมือนเครื่องหมายหาร สามารถมีองค์ประกอบย่อยได้สองตัวคือตัวถูกหารและตัวหาร
import java.util.HashMap;

public class Division implements Expression {
    private final Expression operand1;
    private final Expression operand2;

    public Division(Expression operand1, Expression operand2) {
        this.operand1 = operand1;
        this.operand2 = operand2;
    }

    public double evaluate(HashMap<String, Double> context) throws Exception {
        return operand1.evaluate(context) / operand2.evaluate(context);
    }
}
คลาส Constant เปรียบเสมือนค่าคงที่ในสมการ ไม่มีองค์ประกอบย่อย
import java.util.HashMap;

public class Constant implements Expression {
    private final double value;

    public Constant(double value) {
        this.value = value;
    }

    public double evaluate(HashMap<String, Double> context) {
        return value;
    }
}
คลาส Variable เปรียบเสมือนตัวแปรในสมการ มีหน้าที่หาค่าของตนเองจาก context ไม่มีองค์ประกอบย่อย
import java.util.HashMap;

public class Variable implements Expression {
    private final String name;

    public Variable(String name) {
        this.name = name;
    }

    public double evaluate(HashMap<String, Double> context) throws Exception {
        Double value = context.get(name);
        if (value == null)
            throw new Exception("Unbound variable: " + name);

        return value;
    }
}
การเรียกใช้งาน
HashMap<String, Double> context = new HashMap<String, Double>();
context.put("base", 10.0);
context.put("height", 5.0);

Expression two = new Constant(2);
Expression base = new Variable("base");
Expression height = new Variable("height");

Expression multi = new Multiplication(base, height);
Expression triangleArea = new Division(multi, two);

double result = triangleArea.evaluate(context);
แหล่งข้อมูลอื่น

Interpreter โดย Vince Huston (อังกฤษ)
UML คลาสไดอะแกรมของแบบแผนอินเทอร์พรีเตอร์
สมรรถภาพทางกาย

สมรรถภาพทางกาย เป็นภาวะสุขภาพและความเป็นอยู่ดี สมรรถภาพทางกายจะสิ้นสุดตอนสิ้นอายุขัย (ตาย) และจะเจาะจงความสามารถดำเนินกีฬา ประกอบอาชีพและกิจวัตรประจำวันลักษณะต่าง ๆ ปกติสมรรถภาพทางกายได้มาจากโภชนาการที่เหมาะสม การออกกำลังกายระดับปานกลางถึงหนัก  และการพักผ่อนอย่างเพียงพอ
ก่อนการปฏิวัติอุตสาหกรรม นิยามสมรรถภาพว่าความสามารถดำเนินกิจวัตรประจำวันโดยไม่ล้าเกินไป ทว่า การอัตโนมัติและการเปลี่ยนแปลงวิถีชีวิต ปัจจุบันสมรรถภาพจึงถือว่าเป็นการวัดความสามารถของร่างกายในการทำหน้าที่ต่าง ๆ อย่างมีประสิทธิภาพและประสิทธิผลในงานและกิจกรรมหย่อนใจ มีสุขภาพดี ป้องกันโรคการเคลื่อนไหวน้อย และการเผชิญสถานการณ์ฉุกเฉิน
สมรรถภาพร่างกายเพื่อสุขภาพ (Health-Related Physical Fitness) ประกอบด้วย
1. ระบบหัวใจและไหลเวียนเลือด (Cardiovascular system) เป็นสมรรถนะเชิงปฏิบัติของระบบไหลเวียนเลือด (หัวใจ หลอดเลือด)  ในขณะออกกำลังกายหรือทำกิจกรรมต่าง ๆ ระบบหัวใจและหลอดเลือดจะทำหน้าที่ส่งเลือดและออกซิเจนไปสู่เซลล์ต่างๆของร่างกาย ทำให้ร่างกายทำงานและออกกำลังกายได้นานขึ้น
2. สัดส่วนของร่างกาย (Body compositions) เป็นการวัดองค์ประกอบต่างๆของร่างกายประกอบด้วย กล้ามเนื้อ กระดูก ไขมัน
ค่าดัชนีมวลกาย ค่าเปอร์เซ็นต์ไขมันในร่างกาย ค่าสัดส่วนเอวต่อสะโพก เป็นต้น
3. ความแข็งแรงของกล้ามเนื้อ (Muscle strength) เป็นความสามารถในการหดตัว ของกล้ามเนื้อเพื่อให้เกิดแรงหรือปริมาณสูงสุดของแรงที่กล้ามเนื้อสามารถออกแรงต้านทานได้
4. ความทนทานของกล้ามเนื้อ (Muscle endurance) เป็นความทนต่อการล้าเมื่อ กล้ามเนื้อหดตัวซ้ำ ๆ ติดต่อกันเป็นเวลานาน
5. ความยืดหยุ่นของร่างกาย (Flexibility) เป็นความสามารถในการยืดเหยียดข้อ ต่อเอ็น และกล้ามเนื้อของร่างกายการสมรรถภาพทางกาย (Physical  Fitness)
ความสำคัญของการตรวจสมรรถภาพทางกาย
1. เพื่อประเมินความเสี่ยงก่อนการออกกาลังกาย
2. เพื่อวางแผนโปรแกรมการออกกาลังกายและติดตามประเมินผล
3. เพื่อตั้งเปัาหมายในการออกกาลังกาย
ยุคคาลิมเมียน

ยุคคาลิมเมียน (อังกฤษ: Calymmian) อยู่ระหว่าง 1,600 ล้านปีมาแล้วถึง 1,400 ล้านปีมาแล้ว ในยุคนี้มีสัตว์หลายเซลล์เกิดขึ้นเป็นครั้งแรก ในยุคนี้ยังไม่พบสิ่งมีชีวิตที่มองเห็นด้วยตาเปล่า และยังไม่พบสิ่งมีชีวิตใดๆ บนพื้นดิน สัตว์ในยุคนี้ส่วนใหญ่เป็นโพรทิสตา,โครมาลวีโอตาและจุลชีพอื่นๆ อีกมากมาย ทวีปในยุคนี้คือมหาทวีปโรดิเนีย
รายชื่อตอนในศึกจอมเวทอภินิหาร ภารกิจ 100 ปี (มังงะ)

บทความนี้คือ รายชื่อตอนในศึกจอมเวทอภินิหาร ภารกิจ 100 ปีฉบับมังงะ ผลงานโดยฮิโระ มาชิมะ (Hiro Mashima)
ศึกจอมเวทอภินิหาร ภารกิจ 100 ปี > รายชื่อตอนที่ยังไม่ได้รวมเล่ม

ตอนที่ 172 เซส vs. เซ็ค การต่อสู้ที่ดุเดือด
ตอนที่ 173 โลกอยู่ในความสับสนวุ่นวาย
ตอนที่ 174 ความเร็วสูงสุดเป็นวิถีชีวิต
ตอนที่ 175 แก่นแท้ของคำอธิษฐานที่ชั่วร้าย
ตอนที่ 176 ความหวังที่พังทลาย
ตอนที่ 177 คำเชิญเปลวไฟนางฟ้า
ตอนที่ 178 กุญแจสู่พลังใหม่
ตอนที่ 179 คุณค่าที่แท้จริงของทองคำ
ตอนที่ 180 ถึงพระจันทร์ใจดี
กุลธิดาฐ์ อักษรนันทน์

| กุลธิดาฐ์ อักษรนันทน์ |
| --- | --- |
ชื่อเกิด: กุลธิดา อักษรนันทน์
เกิด: 16 กรกฎาคม พ.ศ. 2530 (37 ปี) กรุงเทพมหานคร ประเทศไทย
คู่สมรส: ตั้ม ปรัชญา (2564–ปัจจุบัน)
อาชีพ: นักร้อง นักแสดง พิธีกร ยูทูบเบอร์
ปีที่แสดง: พ.ศ. 2542–ปัจจุบัน
ผลงานเด่น: เดือนสิบ - กลิ้งไว้ก่อนพ่อสอนไว้ (2545)   น้ำ - รัก (ภาพยนตร์) (2555)  แม่พลอย - สี่แผ่นดิน เดอะมิวสิคัล (2557)
กุลธิดาฐ์ อักษรนันทน์ ชื่อเล่น จิ๊บ (เกิด 16 กรกฎาคม พ.ศ. 2530) เป็นนักแสดงและนักร้องชาวไทย
ประวัติ

กุลธิดาฐ์ อักษรนันทน์ หรือในอดีตเคยให้ชื่อในการแสดงว่า กุลธิดา อักษรนันทน์ และ เบญจณัฏฐ์ อักษรนันทน์ ตามลำดับ (ชื่อเล่น: นุ่น แต่ปัจจุบันใช้ชื่อเล่น จิ๊บ)เกิดเมื่อวันพฤหัสบดีที่ 16 เดือน กรกฎาคม พ.ศ. 2530 (ราศีกรกฎ) เข้าศึกษาระดับประถมที่โรงเรียนวัฒนพฤกษา, มัธยมศึกษาที่โรงเรียนปากเกร็ด จังหวัดนนทบุรี และสำเร็จการศึกษาระดับปริญญาตรีและปริญญาโท ในสาขาเดียวกันที่มหาวิทยาลัยธุรกิจบัณฑิตย์ คณะนิเทศศาสตร์ สาขากำกับการแสดง
ประวัติ > งานบันเทิง

จิ๊บ กุลธิดาฐ์ ก้าวเข้าวงการบันเทิงครั้งแรก ด้วยการเป็นนักร้องเพลง "หัวหมุน" ในชื่ออัลบั้ม มด-นุ่น-เนย (พ.ศ. 2542) ซึ่งประกอบไปด้วย มด (กัลยา จิรชัยศักดิ์เดชา), เนย (พิชชาภา พงษ์พยอม) และ จิ๊บ เบญจณัฏฐ์ ซึ่งตอนนั้นใช้ชื่อเดิม นุ่น (กุลธิดา อักษรนันทน์) จากนั้นก็มีผลงานโฆษณามาม่าหมูต้มยำ, มายมิ้นท์ จนทำให้เป็นจุดเริ่มต้นของผลงานด้านแสดง
ในบทบาทแรกของ จิ๊บ เบญจณัฎฐ์ รับบทเป็นท่านหญิงรัตนาวดี น้องสาวของท่านชายพจน์ หรือติ๊ก เจษฎาภรณ์ ในละครเรื่อง ปริศนา, กลิ้งไว้ก่อนพ่อสอนไว้ รับบทเป็น เดือนสิบ และจิ๊บ เบญจณัฎฐ์ ก็ได้มีละครตามมาอีกหลายเรื่อง คือ ต่างฟ้าตะวันเดียว รับบท คือพอ, ละครอภิมหึมามหาเศรษฐี รับบท ไฉไล บทบาทนางร้ายเป็นเรื่องแรก ในสังกัดของค่ายโพลัพลัส และได้รับบทเป็น มิ้งค์ (พยาบาลฝึกหัด) จากภาพยนตร์เรื่อง เพื่อนไม่เก่า (พ.ศ. 2554)
จิ๊บ เบญจณัฎฐ์ มีผลงานภาพยนตร์โฆษณาอีกครั้งกับโฆษณาของธนาคารกสิกรไทย รับบท สาวแบงค์ โดยในบทมีคำลงท้ายไว้ว่า ฝากด้วยนะคะ ทำให้เป็นที่จดจำ จนทำให้มีภาพยนตร์โฆษณาของธนาคารชิ้นที่สองตามมาภายใต้ชื่อว่า ฝากให้เราช่วยดูแล
จิ๊บ เบญจณัฎฐ์ ได้เข้าสู่การบทนางเอกอย่างเต็มตัวในบท ขวัญทิพย์ ภาพยนตร์เรื่อง บ้านผีปอบ Reformation (พ.ศ. 2554) และบท น้ำ นางเอกในภาพยนตร์เรื่อง "รัก" (พ.ศ. 2555) และบทบาท แม่พลอย ในละครเวทีเรื่องสี่แผ่นดิน เดอะมิวสิคัล เป็นละครเวทีแห่งกรุงรัตนโกสินทร์ในชื่อ สี่แผ่นดิน เดอะมิวสิคัล
ผลงาน > งานเพลง สตูดิโออัลบั้ม

| วางแผง | ชื่ออัลบั้ม | รายชื่อเพลงในอัลบั้ม |
| --- | --- | --- |
| 20 พฤศจิกายน 2542 | มด-นุ่น-เนย |  หัวหมุน  ฝันหวาน  เก็บไว้ให้เธอ(คนดี)  มาดีกันนะ  เอ๊ะ! ยังไง  เหงา  ห้ามใจ  ใต้ดาวดวงเดียวกัน  ฉันไม่แน่ใจ  แค่มีเธอคนเดียว  เพียงเท่านี้  รักยังคงงดงาม |
ผลงาน > งานเพลง

อัลบั้มเพลงประกอบละคร "สุดหัวใจ" ขับข้องเพลง chirpy chirpy cheep cheep, รักกันเถอะ (พ.ศ. 2542)
เพลง Low Sugar สังกัด โมโนมิวสิก (พ.ศ. 2557)
เพลง หากเกิดมาเพื่อคู่กัน สังกัด โมโนมิวสิก (พ.ศ. 2557)
ผลงาน > ผลงาน ภาพยนตร์

| ภาพยนตร์ |
| --- | --- | --- | --- |

| ปี พ.ศ. | เรื่อง | รับบทเป็น | หมายเหตุ |
| พ.ศ. 2554 | เพื่อนไม่เก่า | มิ้งค์ |  |
| พ.ศ. 2554 | บ้านผีปอบ (Reformation) | ขวัญทิพย์ | นางเอก |
|  พ.ศ. 2555 | รัก | น้ำ |  |
ผลงาน > ผลงาน ละครโทรทัศน์

| ปี พ> ศ. | เรื่อง | ออกอากาศ | รับบทเป็น | หมายเหตุ |
| --- | --- | --- | --- | --- |
| 2541 | ธรณีนี่นี้ใครครอง | ช่อง 3 | จิ๋วแจ๋ว |  |
| 2543 | ปริศนา | ช่อง 7 | ท่านหญิงรัตนาวดี |  |
| 2546 | กาเหว่าที่บางเพลง | ช่อง 3 |  |  |
| 2549 | ต่างฟ้าตะวันเดียว | ช่อง 3 | คือพอ |  |
| 2550 | อภิมหึมามหาเศรษฐี | ช่อง 7 | ไฉไล |  |
| 2558 | จัดรัก วิวาห์ลวง | ช่องวัน | นก |  |
| 2559 | สารวัตรเถื่อน | ช่อง 7 | พิลัย |  |
| 2560 | เรือนพะยอม | ช่อง 7 | กานดา |  |
| 2564 | ทางเสือผ่าน | ช่อง 7 | แม่พระเอก |  |
| 2565 | ครูมะ ห้อง ป.3 ก. | Thai PBS | ครูโชมพัสต์ |  |
| 2566 | สืบสวนสำนวนรัก | Thai PBS | บงกช (เจ๊) |  |
ผลงาน > ผลงานละครชุด

| ปี พ> ศ. | เรื่อง | ออกอากาศ | บทบาท | หมายเหตุ |
| --- | --- | --- | --- | --- |
| 2553 | เซน...สื่อรักสื่อวิญญาณ ตอน ชีวิตหนี้ | ช่อง 5 |  | รับเชิญ |
| 2559 | WAR OF HIGH SCHOOL THE SERIES สงครามไฮสคูล | ช่อง 9 | แม่ของพิมพ์มาดา (พิมพ์) (อดีตนางสาวไทย) | สมทบ |
| 2560 | Make It Right the Series รักออกเดิน ซีซั่น 2 | ไลน์ทีวี | แม่ของบุ๊ค | รับเชิญ |
| 2560 | โปรเจกต์ เอส เดอะซีรีส์ ตอน SOS Skate ซึม ซ่าส์ | จีเอ็มเอ็ม 25 | ครูประจำชั้นของบู | รับเชิญ |
| 2565 | Remember Me ความรักเขียนด้วยความรัก | อมรินทร์ทีวี | นิตยา |  |
ผลงาน > ซิทคอม

| ปี พ> ศ. | เรื่อง | ออกอากาศ | บทบาท | หมายเหตุ |
| --- | --- | --- | --- | --- |
| 2545 | กลิ้งไว้ก่อนพ่อสอนไว้ | ช่อง 7 | เดือนสิบ | (นักแสดงในรุ่นแรก) |
ผลงาน > ผลงาน ละครเวที

| ปี พ> ศ. | เรื่อง | สถานที่จัดการแสดง | บทบาท | หมายเหตุ |
| --- | --- | --- | --- | --- |
| 2556 | เลือดขัตติยา เดอะมิวสิคัล | - |  |  |
| 2557 | สี่แผ่นดิน เดอะมิวสิคัล | พลอย (วัยรุ่น) |  |  |
| 2558 | วันสละโสด กับ โจทก์เก่าๆ เดอะมิวสิคัล | - |  |  |
| 2559 | ลอดลายมังกร เดอะมิวสิคัล | มาลัย |  |  |
ผลงาน > ผลงาน พิธีกร

Honda Racing Fest 2007 (พิธีกรภาคสนาม)
รายการ INTER CLUB ทางช่อง U Channal
รายการ UNITED SUMMER SUMMER ทางช่อง U Channal
พิธีกร รายการ ขนมไทยอะไรเอ่ย ทางช่อง ทีวีไทย
รายการ ทางช่อง YouTube:Jaowjib
ขั้นตอนวิธีฮังกาเรียน

ขั้นตอนวิธีชาวฮังกาเรียน หรือ ฮังกาเรียนอัลกอริทึม (อังกฤษ: Hungarian Algorithm ) คือ ขั้นตอนวิธีการหาค่าเหมาะสมที่สุดเชิงการจัด ซึ่งใช้ในการแก้ ปัญหาการกำหนดงาน ถูกคิดค้นและตั้งชื่อโดย แฮโรลด์ วิลเลียม คุห์น ในปี ค.ศ. 1955 ที่ตั้งชื่อนี้เพราะว่าขั้นตอนวิธีนี้มีพื้นฐานส่วนใหญ่จากการคิดของนักคณิตศาสตร์ชาวฮังกาเรียน 2 คน คือ เดแนช เคอนิก (Dénes Kőnig) และ แยเนอ แอแกร์วารี (Jenő Egerváry) ต่อมาเจมส์ มุนเครสได้นำขั้นตอนวิธีนี้มาตรวจสอบในปี ค.ศ. 1957 และได้พบว่ามีประสิทธิภาพเชิงเวลาเป็นแบบ strongly polynomial ตั้งแต่นั้นมาขั้นตอนวิธีนี้จึงเป็นที่รู้จักในชือว่า ขั้นตอนวิธีคุห์น-มุนเครส หรือ ขั้นตอนวิธีการกำหนดงานมุนเครส โดยมีประสิทธิภาพเชิงเวลาของขั้นตอนวิธีดั้งเดิมเป็น  O(n^{4}) แต่อย่างไรก็ตามขั้นตอนวิธีนี้ แจ็ค เอดมันด์ และ ริชาร์ด แมนนิ่งคาร์ป ได้สามารถปรับปรุงให้มีประสิทธิภาพเชิงเวลาเป็น  O(n^{3}) ได้ และในปี ค.ศ. 2006 มีการค้นพบว่า คาร์ล กุสตาฟ จาโคบี (Carl Gustav Jacobi) สามารถแก้ปัญหาการกำหนดงานได้ในคริสต์ศตวรรษที่ 19 และได้เผยแพร่ในปี ค.ศ. 1890 ในภาษาละติน
ปัญหาการกำหนดงาน

ขั้นตอนวิธีฮังกาเรียนนี้ใช้แก้ปัญหาการกำหนดงาน ซึ่งเป็นปัญหาชนิดพิเศษของปัญหากำหนดการเชิงเส้นอีกลักษณะหนึ่ง มีรูปแบบคล้ายคลึงกับปัญหาการขนส่ง โดยปัญหาการกำหนดงานจะมีลักษณะดังนี้
จำนวนงานและจำนวนคนงานเท่ากัน ในกรณีที่ไม่เท่าจะต้องเพิ่มงานหรือคนงานสมมติแล้วแต่ว่าส่วนใดขาดหายไปและให้ต้นทุนการกำหนดงานมากที่สุด
คนงานจะทำงานได้เพียง 1 งาน
งานแต่ละงานจะมีคนรับผิดชอบเพียงคนเดียว
มีต้นทุนการกำหนดงาน  j ให้  i ทำเป็น  C_{ij} ซึ่งมีเป้าหมายของการกำหนดงานคือการทำให้เกิดต้นทุนน้อยที่สุด หรือเราสามารถดัดแปลงให้หาค่าต้นทุนมากที่สุดได้
ยกตัวอย่างเช่น สมมติให้มีคนงาน 3 คน คือ สมชาย สมหญิง และสมคิด แล้วมีงาน 3 งานคือ ล้างห้องน้ำ ถูพื้น และเช็ดกระจก เราจะกำหนดงานให้แต่ละคนอย่างไรจึงจะเกิดต้นทุนน้อยที่สุด โดยจะแทนต้นทุนการกำหนดต่างๆด้วยเมทริกซ์ ดังนี้
| 0 | 1 | 2 | 3 |
| --- | --- | --- | --- |
|  | ล้างห้องน้ำ | ถูพื้น | เช็ดกระจก |
| สมชาย | 100 | 200 | 300 |
สมหญิง: 300
| สมคิด | 300 | 300 | 200 |
เมื่อเราใช้ขั้นตอนวิธีฮังกาเรียนแล้วจะได้ผลลัพธ์การกำหนดงานให้คนงานแต่ละคน ซึ่งจะเกิดต้นทุนน้อยที่สุดดังนี้ สมชายล้างห้องน้ำ สมหญิงถูพื้น สมคิดเช็ดกระจก
อธิบายขั้นตอนวิธี

ขั้นตอนวิธีนี้จะต้องมีจำนวนงานและคนงานเท่ากัน หากมีอย่างใดอย่างหนึ่งน้อยกว่าแล้ว เราจำเป็นต้องเพิ่มตัวลวงเข้าไปให้มีจำนวนที่เท่ากัน โดยต้นทุนของตัวลวงนี้จะมีค่าเป็นต้นทุนที่มากที่สุดในตาราง
หากเราไม่ต้องการหาต้นทุนน้อยสุด แต่ต้องการหาต้นทุนมากสุดเราสามารถทำได้โดย แก้ไขตารางต้นทุนในแต่ละช่องโดยสมมติให้ MAX คือค่าที่มากที่สุดในตาราง สมาชิกช่องที่ i,j จะมีค่าใหม่เป็น (MAX - สมาชิกข่องที่ i,j)
เมื่อเรามีตารางต้นทุนของการทำงานทุกงานของทุกคนงานแล้วเราจะมาทำตามลำดับขั้นตอนดังนี้
เราจะหาค่าที่น้อยสุดในแต่ละแถวแล้วนำมาลบกับทุกๆสมาชิกในแต่ละแถวนั้นๆ ดังนั้นจะได้ตารางใหม่ที่มีสมาชิกในแต่ละแถวมีค่าเป็น 0 อย่างน้อย 1 ตัว
ต่อจากนั้นเราจะทำแบบเดียวกับขั้นตอนที่ 1 ในทุกๆคอลัมน์ คือหาค่าที่น้อยที่สุดในแต่ละคอลัมน์แล้วนำมาลบกับสมาชิกทุกตัวในคอลัมน์นั้นๆ
หากเรากำหนดงานให้คนงานได้โดยใช้เลข 0 เป็นตัวบอกว่าคนงานใดทำงานใดได้บ้างถึงจะต้นทุนน้อยสุด แล้วสามารถกำหนดงานให้ได้โดยไม่ซ้ำกันแล้ว แสดงว่าเราได้คำตอบอันเป็นที่ต้องการแล้ว ซึ่งอาจจะมีคำตอบได้หลายแบบ แต่ถ้าหากยังไม่สามารถกำหนดงานให้ได้โดยไม่ซ้ำกัน เราต้องขีดเส้นในแถวหรือคอลัมน์ใดๆให้ผ่าน 0 ครบทุกตัว โดยใช้จำนวนเส้นน้อยที่สุด ดังนี้
ให้เราเลือกแถวที่สามารถกำหนดงานให้ได้โดยไม่ซ้ำกันเท่าที่เป็นไปได้
จากนั้นเราจะดูแถวที่ไม่ได้เลือกไว้ และให้ทำสัญลักษณ์ที่แถวนั้น
เราจะดูว่ามีค่า 0 อยู่ในคอลัมน์ใดบ้างในแถวที่เราทำสัญลักษณ์ แล้วเราจะทำสัญลักษณ์ที่คอลัมน์นั้น
ดูที่คอลัมน์ที่ทำสัญลักษณ์ไว้ หากแถวใดมี 0 ก็ทำสัญลักษณ์ที่แถวนั้นด้วย
วนทำจนไม่สามารถทำสัญลักษณ์ได้
ให้เราขีดเส้นในคอลัมน์ที่สัญลักษณ์ และขีดเส้นแถวที่ไม่ได้ทำสัญลักษณ์ จะได้จำนวนเส้นน้อยสุด (หากว่าได้จำนวนเส้นเท่ากับจำนวนงานแล้วแสดงว่าเราได้คำตอบที่ต้องการแล้ว ให้ข้ามไปยังขั้นตอน 5)
เราจะหาสมาชิกในช่องที่ไม่ได้ถูกขีดเส้นและมีค่าน้อยสุด นำไปลบกับสมาชิกทุกตัวที่ไม่ได้ถูกขีดเส้น และนำไปบวกับสมาชิกทุกตัวที่ถูกขีดทับสองเส้น และทำตามขั้นตอนที่ 3-4 ใหม่ จนสามารถกำหนดงานได้โดยไม่ซ้ำกันแล้วจึงไปยังขั้นตอนที่ 5
เมื่อเราได้ตารางที่สามารถขีดเส้นผ่าน 0 ครบทุกตัวโดยใช้จำนวนเส้นเท่ากับจำนวนงานแล้ว หมายความว่าเราได้ตารางซึ่งเป็นคำตอบแล้วคือสามารถกำหนดงานให้คนงานโดยไม่ซ้ำกันและมีต้นทุนน้อยสุด โดยดูว่าช่องใดเป็น 0 ก็คือให้คนงานทำงานนั้นได้ ซึ่งอาจมีคำตอบได้มากกว่า 1 แบบ
ตัวอย่างการใช้ขั้นตอนวิธี

ตัวอย่างการทำขั้นตอนวิธีฮังกาเรียน สมมติให้มีคนงาน ก ข ค ง แ และมี งาน ๑ ๒ ๓ ๔ โดยมีตารางต้นทุนดังนี้
|  | 1 | 2 | 3 | 4 | 5 |
| --- | --- | --- | --- | --- | --- |
| A | 8 | 11 | 15 | 10 | 13 |
| B | 9 | 12 | 13 | 11 | 10 |
| C | 10 | 13 | 14 | 11 | 12 |
| D | 9 | 14 | 13 | 10 | 11 |
| E | 8 | 11 | 15 | 12 | 10 |
โดยต่อไปจะขอละตัวระบุคนงานและตัวระบุงานซึ่งยังมีลำดับเหมือนตารางข้างต้น
1. หาค่าน้อยสุดในแต่ละแถวแล้วนำมาลบออกจากสมาชิกทุกๆตัวในแถว จะได้ตารางใหม่เป็น
| 0 | 1 | 2 | 3 | 4 |
| --- | --- | --- | --- | --- |

|  | 5 | 0 | 2 | 3 |
|  | 6 | 12 | 4 | 0 |
|  | 2 | 4 | 0 | 9 |
|  | 5 | 1 | 3 | 0 |
2. จากนั้นหาค่าน้อยสุดในแต่ละคอลัมน์แล้วนำมาลบออกจากสมาชิกทุกๆตัวในคอลัมน์ จะได้ตารางใหม่เป็น
| 0 | 1 | 2 | 3 | 4 |
| --- | --- | --- | --- | --- |

|  | 3 | 0 | 2 | 3 |
|  | 4 | 12 | 4 | 0 |
|  | 0 | 4 | 0 | 9 |
|  | 3 | 1 | 3 | 0 |
3. แล้วเรายังไม่สามารถจัดงานให้คนงานให้มีต้นทุนน้อยสุดโดยไม่ซ้ำกันได้ จึงต้องทำขั้นต่อไป
| 0 | 1 | 2 | 3 | 4 |
| --- | --- | --- | --- | --- |

|  | 3 | 0 | 2 | 3 |
|  | 4 | 12 | 4 | 0 |
|  | 0 | 4 | 0 | 9 |
|  | 3 | 1 | 3 | 0 |
4. เลือกแถวที่สามารถกำหนดงานโดยไม่ซ้ำกันเท่าที่เป็นไปได้ คือแถว 1 2 และ 3
| 0 | 1 | 2 | 3 | 4 |
| --- | --- | --- | --- | --- |

| → | 3 | 0 | 2 | 3 |
| → | 4 | 12 | 4 | 0 |
| → | 0 | 4 | 0 | 9 |
|  | 3 | 1 | 3 | 0 |
5. แล้วทำสัญลักษณ์ที่แถวที่ไม่ได้เลือกไว้ คือแถวที่ 4 แล้วทำสัญลักษณ์ที่คอลัมน์ 4 ที่มีค่า 0 อยู่ จากนั้นดูที่คอลัมน์ 4 พบว่ามี 0 อยู่แถวที่ 2 จึงทำสัญลักษณ์ในแถวที่ 2 แล้วไม่มีค่า 0 ที่คอลัมน์อื่น จึงไปทำขั้นต่อไป
| 0 | 1 | 2 | 3 | 4 |
| --- | --- | --- | --- | --- |
|  |  |  |  | × |
|  | 3 | 0 | 2 | 3 |
| × | 4 | 12 | 4 | 0 |
|  | 0 | 4 | 0 | 9 |
| × | 3 | 1 | 3 | 0 |
6. จากนั้นขีดเส้นให้เราขีดเส้นในคอลัมน์ที่สัญลักษณ์ และขีดเส้นแถวที่ไม่ได้ทำสัญลักษณ์
| 0 | 1 | 2 | 3 | 4 |
| --- | --- | --- | --- | --- |
|  |  |  |  | × |
|  | 3 | 0 | 2 | 3 |
| × | 4 | 12 | 4 | 0 |
|  | 0 | 4 | 0 | 9 |
| × | 3 | 1 | 3 | 0 |
7. จะใช้สมาชิกในช่องที่ไม่ได้ถูกขีดเส้นและมีค่าน้อยสุด คือค่า 1 ลบออกจากสมาชิกทุกตัวที่ไม่ถูกขีดเส้นและ นำไปบวกเข้ากับสมาชิกที่ถูกขีดเส้นสองครั้ง
| 0 | 1 | 2 | 3 | 4 |
| --- | --- | --- | --- | --- |
|  |  |  |  | × |
|  | 3 | 0 | 2 | 4 |
| × | 3 | 11 | 3 | 0 |
|  | 0 | 4 | 0 | 10 |
| × | 2 | 0 | 2 | 0 |
8. จากนั้นจะวนทำจนสามารถกำหนดงานได้โดยไม่ซ้ำ จึงได้ตารางดังนี้ เป็นตารางที่สามารถกำหนดงานให้คนงานได้โดยไม่ซ้ำกันและจะใช้ต้นทุนน้อยที่สุดด้วย โดยค่า 0 บอกถึงว่าคนงานต้องทำงานนั้นๆ หากมีหลายตัวคือทำสามารถได้หลายงาน ทำให้อาจจะมีคำตอบออกมาได้หลายแบบ
| 0 | 1 | 2 | 3 | 4 |
| --- | --- | --- | --- | --- |

|  | 1 | 0 | 0 | 4 |
|  | 1 | 11 | 1 | 0 |
|  | 0 | 6 | 0 | 12 |
: 0
และจากตารางจะได้คำตอบทั้งหมด 3 แบบ ดังนี้
| 0 | 1 | 2 | 3 | 4 | 5 |
| --- | --- | --- | --- | --- | --- |
| ผลเฉลยที่ 1 | ผลเฉลยที่ 1 | ผลเฉลยที่ 2 | ผลเฉลยที่ 2 | ผลเฉลยที่ 3 | ผลเฉลยที่ 3 |
| กำหนดงาน | ต้นทุน | กำหนดงาน | ต้นทุน | กำหนดงาน | ต้นทุน |
| ก → ๒ | 27 | ก → ๒ | 27 | ก → ๓ | 29 |
| ข → ๔ | 22 | ข → ๔ | 22 | ข → ๔ | 22 |
| ค → ๑ | 22 | ค → ๓ | 20 | ค → ๑ | 22 |
| ง → ๓ | 29 | ง → ๑ | 31 | ง → ๒ | 27 |
| รวม | 100 | รวม | 100 | รวม | 100 |
รหัสเทียม

สำหรับทุกๆแถวของตาราง
  หาค่าที่น้อยสุดในแถวแล้วไปลบออกจากสมาชิกในแถวทุกตัว
สำหรับทุกๆคอลัมน์ของตาราง
  หาค่าที่น้อยสุดในคอลัมน์แล้วไปลบออกจากสมาชิกในคอลัมน์ทุกตัว
ตราบเท่าที่ จำนวนคนงานที่กำหนดงานให้ได้โดยไม่ซ้ำกัน < จำนวนงาน {
  ลากเส้นผ่าน 0 ทุกตัวโดยใช้เส้นน้อยสุด
  หาค่าที่น้อยที่สุดที่ไม่ถูกลากเส้นผ่านนำไปลบกับสมาชิกทุกตัวที่ไม่ถูกลากเส้นผ่าน และไปบวกกับสมาชิกทุกตัวที่ถูกลากเส้นผ่าน 2 เส้น
 }
ฟังก์ชัน หาจำนวนคนงานที่กำหนดงานได้โดยไม่ซ้ำกัน ให้ n คือ จำนวนงาน, count คือ ตัวนับจำนวนคนงานที่สามารถกำหนดงานให้ได้โดยไม่ซ้ำ {
  แถวข้อมูลกำหนดงาน[n] = -1
  แถวกำกับ[n] = 0
  คอลัมน์กำกับ[n] = 0
  สำหรับทุกๆคนงาน i = 0 to n -1
    สำหรับทุกๆงาน j = 0 to n -1
        ถ้า ตาราง[i][j] เท่ากับ 0  และ แถวกำกับ[i] กับ คอลัมน์กำกับ[j] ไม่เท่ากับ 1 {
              แถวข้อมูลกำหนดงาน[i] = j (คนงาน i ทำงาน j)
              แถวกำกับ[i] = แถวกำกับ[j] = 1
              count++
        }
 ถ้า count  ไม่เท่ากับจำนวนงาน คืนค่า count
 หรือถ้า count เท่ากับจำนวนงานแล้ว คืน แถวข้อมูลกำหนดงาน
}
ฟังก์ชัน ลากเส้นผ่าน 0 ทุกตัวโดยใช้จำนวนเส้นน้อยสุด คืนค่าเป็นรายการของแถวและคอลัมน์ที่ลากเส้นผ่าน {
  เลือกแถวที่ไม่สามารถกำหนดงานให้ได้โดยไม่ซ้ำทำสัญลักษณ์ไว้
  ตราบเท่าที่ ยังสามารถทำสัญลักษณ์ที่แถวหรือคอลัมน์ใดๆได้ {
     ทำสัญลักษณ์ที่คอลัมน์ที่มีค่า 0 ในแถวที่ทำสัญลักษณ์ไว้
     ที่คอลัมน์ที่ทำสัญลักษณ์ไว้ หากแถวใดมี 0 ก็ทำสัญลักษณ์ที่แถวนั้นด้วย
  }
  ลากเส้นคอลัมน์ที่ทำสัญลักษณ์ และแถวที่ไม่ได้ทำสัญลักษณ์
  คืนรายการของแถวและคอลัมน์ที่ลากเส้นผ่าน
}
วิเคราะห์ประสิทธิภาพเชิงเวลา

ขั้นตอนวิธีนี้มีขั้นตอนย่อยๆหลายขั้นตอน
การลบสมาชิกทุกตัวด้วยสมาชิกที่มีค่าน้อยสุดในแต่ละแถวและคอลัมน์จะใช้เวลา  \Theta (n^{2})
แล้วฟังก์ชันหาจำนวนคนงานที่กำหนดงานได้ก็ใช้เวลา  \Theta (n^{2})
การลากเส้นผ่าน 0 ทุกตัวโดยใช้เส้นโดยที่สุดนั้นจะใช้เวลา  O(n^{2}) โดยจะทำเป็นจำนวนอย่างมากไม่เกินจำนวนงานครั้ง ทำให้ในวงวนนี้ใช้เวลา  O(n^{3})
ดังนั้นสรุปแล้วประสิทธิภาพโดยรวมของขั้นตอนวิธีนี้เป็น  O(n^{3})
แหล่งข้อมูลอื่น

Mordecai J. Golin, Bipartite Matching and the Hungarian Method, Course Notes, Hong Kong University of Science and Technology.
R. A. Pilgrim, Munkres' Assignment Algorithm. Modified for Rectangular Matrices เก็บถาวร 2007-03-27 ที่ เวย์แบ็กแมชชีน, Course notes, Murray State University.
Mike Dawes, The Optimal Assignment Problem เก็บถาวร 2006-08-12 ที่ เวย์แบ็กแมชชีน, Course notes, University of Western Ontario.
On Kuhn's Hungarian Method – A tribute from Hungary เก็บถาวร 2017-08-09 ที่ เวย์แบ็กแมชชีน, András Frank, Egervary Research Group, Pazmany P. setany 1/C, H1117, Budapest, Hungary.