Thiết kế tầng xử lý chính

Một phần của tài liệu Nghiên cứu và phát triển giải pháp gán việc giảm chi phí trên nền điện toán đám mây (Trang 35 - 37)

c. Đặc tả các usecase

3.2.4 Thiết kế tầng xử lý chính

Sau khi tiền xử lý hệ thống có được ma trận chi phí, ta gọi là C. Khi đó hệ thống phải giải bài toán sau đây:

Cực tiểu hàm mục tiêu sau: ∑

i=0 N−1 ∑ j=0 M−1 cijxij Ràng buộc i. ∀i,i =0,1,…,N-1; ∑ j=0 M−1 xij=1; ii. ∀j, j =0,1,…,M-1; xiji=0 N−1 ¿/N ; y ≥¿ iii. ∑ j=0 M−1 yjK;

iv. xij , y j là số nhị phân;

Ta chọn mã nguồn mở FlopC++ để tìm nghiệm của bài toán này. Phần tiếp theo sẽ làm rõ hơn về FlopC++

a.FlopC++ là gì ?

FlopC++ là ngôn ngữ mô hình đại số mã nguồn mở (open source algebraic modeling language), được viết từ thư viện C++.

Dùng FlopC++ , những mô hình tối ưu tuyến tính (linear optimization models) có thể đặc tả một cách đơn giản vì ngôn ngữ này tự động chuyển bài toán thành dạng ma trận để các chương trình tính (solver) có thể đọc được.

b.CBC là gì ?

CBC là một MILP solver mã nguồn mở được phân phối dưới dự án COIN-OR. Nó được xây dựng từ nhiều thành phần trong dự án COIN, bao gồm COIN-OR linear programming solver (CLP) và Coin Cut Generation Library (CGL). Nó có thể được dùng như một thư viện hay một solver độc lập.

c.Branch and Cut là gì ?

Figure Minh họa Branch and cut

Bước 1: (Bound) các biến hiện thời bị ràng buộc là những số nguyên được nới lỏng (relax) ràng buộc số nguyên tạo ra một bài toán mới . Bài toán mới này được đưa sang cho LP (linear program) solver giải để tìm cận dưới (low bound) giá trị của hàm mục tiêu. Nếu nghiệm đạt được đều là số nguyên thì giải thuật kết thúc. Nếu không, giải thuật tìm đến những nghiệm kế cận xung quanh.

Bước 2: (Branch) Nếu còn tồn tại một biến có giá trị không phải là số nguyên. Chọn một biến chưa nguyên thì phải chia trường hợp con (branching), hay node. Trường hợp thứ nhất là gán giá trị là số nguyên nhỏ kế cận. Trường hợp thứ hai là gán giá trị là số nguyên lớn kế cận. VD x = 1.3 là chưa nguyên. Trường hợp 1, gán x = 1. Trường hợp 2, gán x = 2. Hai trường hợp này sẽ tương đương với 2 node ta thêm vào trong cây tìm kiếm (search tree).

Bước 4: (Re-optimize LP) Tiếp tục nới lỏng để tạo bài toán LP (linear program) mới và giải nó.

Bước 5 (Bound) Kiểm tra nghiệm LP mới tìm ra và tìm cách cắt nhánh bằng cách sau:

 Nếu LP không thể ra nghiệm (infeasible) cắt nhánh đó.

 Nếu nghiệm của node vượt qua cận trên hiện thời thì cắt.

 Nếu nghiệm của node không vượt cận trên và thỏa ràng buộc nguyên. Cập nhật cận trên và nghiệm tối ưu mới.

Bước 6: (Branch) Nếu không thể cắt nhánh thì tiếp tục phân nhánh (branching) như bước 2.

Bước 7: Kiểm tra cây có rỗng hay chưa. Nếu chưa rỗng quay lại bước 3.

d. Áp dụng để giải bài toán của đề tài

Tạo hàm mục tiêu, ta làm như sau:

MP_expression totalCost = sum(G(i)*P(j),COST(i,j)*x(i,j));

Tạo các ràng buộc

MP_constraint oneProvider(G), choosing(P), maxProviders;

oneProvider(i) = sum(P(j),x(i,j))==1; choosing(j) = n*y(j)>= sum(G(i),x(i,j)); maxProviders = sum(P(j),y(j))<= maxP;

Gọi solver để giải:

MP_model model(new OsiCbcSolverInterface);

model.add(oneProvider).add(choosing).add(maxProviders); model.verbose();

model.minimize(totalCost); 3.3 THỰC HIỆN

Một phần của tài liệu Nghiên cứu và phát triển giải pháp gán việc giảm chi phí trên nền điện toán đám mây (Trang 35 - 37)

Tải bản đầy đủ (DOCX)

(70 trang)
w