Tải bản đầy đủ (.pdf) (8 trang)

ỨNG DỤNG PHẦN mềm r GIẢI bài TOÁN QUY HOẠCH TUYẾN TÍNH APPLICATION OF r SOFTWARE TO SOLVE THE LINEAR PROGRAMMING PROBLEM

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (219.41 KB, 8 trang )

KỶ YẾU HỘI THẢO “CÔNG NGHỆ THÔNG TIN VÀ ỨNG DỤNG CNTT TRONG CÁC LĨNH VỰC – LẦN THỨ 2”

ỨNG DỤNG PHẦN MỀM R GIẢI BÀI TOÁN QUY HOẠCH TUYẾN TÍNH
APPLICATION OF R SOFTWARE TO SOLVE THE LINEAR PROGRAMMING PROBLEM
Hồng Nhật Quy
Trường Cao đẳng Công nghệ Thông tin Hữu nghị Việt – Hàn
TÓM TẮT
Bài báo này khai thác một khả năng ứng dụng mới của phần mềm R để giải bài tốn quy hoạch tuyến tính
(QHTT) nói chung và một trường hợp riêng là bài toán vận tải. Và đồng thời cũng muốn nhấn mạnh khả năng
ứng dụng đa dạng của R vào các lĩnh vực khác nhau.
Từ khóa: Phần mềm R; quy hoạch tuyến tính; QHTT; bài tốn vận tải; toán tối ưu.

ABSTRACT
This paper exploits a new application capability of R software to solve the linear programming problem in
general and a particular case is the transportation problem. And we also want to emphasize the ability of diverse
applications of R software in different fields.
Key words: R software; linear programming; lp; transportation problem; optimization

1


KỶ YẾU HỘI THẢO “CÔNG NGHỆ THÔNG TIN VÀ ỨNG DỤNG CNTT TRONG CÁC LĨNH VỰC – LẦN THỨ 2”

1. Đặt vấn đề
Ngày nay, nhu cầu về phân tích số liệu và biểu đồ đang phát triển rất mạnh mẽ ở hầu hết các lĩnh
vực của đời sống con người. Chính vì vậy mà trong suốt những thập kỷ qua, nhiều công ty phần mềm đã
đầu tư nghiên cứu và phát triển những phần mềm chuyên dụng cho mục đích này, một số phần mềm nổi
tiếng có thể kể ra như sau: SAS, SPSS, Stata, Statistica, S-Plus. Vì đây là những phần mềm thương mại,
nên muốn sử dụng cần phải mua bản quyền mà chi phí tài chính có khi lên đến hàng trăm ngàn đô - la mỗi
năm. Điều này vượt xa khả năng tài chính của nhiều cá nhân, các trường đại học, các tổ chức nghiên
cứu,… tại nhiều nước trên thế giới, đặc biệt là ở những nước nghèo như Việt Nam chúng ta. Đây chính là


động lực đầu tiên thúc đẩy các nhà nghiên cứu thống kê trên thế giới hợp tác với nhau nhằm xây dựng
một phần mềm mã nguồn mở cho mục tiêu này.
Năm 1996, trong một bài báo quan trọng về tính tốn thống kê, các nhà thống kê học Ross Ihaka và
Robert Gentleman đã phác họa một ngôn ngữ mới cho phân tích thống kê mà họ đặt tên là R. Ý tưởng này
được nhiều nhà thống kê học trên thế giới ủng hộ và thúc đẩy họ tham gia vào việc phát triển R.
Mặc dù ý tưởng ban đầu là xây dựng một phần mềm mã mở cho phân tích và xử lý số liệu, nhưng
qua gần 10 năm phát triển, R đã đạt được nhiều tính năng vượt xa mục tiêu ban đầu và thực chất nó là một
ngơn ngữ máy tính đa năng có thể sử dụng cho nhiều mục tiêu khác nhau. Ngồi khả năng phân tích
thống kê và biểu đồ thì R cịn có khả năng thực hiện hầu hết các tính tốn đơn giản, tính tốn ma trận,
phân tích thống kê phức tạp và nhiều lĩnh vực khác của toán học như toán tối ưu, toán tài chính, kinh tế
lượng, giải tích số,…
Trong khn khổ bài báo này, chúng tôi muốn giới thiệu một ứng dụng hầu như chưa được khai
thác tại Việt Nam của R đó là khả năng giải bài tốn QHTT (một nhánh nhỏ của tốn tối ưu). Hiện này
nếu muốn tìm tài liệu về vấn đề này, ta chỉ có thể khái thác mục “Help” trong chương trình R hoặc tìm
các tài liệu bằng tiếng Anh. Tuy nhiên, đây là những hướng rất khó khăn bởi phương pháp tiếp cận bài
tốn QHTT khá khác so với ở Việt Nam. Qua nghiên cứu của chúng tơi thì những tài liệu này được viết
tương đối sơ sài và rất khó áp dụng, đặc biệt là với các bạn sinh viên mới lần đầu tiếp cận bài tốn QHTT.
Ngồi ra, qua việc giới thiệu ứng dụng này của R, chúng tôi một lần nữa muốn khẳng định lại “sức
mạnh” của R. Ở cuối mục 2, chúng tơi có gợi mở thêm khả năng ứng dụng R để giải bài tốn quy hoạch
tồn phương và quy hoạch phi tuyến để bạn đọc quan tâm có thể tiếp tục nghiên cứu và nếu có dịp chúng
tơi sẽ trình bày một cách chi tiết ưng dụng này. Chúng tôi hy vọng rằng thêm những ững dụng này nữa
của R được giới thiệu sẽ tạo động lực cho những ai đã quan tâm tới R tiếp tục nghiên cứu sầu hơn, và
những ai chưa quan tâm sẽ bước đầu tiếp cận một cách thích thú. Để cuối cùng là ngày càng gia tăng số
lượng trong cộng đồng ứng dụng R tại Việt Nam, vì đây là xu hướng đang phát triển mạnh tại các trường
đại học, các trung tâm nghiên cứu và các tổ chức kinh tế xã hội trên toàn thế giới.
2. Kết quả nghiên cứu và khảo sát:
Chúng ta có thể vào website sau để download R và cài đặt (cực kỳ đơn giản chỉ việc làm theo các
hướng dẫn trên màn hình) lên máy tính cá nhân để sử dụng.
.
R cung cấp một ngôn ngữ máy tính và một số function để thực hiện các tính tốn đơn giản, để thực

hiện các tính tốn phức tạp, ta cần tải về và cài đặt lên máy các package khác. Package là một phần mềm
nhỏ được xây dựng để giải quyết một vấn đề cụ thể, và có thể chạy trong hệ thống R. Đối với việc giải bài
tốn QHTT ta có thể sử dụng một trong những package như: lpSolveAPI, lpSolve, boot. Sau đây chúng
tôi chỉ tập trung hướng dẫn sử dụng package lpSolve.
2


KỶ YẾU HỘI THẢO “CÔNG NGHỆ THÔNG TIN VÀ ỨNG DỤNG CNTT TRONG CÁC LĨNH VỰC – LẦN THỨ 2”

Sau đây là quá trình cài đặt package lpSolve:
- Từ thanh công cụ tại cựa sổ giao diện của R chon: Packages/install packages …
- Cựa số CRAN mirror xuất hiện, chọn UK (Bristol)
- Cựa sổ Packages xuất hiện, chọn gói lệnh “lpSolve” (scroll để tìm gói “lpSolve” và kích chọn nó)
để cài vào R.
- Sau khi đã cài được gói lệnh “lpSolve”, ta phải dùng lệnh sau đây để tải các hàm (thư viện hàm
trong gói lpSolve) vào chương trình R và sử dụng chúng cho việc giải bài toán QHTT.
> library(lpSolve) 
Để xem danh sách các lệnh trong thư viện ta dùng lệnh sau:
> ls(“package:lpSolve”) 
2.1. Kết quả 1: Giải bài toán QHTT bằng R
2.1.1. Cấu trúc của bài toán QHTT
Hàm mục tiêu (objective function)

f  c1 x1  c2 x2   cn xn  in1 ci xi  min (max)
Các ràng buộc (constraints)
n

 aij x j  bi ; i  1,2,..., m1
j 1


n

 aij x j  bi ; i  m1  1,..., m1  m2
j 1

n

 aij x j  bi ; i  m1  m2  1,..., m
j 1

Điều kiện của ẩn số (decision variables)

xi  0, i  1, n1; xi  0, i  n1  1, n1  n2 , n1  n2  n
2.1.2. Nhập dư liệu bài toán QHTT vào R
Dữ liệu bài toán QHTT được nhập vào bằng các lệnh và theo thứ tự như sau
- Nhập hệ số của hàm mục tiêu:
> ham <- c(c1,…, cn) 
(“ham” là tên tự đặt)
- Nhập ma trận hệ số:
> matran <- matrix(c(a11, …, amn), nrow = m, byrow = TRUE) 
(“matran” là tên tự đặt)
- Nhập các quan hệ của các ràng buộc:
> quanhe <- c (“type”,…) 
(“quanhe” là tên tự đặt, “type” là “>=”, ”<=”, ”=”)
- Nhập các hệ số vế phải của các ràng buộc:

3


KỶ YẾU HỘI THẢO “CÔNG NGHỆ THÔNG TIN VÀ ỨNG DỤNG CNTT TRONG CÁC LĨNH VỰC – LẦN THỨ 2”


> vphai <- c(b1,…, bm) 
(“vphai” là tên tự đặt)
- Gọi các kết quả của bài toán:
+ Lấy giá trị mục tiêu tối ưu của bài toán:
> lp(“muctieu”, ham, matr, qhe, vphai) 
Chú ý: “muctieu” là “max” hoặc “min” tùy từng bài toán
+ Lấy phương án tối ưu của bài toán:
> lp(“muctieu”, ham, matran, quanhe, vphai)$solution 
+ Lấy lời giải của bài toán đối ngẫu:
> lp(“muctieu”, ham, matran, quanhe, vphai, compute.sens = TRUE)$duals 
2.1.3. Ví dụ: Giải bài tốn QHTT sau

f  x1  9 x 2  3x3  max
 x1  2 x 2  3x3  9

3x1  2 x 2  2 x3  15
x1 , x 2 , x3  0
Giải
- Nhập dữ liệu bài toán vào R:
> ham <- c(1, 9, 3) 
> matran <- matrix (c(1, 2, 3, 3, 2, 2), nrow = 2, byrow = TRUE) 
> quanhe <- c(“<=”,”<=”) 
> vphai <- c(9, 15) 
- Gọi kết quả của bài toán:
+ Lấy giá trị mục tiêu tối ưu: > lp(“max”, ham, matr, qhe, vphai) 

 Trên màn hình xuất hiện: Success: the objective function is 40.5 (tức là fmax = 40,5)
+ Lấy phương án tối ưu: > lp(“max”, ham, matr, qhe, vphai)$solution 


 Trên màn hình xuất hiện: [1] 0.0 4.5 0.0 (tức là phương án tối ưu bằng (0; 4,5; 0))
+ Lấy lời giải của bài toán đối ngẫu: > lp(“max”, ham, matr, qhe, vphai, compute.sens = TRUE)$duals 

 Trên màn hình xuất hiện: [1] 4.5 0.0 -3.5 0.0 -10.5 (tức là: phương án tối ưu của bài toán đối
ngẫu là (4,5; 0), chênh lệch trong các ràng buộc của bài toán đối ngẫu là -3,5; 0; -10,5)

- Nếu bài toán trên đây yêu cầu thêm điều kiện các biến là ngun (integer) thì trong lệnh gọi kết quả ta
có thay đổi chút ít như sau:
+ Gọi giá trị mục tiêu tối ưu: > lp(“max”, ham, matr, qhe, vphai, int.vec = 1:3) 

 Trên màn hình xuất hiện: Success: the objective function is 37
+ Gọi phương án tối ưu của bài toán: > lp(“max”, ham, matr, qhe, vphai, int.vec = 1:3)$solution 

4


KỶ YẾU HỘI THẢO “CÔNG NGHỆ THÔNG TIN VÀ ỨNG DỤNG CNTT TRONG CÁC LĨNH VỰC – LẦN THỨ 2”

 Trên màn hình xuất hiện: [1] 1 4 0
+ Gọi lời giải của bài toán đối ngẫu: > lp(“max”, ham, matr, qhe, vphai, int.vec = 1:3, compute.sens =
TRUE)$duals 

 Trên màn hình xuất hiện: [1] 1 0 0 7 0
2.2. Kết quả 2: Giải bài toán vận tải bằng R
2.2.1. Cấu trúc bài toán vận tải
Hàm mục tiêu
m

n


f   cij .xij  min (max)
i 1 j 1

Các ràng buộc
n

x
j 1

ij

 (, )ai

ij

 (, )b j

m

x
i 1

Điều kiện của ẩn số: xij  0
2.2.2. Nhập dữ liệu bài toán vận tải vào R
Trước khi giải bài toán vận tải ta cần gõ lệnh sau để mở thư viện lệnh cần dung
> library(lpSolve) 
Lúc này phần mềm đã sẵn sàng cho việc giải toán. Dữ liệu của bài toán được nhập vào bằng các
lệnh và theo thứ tự như sau
- Nhập dữ liệu ma trận cước phí
> cuoc <- c(c11,…, cmn) 

> mt_cuoc <- matrix(cuoc, m, n) 
- Nhập dữ liệu các ràng buộc theo hàng (theo điểm phát):
+ Nhập các quan hệ (“=”, ”>=”, “<=”) của các ràng buộc:
> qh_h <- c(“h_1”,…, “h_m”) 
(h_1,…, h_m: là một trong các dấu: “=”, “>=”, “<=”)
+ Nhập nhu cầu phát hàng:
> hs_h <- c(a1, a2, …, am) 
- Nhập dữ liệu các ràng buộc theo cột (theo điểm thu):
+ Nhập các quan hệ (“=”, ”>=”, “<=”) của các ràng buộc:
> qh_c <- c(“h_1”,…, “h_n”) 
(h_1,…, h_m: là một trong các dấu: “=”, “>=”, “<=”)
+ Nhập nhu cầu thu hàng:
> hs_c <- c(b1, b2, …, bn) 

5


KỶ YẾU HỘI THẢO “CÔNG NGHỆ THÔNG TIN VÀ ỨNG DỤNG CNTT TRONG CÁC LĨNH VỰC – LẦN THỨ 2”

- Gọi kết quả của bài toán:
+ Gọi giá trị mục tiêu tối ưu:
> lp.transport(mt_cuoc, “type”, qh_h, hs_h, qh_c, hs_c) 
+ Gọi phương án tối ưu:
> lp.transport(mt_cuoc, “type”, qh_h, hs_h, qh_c, hs_c)$solution 
2.2.3. Ví dụ: Giải bài tốn vận tải với dữ liệu được cho bởi bảng sau

Bảng 1. Bảng dữ liệu của ví dụ

thu


130

160

120

140

170

20

18

22

25

200

15

25

30

15

180


45

30

40

35

phát

Với yêu cầu: Các điểm phát hàng phát hết hàng, các điểm thu hàng thì nhận đủ hàng (đây là bài toán cân
bằng cung cầu) và tổng chi phí vận chuyển là nhỏ nhất.
Giải
- Nhập dữ liệu ma trận cước phí
>cuoc<- c(20,15,45,18,25,30,22,30,40,25,15,35) 
> mt_cuoc <- matrix(cuoc, 3, 4) 
- Nhập dữ liệu các ràng buộc theo hàng (theo điểm phát)
+ Nhập quan hệ
> qh_h <- c(“=”, “=”, “=”) 
+ Nhập nhu cầu phát hàng
> hs_h <- c(170, 200, 180) 
- Nhập dữ liệu các ràng buộc theo cột (theo các điểm thu)
+ Nhập quan hệ
> qh_c <- c(“=”, “=”, “=”, “=”) 
+ Nhập nhu cầu thu hàng
> hs_c <- c(130, 160, 120,140) 

6



KỶ YẾU HỘI THẢO “CÔNG NGHỆ THÔNG TIN VÀ ỨNG DỤNG CNTT TRONG CÁC LĨNH VỰC – LẦN THỨ 2”

- Gọi các kết quả của bài toán:
+ Gọi giá trị mục tiêu tối ưu của bài toán:
> lp.transport(mt_cuoc, ”min”, qh_h, hs_h, qh_c, hs_c) 

 Trên màn hình xuất hiện: Success: the objective function is 12140 (giá trị mục tiêu tối ưu bằng
12140)
+ Gọi phương án tối ưu của bài toán:
> lp.transport(mt_cuoc, ”min”, qh_h, hs_h, qh_c, hs_c)$solution 

 Trên màn hình xuất hiện:
[,1] [,2] [,3] [,4]
[1,] 50 0 120 0
[2,] 80 0 0 120
[3,]

0 160 0 20

Đây là ma trận phương án tối ưu của bài tốn.
2.3. Kết quả 3:
Ngồi các package để giải bài tốn QHTT, thì R cịn cung cấp một số package để giải bài tốn quy
hoạch tồn phương (package “quadprog”) và bài toán quy hoạch phi tuyến (package “Rsolnp”). Bạn đọc
nào quan tâm có thể nghiên cứu các bài tốn trên và tìm hiểu việc giải bẳng R từ mục “Help” của chương
trình. Chúng tơi hẹn một dịp khác có thể trình bày chi tiết vấn đề này.
3. Bàn luận:
3.1. Bàn luận 1:
Đến đây chúng tôi muốn khẳng định lại một lần nữa khả năng đa dạng của R trong việc ứng dụng
vào các lĩnh vực khác nhau, đặc biệt là vào toán ứng dụng. Và trong mỗi ững dụng vào một lĩnh vực cụ
thể (như giải bài tốn QHTT trên đây) thì R xây dựng được nhiều package, mỗi package có thư viện lệnh

phong phú, cho phép người dùng thỏa mãn nhiều nhu cầu khi giải quyết vấn đề (Bảng 2 dưới đây là một
ví dụ).
GS. Nguyễn Văn Tuấn (Garvan Institute of Medical Research, Sydney, Australia) là người tiên
phong trong việc phổ biến các ứng dụng của R vào Việt Nam. Hiện nay, chúng tôi cũng đã tổ chức được
một nhóm nghiên cứu về R một cách tồn diện. Trong khn khổ bài báo ngắn này, tôi không hy vọng sẽ
làm thỏa mãn nhiều nhu cầu ứng dụng của R, những ai quan tâm thì có thể liên hệ trao đổi thêm theo địa
chỉ cá nhận của tơi dưới đây. Và sắp tới, nhóm nghiên cứu chúng tôi dự kiến sẽ xuất bản cuốn sách về các
ứng dụng của R vào toán ứng dụng, hiện cuốn sách đã biên soạn xong phần nội dung.
3.2. Bàn luận 2:
Đối với việc giải bài tốn QHTT thì R có một nhược điểm là không mô tả được đầy đủ các bước
giải của thuật tốn đơn hình. Điều này khơng làm thỏa mãn nhu cầu ứng dụng R của các bạn sinh viên,
nhưng với những nhà nghiên cứu, những người sử dụng R trong cơng việc,… thì nhược điểm này khơng
có vấn đề gì, vì việc mơ tả các bước giải đối với họ là không cần thiết.
4. Kết luận:

7


KỶ YẾU HỘI THẢO “CÔNG NGHỆ THÔNG TIN VÀ ỨNG DỤNG CNTT TRONG CÁC LĨNH VỰC – LẦN THỨ 2”

Bài báo đã giới thiệu một ứng dụng của R để giải bài toán QHTT, đây là ứng dụng chưa được khai
thác ở Việt Nam. Chúng tôi hy vọng qua sự giới thiệu này, sẽ là tăng thêm động lực, tình cảm cho những
ai đã, đang và sẽ quan tâm tới những ứng dụng của R. Nhân đây, tôi cũng muốn gửi lời cảm ơn tới các
giảng viên tổ KHTN, Khoa Đại cương, Trường CĐ CNTT hữu nghị Việt – Hàn vì những ủng hộ trong
thời gian qua; gửi lời cảm ơn tới Ban tổ chức hội thảo vì đã tạo ra một diễn đàn có ích cho những người
quan tâm tới ứng dụng CNTT có thể chia sẻ những nghiên cứu của mình

8




×