6  การโปรแกรมเชิงเส้น (Linear Programming, LP)

Modified

4 พฤษภาคม 2568

ในบทนี้จะเป็นการคำนวณเชิงตัวเลข 100% และเป็นปัญหาที่นักเศรษฐศาสตร์ทุกคนจะต้องทำความเข้าใจและเขียนการแก้ปัญหาเชิงเส้นเหล่านี้โดย ผู้เขียนจะใช้ชุดคำสั่งของภาษาอาร์ ในการหาคำตอบ

LP คือเทคนิคทางคณิตศาสตร์ สำหรับการหา “ค่าที่ดีที่สุด” (เช่น กำไรสูงสุด, ต้นทุนต่ำสุด)
โดยมีเงื่อนไขข้อจำกัด (constraints) ที่เป็น สมการเชิงเส้น หรือ อสมการเชิงเส้น

6.1 องค์ประกอบของ Linear Programming

1. ฟังก์ชันวัตถุประสงค์ (Objective Function)

เป้าหมาย คือ minimize ฟังก์ชันเชิงเส้น

รูปทั่วไป: \[ \min { หรือ }\max\quad Z = c_1x_1 + c_2x_2 + \cdots + c_nx_n \] โดยที่

  • \(Z\) คือฟังก์ชันวัตถุประสงค์

  • \(c_1, c_2, \ldots, c_n\) คือสัมประสิทธิ์ (เช่น กำไรต่อหน่วย, ต้นทุนต่อหน่วย)

  • \(x_1, x_2, \ldots, x_n\) คือ ตัวแปรตัดสินใจ (Decision Variables)

2. ข้อจำกัด (Constraints)

เป็น สมการเชิงเส้น หรือ อสมการเชิงเส้น
โดยมีรูปทั่วไป: \[\begin{aligned} a_{11}x_1 + a_{12}x_2 + \cdots + a_{1n}x_n &~(\leq,=,\geq)~ b_1\\ a_{21}x_1 + a_{22}x_2 + \cdots + a_{2n}x_n &~(\leq,=,\geq)~ b_2\\ \vdots\\ a_{m1}x_1 + a_{m2}x_2 + \cdots + a_{mn}x_n &~(\leq,=,\geq)~ b_m\\ \end{aligned}\] โดยที่

  • \(a_{ij}\) คือสัมประสิทธิ์ข้อจำกัด

  • \(b_i\) คือค่าคงที่ในข้อจำกัด

  • \(m\) คือจำนวนข้อจำกัด

สมการข้อจำกัด จะมีเครื่องหมาย \(\leq\) น้อยกว่าหรือเท่ากับ \(=\) เท่ากับ หรือ \(\geq\) มากกว่าเท่ากับก็ได้

3. เงื่อนไขตัวแปรไม่ติดลบ (Non-negativity Constraints)

ตัวแปรต้องเป็นค่าบวกหรือศูนย์:

\[ x_1 \geq 0, \quad x_2 \geq 0, \quad \ldots, \quad x_n \geq 0 \]

เพราะ ในความจริง เช่น จำนวนสินค้าผลิตได้ไม่เป็นลบ เป็นต้น

6.2 รูปเมทริกซ์ของ Linear Programming (Matrix Form)

รูปทั่วไปของ LP ใน Matrix Form \[\text{Maximize (or Minimize)} \quad Z = \mathbf{c}^T \mathbf{x}\]

อสมการข้อจำกัด: \[ \mathbf{A} \mathbf{x} \leq \mathbf{b} \] และ \(\mathbf{x} \geq 0\)

อธิบายสัญลักษณ์:

สัญลักษณ์ ความหมาย
\(\mathbf{c}\) เวกเตอร์สัมประสิทธิ์ในฟังก์ชันวัตถุประสงค์ (ขนาด \(n \times 1\))
\(\mathbf{x}\) เวกเตอร์ตัวแปรตัดสินใจ (ขนาด \(n \times 1\))
\(\mathbf{A}\) เมทริกซ์สัมประสิทธิ์ข้อจำกัด (ขนาด \(m \times n\))
\(\mathbf{b}\) เวกเตอร์ค่าข้อจำกัดฝั่งขวา (RHS) (ขนาด \(m \times 1\))

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

6.3 การหาคำตอบด้วยชุดคำสั่ง lpSolve

ชุดคำสั่ง ipSolve

lpSolve คือ แพ็กเกจในภาษา R สำหรับการแก้ ปัญหา Linear Programming (LP) และ Integer Linear Programming (ILP)

  • ใช้สำหรับ หา “ค่าที่ดีที่สุด” (maximize หรือ minimize) ของฟังก์ชันวัตถุประสงค์

  • ภายใต้ข้อจำกัดที่เป็น สมการเชิงเส้น หรือ อสมการเชิงเส้น

  • สามารถใช้แก้:

    • LP ปกติ (ตัวแปรเป็นจำนวนจริง)

    • ILP (ตัวแปรเป็นจำนวนเต็ม)

    • Transportation problems

    • Assignment problems

6.3.1 การติดตั้งและการเรียกใช้งานชุดคำสั่ง lpSolve

การติดตั้ง

install.packages("lpSolve")

การเรียกใช้งาน

library(lpSolve)
ตัวอย่างการทำงานของ lpSolve

\[\max Z = 3x_1 + 5x_2 \] ข้อจำกัด: \[\begin{aligned} 2x_1 + x_2 &\leq 100\\ x_1 + 3x_2 &\leq 90\\ x_1, x_2 &\geq 0\end{aligned}\] แปลงเป็นเมทริกซ์

เวกเตอร์ \(\mathbf{c} = \begin{bmatrix}3\\5\end{bmatrix}\), ตัวแปร \(\mathbf{x} = \begin{bmatrix}x_1\\x_2\end{bmatrix}\), เมทริกซ์ข้อจำกัด \(\mathbf{A} = \begin{bmatrix}2 & 1\\1 & 3\end{bmatrix}\),

เวกเตอร์ฝั่งขวา \(\mathbf{b} = \begin{bmatrix}100\\90\end{bmatrix}\)

การหาคำตอบด้วย lpSolve:

# 0 เลือกใช้ชุดคำสั่ง loSolve
library(lpSolve)
# 1 กำหนดเวกเตอร์สัมประสิทธิ์ Coef
Coef <- c(3, 5)
# 2 เมตริกซ์ข้อจำกัด A
A <- matrix(c(2, 1, 1, 3), nrow = 2, byrow = TRUE)
# 3 เวคเตอร์ทิศทางข้อจำกัด
directions <- c("<=", "<=")
# 4 เมตริกซ์ b (ใช้เวคเตอร์ได้เลย)
b <- c(100, 90)
# 5 หาคำตอบ
result <- lp(  direction = "max",       # min หรือ max
             objective.in = Coef,       # เวกเตอร์สัมประสิทธิ์ Coef
                const.mat = A,          # เมตริกซ์ข้อจำกัด A
                const.dir = directions, # เวคเตอร์ทิศทางข้อจำกัด
                const.rhs = b)          # เมตริกซ์ b 
# ุ6 แสดงผลลัพธ์
result$solution  # ค่าตัวแปร x1 และ x2 ตามลำดับ
[1] 42 16
result$objval    # ค่าสูงสุดของ Z
[1] 206

6.4 ตัวอย่างประเภทปัญหาเศรษฐศาสตร์ที่ใช้ LP

Linear Programming ในเศรษฐศาสตร์ = ใช้ แก้ปัญหาการตัดสินใจอย่างมีข้อจำกัด
โดยมุ่งหา “การจัดสรรทรัพยากรอย่างเหมาะสมที่สุด” ภายใต้เงื่อนไขต่าง ๆ เช่น

  • เพิ่มกำไรสูงสุด

  • ลดต้นทุนต่ำสุด

  • ใช้ทรัพยากรจำกัดให้ได้ผลลัพธ์ดีที่สุด

6.4.1 การผลิต (Production)

โรงงานผลิตสินค้าสามชนิด

บริษัทแห่งหนึ่งผลิตสินค้า A, B และ C
สินค้า A ทำกำไร 6 บาทต่อหน่วย, สินค้า B ทำกำไร 8 บาทต่อหน่วย, และสินค้า C ทำกำไร 5 บาทต่อหน่วย แต่ละหน่วยของสินค้าใช้ทรัพยากรดังนี้:

  • วัตถุดิบ: สินค้า A ใช้ 2 หน่วย, B ใช้ 1 หน่วย, C ใช้ 1 หน่วย

  • แรงงาน: สินค้า A ใช้ 1 ชั่วโมง, B ใช้ 3 ชั่วโมง, C ใช้ 2 ชั่วโมง

  • เครื่องจักร: สินค้า A ใช้ 2 ชั่วโมง, B ใช้ 2 ชั่วโมง, C ใช้ 1 ชั่วโมง

โรงงานมีวัตถุดิบ 100 หน่วย, เวลาแรงงาน 120 ชั่วโมง และเครื่องจักร 150 ชั่วโมง บริษัทควรผลิตสินค้าแต่ละชนิดเท่าใดเพื่อให้กำไรสูงสุด?

วิธีทำ

เขียนเป็นตารางสรุปได้ดังนี้

รายการ สินค้า A สินค้า B สินค้า C
กำไรต่อหน่วย (บาท) 6 8 5
การใช้วัตถุดิบ (หน่วย) 2 1 1
การใช้แรงงาน (ชั่วโมง) 1 3 2
การใช้เครื่องจักร (ชั่วโมง) 2 2 1
ข้อจำกัดรวม \(\leq\) 100 (วัตถุดิบ) \(\leq\) 120 (แรงงาน) \(\leq\) 150 (เครื่องจักร)

ฟังก์ชันเชิงคณิตศาสตร์ \[\max Z = 6A + 8B + 5C\] ข้อจำกัด: \[\begin{aligned} 2A + B + C &\leq 100\\ A + 3B + 2C &\leq 120\\ 2A + 2B + C &\leq 150\\ A, B, C &\geq 0 \end{aligned}\] เมตริกซ์รูปแบบ

\[ \mathbf{c} = \begin{bmatrix} 6 \\ 8 \\ 5 \end{bmatrix}, \quad \mathbf{x} = \begin{bmatrix} A \\ B \\ C \end{bmatrix},\quad \mathbf{\Pi} = \begin{bmatrix} 2 & 1 & 1\\ 1 & 3 & 2\\ 2 & 2 & 1 \end{bmatrix}, \quad \mathbf{b} = \begin{bmatrix} 100\\ 120\\ 150 \end{bmatrix} \]

ต้องเปลี่ยนเปลี่ยนชื่อเมตริกซ์ A เป็น \(\Pi\) เพื่อป้องกันการสับสนกับสินค้า A

การหาคำตอบด้วย lpSolve:

# 0 เลือกใช้ชุดคำสั่ง loSolve
library(lpSolve)
# 1 กำหนดเวกเตอร์สัมประสิทธิ์ Coef
Coef <- c(6, 8, 5)
# 2 เมตริกซ์ข้อจำกัด Pi
Pi <- matrix(c(2, 1, 1, 
              1, 3, 2,
              2, 2, 1), nrow = 3, byrow = TRUE)
# 3 เวคเตอร์ทิศทางข้อจำกัด
directions <- c("<=", "<=", "<=")
# 4 เมตริกซ์ b (ใช้เวคเตอร์ได้เลย)
b <- c(100, 120, 150)
# 5 หาคำตอบ
result <- lp(  direction = "max",       # min หรือ max
             objective.in = Coef,       # เวกเตอร์สัมประสิทธิ์ Coef
                const.mat = Pi,          # เมตริกซ์ข้อจำกัด A
                const.dir = directions, # เวคเตอร์ทิศทางข้อจำกัด
                const.rhs = b)          # เมตริกซ์ b 
# ุ6 แสดงผลลัพธ์
result$solution  # สินค้า A B และ C ตามลำดับ
[1] 36 28  0
result$objval    # ค่าสูงสุดของ Z
[1] 440

6.4.2 การลงทุน (Investment)

การลงทุนในโครงการ

นักลงทุนมีงบลงทุน 1,000 บาท มี 3 โครงการ A, B และ C ให้เลือกลงทุน

  • ผลตอบแทนต่อหน่วยลงทุน:

    • A: 12%, B: 10%, C: 15%
  • ความเสี่ยงต่อหน่วย:

    • A: 0.5 หน่วย, B: 0.8 หน่วย, C: 0.3 หน่วย กำหนดให้:
  • เงินลงทุนรวมไม่เกิน 1,000 บาท

  • ความเสี่ยงรวมไม่เกิน 500 หน่วย

  • ต้องลงทุนในโครงการ A อย่างน้อย 100 บาท

ควรลงทุนในแต่ละโครงการอย่างไรเพื่อให้ผลตอบแทนสูงสุด?

วิธีทำ

ตารางสรุปข้อมูลการลงทุน

รายการ โครงการ A โครงการ B โครงการ C
ผลตอบแทนต่อหน่วยลงทุน (%) 12% 10% 15%
ความเสี่ยงต่อหน่วย 0.5 หน่วย 0.8 หน่วย 0.3 หน่วย

ตารางสรุปเงื่อนไขข้อจำกัด

เงื่อนไข ข้อมูล
เงินลงทุนรวม ไม่เกิน 1,000 บาท
ความเสี่ยงรวม ไม่เกิน 500 หน่วย
เงินลงทุนในโครงการ A อย่างน้อย 100 บาท

ฟังก์ชันเชิงคณิตศาสตร์ \[\max Z = 0.12A + 0.10B + 0.15C\] ข้อจำกัด: \[\begin{aligned} A + B + C &\leq 1000\\ 0.5A + 0.8B + 0.3C &\leq 500\\ A &\geq 100\\ A, B, C &\geq 0\end{aligned}\] เมตริกซ์รูปแบบ \[\mathbf{c} = \begin{bmatrix} 0.12 \\ 0.10 \\ 0.15 \end{bmatrix} \quad \mathbf{\Pi} = \begin{bmatrix} 1 & 1 & 1\\ 0.5 & 0.8 & 0.3\\ -1 & 0 & 0 \end{bmatrix} \quad,\mathbf{x} = \begin{bmatrix} A\\ B\\ C \end{bmatrix}\quad, \mathbf{b} = \begin{bmatrix} 1000\\ 500\\ -100 \end{bmatrix}\]

ต้องเปลี่ยนเปลี่ยนชื่อเมตริกซ์ A เป็น \(\Pi\) เพื่อป้องกันการสับสนกับโครงการ A

การหาคำตอบด้วย lpSolve:

# 0 เลือกใช้ชุดคำสั่ง loSolve
library(lpSolve)
# 1 กำหนดเวกเตอร์สัมประสิทธิ์ Coef
Coef <- c(0.12, 0.10, 0.15)
# 2 เมตริกซ์ข้อจำกัด Pi
Pi <- matrix(c(1, 1, 1, 
              0.5, 0.8, 0.3,
              -1, 0, 0), nrow = 3, byrow = TRUE)
# 3 เวคเตอร์ทิศทางข้อจำกัด
directions <- c("<=", "<=", "<=")
# 4 เมตริกซ์ b (ใช้เวคเตอร์ได้เลย)
b <- c(1000, 500, -100)
# 5 หาคำตอบ
result <- lp(  direction = "max",       # min หรือ max
             objective.in = Coef,       # เวกเตอร์สัมประสิทธิ์ Coef
                const.mat = Pi,          # เมตริกซ์ข้อจำกัด A
                const.dir = directions, # เวคเตอร์ทิศทางข้อจำกัด
                const.rhs = b)          # เมตริกซ์ b 
# ุ6 แสดงผลลัพธ์
result$solution  # โครงการ A B และ C ตามลำดับ
[1] 100   0 900
result$objval    # ค่าสูงสุดของ Z
[1] 147

6.4.3 การขนส่ง (Transportation)

ปัญหาการขนส่งสินค้า

โรงงานสองแห่ง A และ B มีสินค้าพร้อมส่งรวม 700 หน่วย

  • โรงงาน A มีสินค้า 300 หน่วย และโรงงาน B มีสินค้า 400 หน่วย

  • สินค้าจะถูกส่งไปยังตลาด 3 แห่งคือ ตลาด 1, ตลาด 2 และตลาด 3

ความต้องการสินค้า:

  • ตลาด 1 ต้องการ 250 หน่วย

  • ตลาด 2 ต้องการ 200 หน่วย

  • ตลาด 3 ต้องการ 250 หน่วย

ค่าขนส่งต่อหน่วย:

  • จาก A ไป ตลาด 1 = 2 บาท, ตลาด 2 = 4 บาท, ตลาด 3 = 5 บาท

  • จาก B ไป ตลาด 1 = 3 บาท, ตลาด 2 = 1 บาท, ตลาด 3 = 7 บาท

โรงงานควรจัดการขนส่งสินค้าอย่างไรเพื่อให้ต้นทุนการขนส่งต่ำที่สุด?

วิธีทำ ส่งสินค้าจากคลัง A (300 หน่วย) และ B (400 หน่วย) ไปยังตลาด 1, 2, 3

ค่าขนส่งต่อหน่วย:

ตลาด 1 ตลาด 2 ตลาด 3
คลัง A 2 4 5
คลัง B 3 1 7

ความต้องการ:

  • ตลาด 1 ต้องการ 250

  • ตลาด 2 ต้องการ 200

  • ตลาด 3 ต้องการ 250

กำหนดให้ \(x_{ij}\) คือจำนวนสินค้าจากคลัง \(i\) ไปยังตลาด \(j\) โดยที่ \(i=\{A,B\}\) และ \(j=1,2,3\)

ฟังก์ชันเชิงคณิตศาสตร์ \[\min Z = 2x_{A1} + 4x_{A2} + 5x_{A3} + 3x_{B1} + 1x_{B2} + 7x_{B3}\] ข้อจำกัด: \[\begin{aligned} x_{A1} + x_{A2} + x_{A3} &\leq 300\\ x_{B1} + x_{B2} + x_{B3} &\leq 400\\ x_{A1} + x_{B1} &= 250\\ x_{A2} + x_{B2} &= 200\\ x_{A3} + x_{B3} &= 250\\ x_{ij} &\geq 0\end{aligned}\]

รูปแบบเมตริกซ์

เวกเตอร์ \(\mathbf{x} = [x_{A1}, x_{A2}, x_{A3}, x_{B1}, x_{B2}, x_{B3}]^T\) \[\mathbf{c} = \begin{bmatrix} 2\\ 4\\ 5\\ 3\\ 1\\ 7 \end{bmatrix} ,\quad \mathbf{A} = \begin{bmatrix} 1 & 1 & 1 & 0 & 0 & 0\\ 0 & 0 & 0 & 1 & 1 & 1\\ 1 & 0 & 0 & 1 & 0 & 0\\ 0 & 1 & 0 & 0 & 1 & 0\\ 0 & 0 & 1 & 0 & 0 & 1 \end{bmatrix} ,\quad \mathbf{x} = \begin{bmatrix} x_{A1}\\ x_{A2}\\ x_{A3}\\ x_{B1}\\ x_{B2}\\ x_{B3} \end{bmatrix},\quad \mathbf{b} = \begin{bmatrix} 300\\ 400\\ 250\\ 200\\ 250 \end{bmatrix}\]

การหาคำตอบด้วย lpSolve:

# 0 เลือกใช้ชุดคำสั่ง loSolve
library(lpSolve)
# 1 กำหนดเวกเตอร์สัมประสิทธิ์ Coef
Coef <- c(2, 4, 5, 3, 1, 7)
# 2 เมตริกซ์ข้อจำกัด Pi
Pi <- matrix(c(1, 1, 1, 0, 0, 0,
               0, 0, 0, 1, 1, 1,
               1, 0, 0, 1, 0, 0,
               0, 1, 0, 0, 1, 0,
               0, 0, 1, 0, 0, 1), nrow = 5, byrow = TRUE)
# 3 เวคเตอร์ทิศทางข้อจำกัด
directions <- c("<=", "<=", "=", "=", "=")
# 4 เมตริกซ์ b (ใช้เวคเตอร์ได้เลย)
b <- c(300, 400, 250, 200, 250)
# 5 หาคำตอบ
result <- lp(  direction = "min",       # min หรือ max
             objective.in = Coef,       # เวกเตอร์สัมประสิทธิ์ Coef
                const.mat = Pi,          # เมตริกซ์ข้อจำกัด A
                const.dir = directions, # เวคเตอร์ทิศทางข้อจำกัด
                const.rhs = b)          # เมตริกซ์ b 
# ุ6 แสดงผลลัพธ์
result$solution  # x_A1, x_A2, x_A3, x_B1, x_B2, x_B3
[1]  50   0 250 200 200   0
result$objval    # ค่าต่ำสุดของ Z
[1] 2150

6.4.4 การใช้ทรัพยากร (Resource Allocation) แรงงาน

การจัดสรรแรงงานในโรงงาน

โรงงานมีแรงงาน 80 คน ต้องจัดสรรคนทำงาน 3 ประเภท ได้แก่ งาน A, งาน B และงาน C

รายได้ต่อคน:

  • งาน A = 100 บาท

  • งาน B = 120 บาท

  • งาน C = 90 บาท

กำหนดเงื่อนไข:

  • งาน A ต้องมีแรงงานไม่น้อยกว่า 10 คน

  • งาน B ต้องมีแรงงานไม่น้อยกว่า 20 คน

  • จำนวนแรงงานในงาน C ต้องไม่น้อยกว่าจำนวนแรงงานในงาน A

ควรจัดสรรแรงงานในแต่ละงานอย่างไรเพื่อให้รายได้รวมสูงสุด?

วิธีทำ

โรงงานมีแรงงาน 80 คน ต้องกระจายไปยังงาน A, B, และ C - รายได้ต่อหน่วยแรงงาน: - งาน A: 100 บาท - งาน B: 120 บาท - งาน C: 90 บาท - เงื่อนไข: - งาน A ต้องใช้ไม่น้อยกว่า 10 คน - งาน B ต้องใช้อย่างน้อย 20 คน - งาน C ต้องใช้คนไม่น้อยกว่างาน A

ฟังก์ชันเชิงคณิตศาสตร์ \[\max Z = 100x_1 + 120x_2 + 90x_3\] ข้อจำกัด: \[\begin{aligned} x_1 + x_2 + x_3 &= 80\rightarrow& x_1 + x_2 + x_3 = 80\\ x_1 &\geq 10 \rightarrow& -x_1\leq -10\\ x_2 &\geq 20 \rightarrow& -x_2\leq -20\\ x_3 &\geq x_1 \rightarrow& -x_1+x_3\leq 0\\ x_i &\geq 0&\end{aligned} \]

รูปแบบเมตริกซ์ \[ \mathbf{c} = \begin{bmatrix} 100\\120\\90 \end{bmatrix} ,\quad \mathbf{x} = \begin{bmatrix} x_1\\x_2\\x_3 \end{bmatrix},\quad \mathbf{A} = \begin{bmatrix} 1 & 1 & 1\\ -1 & 0 & 0\\ 0 & -1 & 0\\ -1 & 0 & 1 \end{bmatrix} ,\quad \mathbf{b} = \begin{bmatrix} 80\\ -10\\ -20\\ 0 \end{bmatrix} \]

การหาคำตอบด้วย lpSolve:

# 0 เลือกใช้ชุดคำสั่ง loSolve
library(lpSolve)
# 1 กำหนดเวกเตอร์สัมประสิทธิ์ Coef
Coef <- c(100, 120, 90)
# 2 เมตริกซ์ข้อจำกัด A
A <- matrix(c(1,  1, 1, 
             -1,  0, 0,
              0, -1, 0,
             -1,  0, 1), nrow = 4, byrow = TRUE)
# 3 เวคเตอร์ทิศทางข้อจำกัด
directions <- c("=", "<=", "<=", "<=")
# 4 เมตริกซ์ b (ใช้เวคเตอร์ได้เลย)
b <- c(80, -10, -20, 0)
# 5 หาคำตอบ
result <- lp(  direction = "max",       # min หรือ max
             objective.in = Coef,       # เวกเตอร์สัมประสิทธิ์ Coef
                const.mat = A,          # เมตริกซ์ข้อจำกัด A
                const.dir = directions, # เวคเตอร์ทิศทางข้อจำกัด
                const.rhs = b)          # เมตริกซ์ b 
# ุ6 แสดงผลลัพธ์
result$solution  # x1, x2 x3 ตามลำดับ
[1] 10 70  0
result$objval    # ค่าสูงสุดของ Z
[1] 9400

6.4.5 การใช้ทรัพยากร (Resource Allocation) งบประมาณ

การจัดสรรงบประมาณการตลาด

บริษัทควรจัดสรรงบประมาณอย่างไรในแต่ละช่องทางเพื่อให้ผลตอบแทนรวมสูงสุด? ถ้าบริษัทมีงบการตลาด 500,000 บาท ต้องกระจายงบประมาณไปยัง 3 ช่องทาง ได้แก่ โฆษณาทีวี, โฆษณาออนไลน์ และกิจกรรมอีเวนต์ โดยมีผลตอบแทนการลงทุน และเงื่อนไขงบประมาณดังนี้

ช่องทางโฆษณา ผลตอบแทนการลงทุน (ROI) เงื่อนไขงบประมาณ
โฆษณาทีวี 15% ต่อบาท ไม่เกิน 200,000 บาท
โฆษณาออนไลน์ 20% ต่อบาท ไม่น้อยกว่า 100,000 บาท
กิจกรรมอีเวนต์ 10% ต่อบาท ไม่เกิน 150,000 บาท

วิธีทำ

บริษัทมีงบการตลาด 500,000 บาท ต้องแจกจ่ายให้กิจกรรมโฆษณา 3 ช่องทาง:
ทีวี (\(x_1\)), ออนไลน์ (\(x_2\)) และอีเวนต์ (\(x_3\))

  • ผลตอบแทน (ROI ต่อหน่วย): 0.15, 0.20, 0.10

  • ข้อจำกัด:

    • ทีวีลงทุนไม่เกิน 200,000

    • ออนไลน์อย่างน้อย 100,000

    • อีเวนต์ไม่เกิน 150,000

สามารถเขียนฟังก์ชันเชิงคณิตศาสตร์ \[\max Z = 0.15x_1 + 0.20x_2 + 0.10x_3\] ข้อจำกัด: \[\begin{aligned} x_1 + x_2 + x_3 &= 500000\\ x_1 &\leq 200000\\ x_2 &\geq 100000\\ x_3 &\leq 150000\\ x_i &\geq 0, i =1,2,3\end{aligned}\] รูปแบบเมตริกซ์ \[\mathbf{c} = \begin{bmatrix} 0.15\\ 0.20\\ 0.10 \end{bmatrix} \quad \mathbf{x} = \begin{bmatrix} x_1\\ x_2\\ x_3 \end{bmatrix} \quad \mathbf{A} = \begin{bmatrix} 1 & 1 & 1\\ 1 & 0 & 0\\ 0 & -1 & 0\\ 0 & 0 & 1 \end{bmatrix} \quad \mathbf{b} = \begin{bmatrix} 500000\\ 200000\\ -100000\\ 150000 \end{bmatrix}\]

การหาคำตอบด้วย lpSolve:

# กำหนดให้แสดงผลลัพธ์เป็นตัวเลขไม่เกิน 999 ตำแหน่ง
options(scipen = 999)
# 0 เลือกใช้ชุดคำสั่ง loSolve
library(lpSolve)
# 1 กำหนดเวกเตอร์สัมประสิทธิ์ Coef
Coef <- c(0.15, 0.20, 0.10)
# 2 เมตริกซ์ข้อจำกัด A
A <- matrix(c(1, 1, 1, 
              1, 0, 0,
              0, -1, 0,
              0, 0, 1), nrow = 4, byrow = TRUE)
# 3 เวคเตอร์ทิศทางข้อจำกัด
directions <- c("=","<=" ,"<=","<=")
# 4 เมตริกซ์ b (ใช้เวคเตอร์ได้เลย)
b <- c(500000, 200000, -100000, 150000)
# 5 หาคำตอบ
result <- lp(  direction = "max",       # min หรือ max
             objective.in = Coef,       # เวกเตอร์สัมประสิทธิ์ Coef
                const.mat = A,          # เมตริกซ์ข้อจำกัด A
                const.dir = directions, # เวคเตอร์ทิศทางข้อจำกัด
                const.rhs = b)          # เมตริกซ์ b 
# ุ6 แสดงผลลัพธ์
result$solution  # ค่าตัวแปร x1 x2 และ x3 ตามลำดับ
[1]      0 500000      0
result$objval    # ค่าสูงสุดของ Z
[1] 100000