**ขั้นตอนวิธีซิมเพล็กซ์** (อังกฤษ: simplex algorithm) หรือ **วิธีซิมเพล็กซ์** (อังกฤษ: simplex method) จะอาศัยหลักการของเมทริกซ์เข้าช่วยในการหาผลลัพธ์ที่เหมาะสมที่สุด ซึ่งจะทำให้เห็นถึงการเปลี่ยนแปลงของตัวแปรในแต่ละขั้นตอนอย่างมีเหตุผล และเปลี่ยนแปลงไปในทางที่จะนำมาซึ่งผลลัพธ์ที่โมเดลทางคณิตศาสตร์ต้องการ

บทนำ
----

การแก้ปัญหาโปรแกรมเชิงเส้น หรือ กำหนดการเชิงเส้น (Linear programming) สำหรับโมเดลคณิตศาสตร์ที่มีตัวแปรไม่มาก เราก็สามารถหาคำตอบได้ไม่ยากนัก แต่หากตัวแปรมีมากขึ้น ก็จำเป็นต้องหาวิธีการอื่นเข้ามาช่วยในการหาคำตอบของโมเดล ซึ่งวิธีซิมเพล็กซ์เป็นวิธีการหนึ่งที่ให้ผลดี และเข้าใจได้ง่าย

ขั้นตอนวิธีซิมเพล็กซ์ เป็นวีธีการของ จอร์จ แดนท์ซิก (George Dantzig) ที่ได้รับความนิยมอย่างมากในการแก้ปัญหาโปรแกรมเชิงเส้น ซึ่งชื่อของขั้นตอนวิธีนี้ มาจากแนวคิดของ ซิมเพล็กซ์ นั่นเอง

วิธีซิมเพล็กซ์เป็นวิธีที่มีประสิทธิภาพมากในการแก้ปัญหากำหนดการเชิงเส้น (Linear programming) ซึ่งเป็นกระบวนการทางพีชคณิตที่ประกอบด้วยการกระทำซ้ำ ๆ กันเพื่อให้ได้คำตอบที่ดีที่สุด ยกตัวอย่างเช่น

 *ค่าที่มากที่สุดของ* {\displaystyle Z=3x\_{1}+2x\_{2}}

 *ภายใต้เงื่อนไข*

{\displaystyle {\begin{aligned}4x\_{1}+2x\_{2}&\leq 16\\x\_{1}+2x\_{2}&\leq 8\\x\_{1}+x\_{2}&\leq 5\\x\_{1}\geq 0,x\_{2}&\geq 0\end{aligned}}}
ปัญหาในลักษณะเช่นนี้จะสามารถใช้วิธีซิมเพล็กซ์ในการหาคำตอบได้ โดยจำเป็นจะต้องเปลี่ยนปัญหาที่กำหนดให้อยู่ในรูปมาตรฐาน (Standard Form) โดยจะต้องแปลงอสมการของปัญหาให้เป็นสมการ ซึ่งจะมีการเพิ่มตัวแปรเข้าไปในแต่ละอสมการเรียกว่าตัวแปรแบบ Slack หรือ Surplus ดังนั้น เราจะเขียนตัวอย่างข้างต้นได้ใหม่เป็น

 *ค่าที่มากที่สุดของ* {\displaystyle Z=3x\_{1}+2x\_{2}}

 *ภายใต้เงื่อนไข*

{\displaystyle {\begin{aligned}4x\_{1}+2x\_{2}+s\_{1}&\leq 16\\x\_{1}+2x\_{2}+s\_{2}&\leq 8\\x\_{1}+x\_{2}+s\_{3}&\leq 5\\x\_{1}\geq 0,x\_{2}\geq 0,s\_{1}\geq 0,s\_{2}\geq 0,s\_{3}&\geq 0\end{aligned}}}

รูปมาตรฐาน
----------

การจะแปลงกำหนดการเชิงเส้นให้อยู่ในรูปแบบมาตรฐาน สามารถทำได้โดยการแปลง อสมการที่มีเครื่องหมาย {\displaystyle \geq ,\leq } ให้อยู่ในรูปของสมการ ซึ่งเราจะเพิ่มตัวแปรเข้าไปในสมการที่มีค่ามากกว่าหรือเท่ากับ 0 และย้ายตัวแปรทั้งหมดไว้ด้านขวา ส่วนตัวเลขที่เหลือไว้ด้านซ้าย ซึ่งรูปมาตรฐานจะอยู่ในรูป

 *ค่าที่มากที่สุดของ* {\displaystyle Z=c\_{1}x\_{1}+c\_{2}x\_{2}+\cdots +c\_{n}x\_{n}}

 *ภายใต้เงื่อนไข*

{\displaystyle {\begin{aligned}a\_{11}x\_{1}+a\_{12}x\_{2}+\cdots +a\_{1n}x\_{n}&\leq b\_{1}\\a\_{21}x\_{1}+a\_{22}x\_{2}+\cdots +a\_{2n}x\_{n}&\leq b\_{2}\\&\ \ \vdots \\a\_{n1}x\_{1}+a\_{n2}x\_{2}+\cdots +a\_{nn}x\_{n}&\leq b\_{n}\\x\_{1}\geq 0,x\_{2}\geq 0,\ldots ,x\_{n}&\geq 0\end{aligned}}}
จากรูปแบบโมเดลคณิตศาสตร์ของโปรแกรมเชิงเส้น

 *ค่าที่มากที่สุดของ* {\displaystyle Z=c\_{1}x\_{1}+c\_{2}x\_{2}+c\_{3}x\_{3}}

 *ภายใต้เงื่อนไข*

{\displaystyle {\begin{aligned}a\_{11}x\_{1}+a\_{12}x\_{2}+a\_{13}x\_{3}&\leq b\_{1}\\a\_{21}x\_{1}+a\_{22}x\_{2}+a\_{23}x\_{3}&\leq b\_{2}\\a\_{31}x\_{1}+a\_{32}x\_{2}+a\_{33}x\_{3}&\leq b\_{3}\\x\_{1}\geq 0,x\_{2}\geq 0,x\_{3}&\geq 0\end{aligned}}}
เขียนสมการเพื่อเพิ่มเติมตัวแปรช่วย ได้ดังนี้

{\displaystyle {\begin{aligned}Z-c\_{1}x\_{1}-c\_{2}x\_{2}-c\_{3}x\_{3}&=0\\a\_{11}x\_{1}+a\_{12}x\_{2}+a\_{13}x\_{3}+x\_{4}&\leq b\_{1}\\a\_{21}x\_{1}+a\_{22}x\_{2}+a\_{23}x\_{3}+x\_{5}&\leq b\_{2}\\a\_{31}x\_{1}+a\_{32}x\_{2}+a\_{33}x\_{3}+x\_{6}&\leq b\_{3}\\x\_{1}\geq 0,x\_{2}\geq 0,x\_{3}\geq 0,x\_{4}\geq 0,x\_{5}\geq 0,x\_{6}&\geq 0\end{aligned}}}
### ตัวแปรที่เพิ่มเข้ามา

* **ตัวแปรแบบ Slack**

ในอสมการที่มี {\displaystyle \leq } โดยทางซ้ายเป็นการดำเนินการของตัวแปร และทางขวาเป็นค่าตัวเลขตัวหนึ่ง เราสามารถเพิ่มตัวแปรแบบ Slack เข้าไปทางซ้ายได้เพื่อเป็นตัวแทนเพิ่มค่าให้เท่ากับค่าทางขวา เช่น

 *จากข้อจำกัด* {\displaystyle 7x\_{1}+34x\_{2}\leq 125}  *สามารถเขียนเป็น* {\displaystyle 7x\_{1}+34x\_{2}+x\_{3}=125} เมื่อ {\displaystyle x\_{3}\geq 0}

* **ตัวแปรแบบ Surplus**

ในอสมการที่มี {\displaystyle \geq } โดยทางซ้ายเป็นการดำเนินการของตัวแปร และทางขวาเป็นค่าตัวเลขตัวหนึ่ง เราสามารถเพิ่มตัวแปรแบบ Surplus เข้าไปทางซ้ายได้เพื่อเป็นตัวแทนลดค่าให้เท่ากับค่าทางขวา เช่น

 *จากข้อจำกัด* {\displaystyle 7x\_{1}+34x\_{2}\geq 125}  *สามารถเขียนเป็น* {\displaystyle 7x\_{1}+34x\_{2}-x\_{3}=125} เมื่อ {\displaystyle x\_{3}\geq 0}

ขั้นตอนวิธี
-----------

วิธีการต่อไปนี้จะเป็นการดำเนินการตามขั้นตอนวิธีซิมเพล็กซ์ เพื่อหาผลเฉลยที่มีค่ามากที่สุด แต่หากต้องการหาผลเฉลยที่มีค่าน้อยสุดสามารถทำได้โดย ค่าน้อยสุดของ {\displaystyle Z=-(} ค่ามากสุดของ {\displaystyle -Z)}

### วิธีการ

1. จัดรูป กำหนดการเชิงเส้น ให้อยู่ในรูปมาตรฐาน

2. สร้างตารางซิมเพล็กซ์ดังนี้

|  | {\displaystyle Z} | {\displaystyle x\_{1}} | {\displaystyle x\_{2}} | {\displaystyle x\_{3}} | {\displaystyle x\_{4}} | {\displaystyle x\_{5}} | {\displaystyle x\_{6}} | {\displaystyle b} |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle Z} | {\displaystyle 1} | {\displaystyle -c\_{1}} | {\displaystyle -c\_{2}} | {\displaystyle -c\_{3}} | {\displaystyle 0} | {\displaystyle 0} | {\displaystyle 0} | {\displaystyle 0} |
| {\displaystyle x\_{4}} | {\displaystyle 0} | {\displaystyle a\_{11}} | {\displaystyle a\_{12}} | {\displaystyle a\_{13}} | {\displaystyle 1} | {\displaystyle 0} | {\displaystyle 0} | {\displaystyle b\_{1}} |
| {\displaystyle x\_{5}} | {\displaystyle 0} | {\displaystyle a\_{21}} | {\displaystyle a\_{22}} | {\displaystyle a\_{23}} | {\displaystyle 0} | {\displaystyle 1} | {\displaystyle 0} | {\displaystyle b\_{2}} |
| {\displaystyle x\_{6}} | {\displaystyle 0} | {\displaystyle a\_{31}} | {\displaystyle a\_{32}} | {\displaystyle a\_{33}} | {\displaystyle 0} | {\displaystyle 0} | {\displaystyle 1} | {\displaystyle b\_{3}} |

3. เลือกตัวแปรขาเข้า (entering variable) คือการเลือกตัวแปรที่ไม่เป็นตัวแปรมูลฐาน (non-basic variable) ให้เป็นตัวแปรมูลฐาน (basic variable) โดยดูจากสัมประสิทธิ์ของตัวแปรในสมการเป้าหมาย (แถว Z) ที่ติดลบมากที่สุด แต่ถ้าสัมประสิทธิ์ของตัวแปรทุกตัวเป็นบวกหรือศูนย์แล้ว แสดงว่าถึงจุดที่เหมาะสม (optimal solution) ไม่ต้องทำต่อไปอีก

4. เลือกตัวแปรขาออก (leaving variable) ด้วยการหาอัตราส่วนของค่าผลลัพธ์กับสัมประสิทธิ์ของตัวแปรเข้าที่เลือกไว้ในขั้นที่ 3 (ไม่ต้องคำนึงถึงสัมประสิทธิ์ที่เป็นลบหรือศูนย์) เลือกอัตราส่วนต่ำสุดของตัวแปรมูลฐาน อยู่ที่ตัวใดแสดงว่าตัวนั้นจะเป็นตัวแปรออก

5. เปลี่ยนตัวแปรมูลฐาน ด้วยการแลกที่กันระหว่างตัวแปรขาเข้าและตัวแปรขาออก ด้วยการคำนวณโดยใช้การดำเนินการตามแถว (row operation)

6. ให้กลับไปทำขั้นที่ 3 - 5 ต่อไปเรื่อย ๆ จนกระทั่งถึงจุดที่เหมาะสมแล้ว

### ตัวอย่าง

*ค่ามากที่สุด* {\displaystyle Z=6x\_{1}+4x\_{2}}

*จากข้อจำกัด*

{\displaystyle {\begin{aligned}2x\_{1}+3x\_{2}&\leq 100\\4x\_{1}+2x\_{2}&\leq 120\\x\_{1},x\_{2}&\geq 0\end{aligned}}}
สามารถเขียนเป็นรูปแบบมาตรฐานได้ดังนี้

*ค่ามากที่สุด* {\displaystyle Z-6x\_{1}-4x\_{2}=0}

*จากข้อจำกัด*

{\displaystyle {\begin{aligned}2x\_{1}+3x\_{2}+x\_{3}&\leq 100\\4x\_{1}+2x\_{2}+x\_{4}&\leq 120\\x\_{1},x\_{2},x\_{3},x\_{4}&\geq 0\end{aligned}}}
นำรูปแบบมาตรฐานที่ได้ไปสร้างตารางซิมเพล็กซ์ ได้ดังนี้


|  | {\displaystyle Z} | {\displaystyle x\_{1}} | {\displaystyle x\_{2}} | {\displaystyle x\_{3}} | {\displaystyle x\_{4}} | {\displaystyle b} |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle Z} | {\displaystyle 1} | {\displaystyle -6} | {\displaystyle -4} | {\displaystyle 0} | {\displaystyle 0} | {\displaystyle 0} |
| {\displaystyle x\_{3}} | {\displaystyle 0} | {\displaystyle 2} | {\displaystyle 3} | {\displaystyle 1} | {\displaystyle 0} | {\displaystyle 100} |
| {\displaystyle x\_{4}} | {\displaystyle 0} | {\displaystyle 4} | {\displaystyle 2} | {\displaystyle 0} | {\displaystyle 1} | {\displaystyle 120} |

พิจารณาแถวแรก {\displaystyle Z} ค่าสัมประสิทธิ์ที่มีค่าน้อยสุด คือ {\displaystyle -6} จึงเลือก {\displaystyle x\_{1}} เป็นตัวแปรขาเข้า จากนั้นพิจารณาอัตราส่วนของค่า {\displaystyle b} กับสัมประสิทธิ์ของตัวแปรขาเข้า จะได้ว่า แถวที่ {\displaystyle x\_{3}} มีอัตราส่วนเป็น {\displaystyle {\frac {100}{2}}=50} และแถวที่ {\displaystyle x\_{4}} มีอัตราส่วนเป็น {\displaystyle {\frac {120}{4}}=30} ดังนั้นจึงเลือก {\displaystyle x\_{4}} เป็นตัวแปรขาออก

เปลี่ยนให้ {\displaystyle x\_{1}} เป็นตัวแปรมูลฐาน โดยแลกที่กับ {\displaystyle x\_{4}} ด้วยวิธีการดำเนินการตามแถว จะได้ตารางซิมเพล็กซ์ ดังนี้

{\displaystyle {\begin{aligned}R\_{3}&:={\frac {1}{4}}R\_{3}\\R\_{2}&:=-2R\_{3}+R\_{2}\\R\_{1}&:=6R\_{3}+R\_{1}\end{aligned}}}

|  | {\displaystyle Z} | {\displaystyle x\_{1}} | {\displaystyle x\_{2}} | {\displaystyle x\_{3}} | {\displaystyle x\_{4}} | {\displaystyle b} |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle Z} | {\displaystyle 1} | {\displaystyle 0} | {\displaystyle -1} | {\displaystyle 0} | {\displaystyle {\frac {3}{2}}} | {\displaystyle 180} |
| {\displaystyle x\_{3}} | {\displaystyle 0} | {\displaystyle 0} | {\displaystyle 2} | {\displaystyle 1} | {\displaystyle -{\frac {1}{2}}} | {\displaystyle 40} |
| {\displaystyle x\_{1}} | {\displaystyle 0} | {\displaystyle 1} | {\displaystyle {\frac {1}{2}}} | {\displaystyle 0} | {\displaystyle {\frac {1}{4}}} | {\displaystyle 30} |

พิจารณาแถวแรก {\displaystyle Z} ค่าสัมประสิทธิ์ที่มีค่าน้อยสุด คือ {\displaystyle -1} จึงเลือก {\displaystyle x\_{2}} เป็นตัวแปรขาเข้า จากนั้นพิจารณาอัตราส่วนของค่า {\displaystyle b} กับสัมประสิทธิ์ของตัวแปรขาเข้า จะได้ว่า แถวที่ {\displaystyle x\_{3}} มีอัตราส่วนเป็น {\displaystyle {\frac {40}{2}}=20} และแถวที่ {\displaystyle x\_{1}} มีอัตราส่วนเป็น {\displaystyle {\frac {30}{1/2}}=60} ดังนั้นจึงเลือก {\displaystyle x\_{3}} เป็นตัวแปรขาออก

เปลี่ยนให้ {\displaystyle x\_{2}} เป็นตัวแปรมูลฐาน โดยแลกที่กับ {\displaystyle x\_{3}} ด้วยวิธีการดำเนินการตามแถว จะได้ตารางซิมเพล็กซ์ ดังนี้

{\displaystyle {\begin{aligned}R\_{2}&:={\frac {1}{2}}R\_{2}\\R\_{3}&:=-{\frac {1}{2}}R\_{2}+R\_{3}\\R\_{1}&:=R\_{2}+R\_{1}\end{aligned}}}

|  | {\displaystyle Z} | {\displaystyle x\_{1}} | {\displaystyle x\_{2}} | {\displaystyle x\_{3}} | {\displaystyle x\_{4}} | {\displaystyle b} |
| --- | --- | --- | --- | --- | --- | --- |
| {\displaystyle Z} | {\displaystyle 1} | {\displaystyle 0} | {\displaystyle 0} | {\displaystyle {\frac {1}{2}}} | {\displaystyle {\frac {5}{4}}} | {\displaystyle 200} |
| {\displaystyle x\_{2}} | {\displaystyle 0} | {\displaystyle 0} | {\displaystyle 1} | {\displaystyle {\frac {1}{2}}} | {\displaystyle -{\frac {1}{4}}} | {\displaystyle 20} |
| {\displaystyle x\_{1}} | {\displaystyle 0} | {\displaystyle 1} | {\displaystyle 0} | {\displaystyle -{\frac {1}{4}}} | {\displaystyle {\frac {3}{8}}} | {\displaystyle 20} |

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

{\displaystyle x\_{1}=20,\ x\_{2}=20,\ }*ค่ามากที่สุดของ* {\displaystyle Z=200}

ประสิทธิภาพ
-----------

ขั้นตอนวิธีซิมเพล็กซ์ เป็นวิธีการที่มีประสิทธิภาพในทางปฏิบัติ และได้รับการพัฒนามากกว่าวิธีที่คิดค้นขึ้นมาก่อนหน้า อย่างไรก็ตามในปี พ.ศ. 2515 Klee และ Minty ได้เสนอตัวอย่างที่ที่แสดงให้เห็นว่าในกรณีเลวร้ายที่สุด ประสิทธิภาพการทำงานของขั้นตอนวิธีซิมเพล็กซ์จะใช้เวลาเป็นเอกซ์โพเนนเชียล ตั้งแต่นั้นมาการกระทำหรือการดำเนินการด้วยขั้นตอนวิธีนี้ก็ถูกแสดงว่าเป็นขั้นตอนวิธีที่มีประสิทธิภาพที่แย่

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

อ้างอิง
-------

* 
* เก็บถาวร 2011-09-12 ที่ เวย์แบ็กแมชชีน
* www.scaat.in.th/Bachelor/new/1\_2552/003\_1.doc[*ลิงก์เสีย*]
* www.cs.duke.edu/courses/spring08/cps296.2/simplex.pdf เก็บถาวร 2012-01-13 ที่ เวย์แบ็กแมชชีน
* เก็บถาวร 2011-09-03 ที่ เวย์แบ็กแมชชีน