Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 8

ĐẠI HỌC ĐÀ NẴNG

TRƯỜNG ĐẠI HỌC BÁCH KHOA


KHOA ĐIỆN

TOÁN NÂNG CAO


PHƯƠNG PHÁP SIMPLEX

Nhóm: 20.36
Giảng viên: TS. Trần Thị Minh Dung
Sinh viên thực hiện:Lê Đức Thắng
Mã SV: 105200385
Lớp: 20TDHCLC1
I.GIỚI THIỆU VỀ PHƯƠNG PHÁP SIMPLEX:

Phương pháp đơn giản còn được gọi là kỹ thuật đơn giản hoặc thuật toán đơn giản được
phát triển bởi G.B. Dantzeg, Một nhà toán học người Mỹ. Phương pháp Simplex phù hợp để
giải các bài toán quy hoạch tuyến tính với số lượng biến lớn. Phương pháp này thông qua
một quá trình lặp đi lặp lại, dần dần tiếp cận và cuối cùng đạt đến giá trị tối đa hoặc tối thiểu
của hàm mục tiêu.

II.NGUYÊN LÝ CỦA PHƯƠNG PHÁP :

Không thể có được lời giải đồ họa cho bài toán LP có nhiều hơn hai biến. Vì những lý do
này, quy trình lặp toán học được gọi là 'Phương pháp đơn giản' đã được phát triển. Phương
pháp đơn hình có thể áp dụng cho bất kỳ bài toán nào có thể được xây dựng dưới dạng hàm
mục tiêu tuyến tính tuân theo một tập hợp các ràng buộc tuyến tính.

Phương pháp đơn hình cung cấp một thuật toán dựa trên định lý cơ bản của quy hoạch tuyến
tính. Điều này nói lên rằng “lời giải tối ưu cho một bài toán quy hoạch tuyến tính nếu nó tồn
tại, luôn xảy ra ở một trong các điểm góc của không gian lời giải khả thi”.

Phương pháp đơn hình cung cấp một thuật toán có hệ thống bao gồm việc chuyển từ giải
pháp khả thi cơ bản này sang giải pháp khả thi cơ bản khác theo cách quy định sao cho giá
trị của hàm mục tiêu được cải thiện. Quá trình nhảy từ đỉnh này sang đỉnh khác được lặp lại.
Thuật toán đơn giản là một thủ tục lặp đi lặp lại để giải các bài toán LP.

Nó bao gồm:

(i) Có nghiệm cơ bản khả thi thử nghiệm phương trình ràng buộc

(ii) Kiểm tra xem đó có phải là giải pháp tối ưu hay không,

(iii) Cải tiến giải pháp thử nghiệm đầu tiên bằng cách lặp lại quy trình cho đến khi thu được
giải pháp tối ưu.

III.THUẬT TOÁN PHƯƠNG PHÁP SIMPLEX:

Thuật toán đơn giản (dạng tối thiểu hóa) Từng bước với Tableaus có thể được tóm tắt bằng
các bước sau:

Bước 0. Hình thành một hoạt cảnh tương ứng với một giải pháp khả thi cơ bản (BFS). Ví
dụ: nếu chúng ta giả sử các biến cơ bản là (theo thứ tự) x 1, x2, . . . xm, bảng đơn giản có dạng
ban đầu được hiển thị bên dưới:
x1 x2 ... xm xm+1 xm+2 ... xj ... xn RHS
1 0 ... 0 a¯ 1,m+1 a¯1,m+2 . . . a¯1j ... a¯1n ¯b1
0 1 ... 0 a¯2,m+1 a¯2,m+2 . . . a¯2j ... a¯2n ¯b2
.
0 0 ... 0 a¯i,m+1 a¯i,m+2 ... a¯ij ... a¯in ¯bi
.
0 0 ... 1 a¯m,m+1 a¯m,m+ ... a¯ ... a¯mn ¯bm
2 mj
0 0 ... 0 c¯m+1 c¯m+2 ... c¯j ... c¯n (−z)

Bước 1. Nếu mỗi c¯j ≥ 0 thì dừng; giải pháp cơ bản khả thi hiện nay là tối ưu
Bước 2. Chọn q sao cho c¯q < 0 để xác định biến không cơ bản nào trở thành biến cơ bản.
ước 3. Tính các tỉ số ¯bi/a¯iq cho a¯iq > 0, i = 1, 2, . . . , tôi . Nếu không có a¯iq > 0, dừng
lại: vấn đề không bị giới hạn. Ngược lại, chọn p làm chỉ số i tương ứng với tỷ lệ tối thiểu,
tức là
−¿ −¿
bp bi −¿¿
−¿ ¿ =min ¿,a >0
a pq ¿ ai q−¿ ¿ iq

Bước 4. Xoay quanh phần tử thứ pq, cập nhật tất cả các hàng, bao gồm cả hàng z. Quay lại
Bước 1.
Ví dụ
Max 6x1 + 14x2 + 13x3

S.T

0,5x1 + 2x2 + x3 ≤24

x1 + 2x2 + 4x3 ≤60

x≥0

Quan sát: Ở dạng chuẩn, tất cả các biến đều không âm và RHS cũng không âm.

Phương pháp đơn hình được thực hiện từng bước cho bài toán này trong bảng dưới đây.
Hàng và cột xoay được biểu thị bằng các mũi tên; phần tử trụ được in đậm. Chúng ta sử
dụng quy tắc tham lam để chọn biến vào, tức là chọn biến có hệ số âm nhất để vào cơ sở.
Tableau I

BASIS x1 x2 x3 x4 x5 RHS Ratio Pivot


x4 0.5 2 1 1 0 24 12 →
x5 1 2 4 0 1 60 30
(−z) -6 -14 -13 0 0 0
Pivot ↑
Tableau II

BASIS x1 x2 x3 x4 x5 RHS Ratio Pivot


x2 0.25 1 0.5 0.5 0 12 24
x5 0.5 0 3 -1 1 36 12 →
(−z) -2.5 0 -6 7 0 168
Pivot ↑
Tableau III

BASIS
x1 x2RHS
x3 x4 x5 Ratio Pivot
x2 1/6 1 60 2/3 -1/6 36.0 →
x3
1/6 0 1 -1/3 1/3 12 72
(−z) -1.5 0 0 5 2 24
Pivot ↑
Tableau IV

BASIS x1 x2 x3 x4 x5 RHS
x1 1 6 0 4 -1 36
x3 0 -1 1 -1 0.5 6
(−z) 0 9 0 11 0.5 294
Do đó, giá trị tối ưu của công thức tối thiểu là z = 294. Điều này có nghĩa là giá trị tối
ưu của công thức tối đa hóa ban đầu là z = 294. Lời giải tối ưu là x = (36, 0, 6, 0, 0).

IV.CODE MATLAB

Input : % Khởi tạo bảng Simplex ban đầu (Tableau I)


tableau = [
0.5, 2, 1, 1, 0, 24;
1, 2, 4, 0, 1, 60;
-6, -14, -13, 0, 0, 0;
];

Output: optimal_solution = tableau(end, end);


optimal_variables = tableau(1:end-1, end);
display("Optimal Value: " + optimal_solution);
display("Optimal Variables:");
display(optimal_variables);

clc;close all ;
% Khởi tạo bảng Simplex ban đầu (Tableau I)
tableau = [
0.5, 2, 1, 1, 0, 24;
1, 2, 4, 0, 1, 60;
-6, -14, -13, 0, 0, 0;
];

% Bước 1: Tính toán cho Tableau I


display("Tableau I");
display(tableau);
display(" ");

% Bước 2: Chọn cột pivot (theo greedy rule: chọn hệ số âm lớn nhất)
[entering_col, entering_col_index] = min(tableau(end, 1:end-1));

while entering_col < 0


% Tìm hàng pivot (chọn dòng có tỷ lệ dương nhỏ nhất)
ratios = tableau(1:end-1, end) ./ tableau(1:end-1, entering_col_index);
ratios(ratios < 0) = inf;
[leaving_row, leaving_row_index] = min(ratios);

% Bước 3: Pivot và cập nhật bảng


pivot = tableau(leaving_row_index, entering_col_index);
tableau(leaving_row_index, :) = tableau(leaving_row_index, :) / pivot;
for i = 1:size(tableau, 1)
if i ~= leaving_row_index
tableau(i, :) = tableau(i, :) - tableau(i, entering_col_index) *
tableau(leaving_row_index, :);
end
end

% Hiển thị bước thực hiện


display("Pivot Column: " + entering_col_index + " Pivot Row: " +
leaving_row_index);
display(tableau);
display(" ");

% Chọn cột pivot tiếp theo


[entering_col, entering_col_index] = min(tableau(end, 1:end-1));
end

% Kết quả cuối cùng


display("Final Tableau:");
display(tableau);

% In ra giá trị tối ưu và giá trị của các biến


optimal_solution = tableau(end, end);
optimal_variables = tableau(1:end-1, end);
display("Optimal Value: " + optimal_solution);
display("Optimal Variables:");
display(optimal_variables);
V.TOOLBOX MATLAB
clc;
% Bài toán tối ưu
f = [-6, -14, -13, 0, 0]; % Hàm mục tiêu cần tối ưu

Aeq = [0.5, 2, 1, 1, 0; 1, 2, 4, 0, 1]; % Ma trận ràng buộc


beq = [24; 60]; % Vector b

lb = zeros(5, 1); % Giới hạn dưới cho các biến >= 0

% Sử dụng hàm linprog để giải bài toán tối ưu


[x, fval, exitflag] = linprog(f, [], [], Aeq, beq, lb);

if exitflag == 1
disp('Tìm thấy giải pháp tối ưu:');
disp('Giá trị biến:');
disp(x);
disp('Giá trị tối ưu:');
disp(-fval); % Đổi dấu về giá trị tối ưu thực sự
else
disp('Không tìm thấy giải pháp tối ưu');
end
VI.NHẬN XÉT

Cả 2 phương pháp đều ra 1 kết quả x = (36, 0, 6, 0, 0) tối ưu và max f =294

You might also like