Modul chƣơng trình

Một phần của tài liệu một số thuật toán giải bài toán phủ tập hợp và ứng dụng (Trang 65 - 76)

3.2.2.1. Modul tìm chi phí tối ưu nhất bằng phương pháp tham lam

Với đầu vào là danh sách chi phí đƣợc cho bởi mảng c, mỗi bƣớc của thủ tục sẽ tìm mức chi phí nhỏ nhất chƣa đƣợc xét giả sử là ci, mức chi phí này sẽ tƣơng ứng với việc chúng ta chọn bác sĩ i là ngƣời tiếp theo đƣợc xem xét để xếp lịch.

public int FindMinimumCost(int[] c, int n) {

int vt = -1;

int min = MAXCOST; for (int i = 0; i < n; i++) { if (consider[i]) continue; if (min > c[i]) { min = c[i]; vt = i; } } return vt; }

3.2.2.2. Modul phân lịch trực bằng phương pháp tham lam

Đầu vào của thủ tục là danh sách các bác sĩ và những dịch vụ mà bác sĩ đó có thể phục vụ đƣợc cho bởi mảng ds, danh sách chi phí C. Mỗi khi tìm đƣợc bác sĩ kế tiếp có chi phí phục vụ nhỏ nhất chúng ta sẽ cập nhật lại mảng price. Kết quả của

thủ tục sẽ trả về mảng kiểu số nguyên x trong đó mỗi phần tử thứ i của mảng x sẽ

nhận giá trị 1 tƣơng ứng với bác sĩ i đƣợc xếp lịch phục vụ và bằng 0 trong trƣờng hợp ngƣợc lại.

private int[] ScheduleDoctor(ArrayList[] ds, int[] C,float [] price) {

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ int[] x = new int[ds.Count()];

for (int i = 0; i < x.Length; i++) x[i] = 0; ArrayList dsC = new ArrayList();

int m = price.Length, n = ds.Count(); while (dsC.Count < m)

{

int sdoctor = FindMinimumCost(C, n, dsC); x[sdoctor] = 1;

ArrayList temp = SubElement(ds[sdoctor], dsC); float cost = (float)C[sdoctor] / temp.Count; consider[sdoctor] = true;

foreach (int z in temp) { price[z] = cost; dsC.Add(z); } } return x; }

3.2.2.3. Modul tìm chi phí tối ưu nhất bằng phương pháp nhánh cận

Đầu vào của thủ tục bao gồm mảng x trong đó mỗi phần tử thứ i của mảng sẽ nhận giá trị 1 hoặc 0 tƣơng ứng với việc bác sĩ i đƣợc xem xét phục vụ hoặc không. Phần tử đƣợc lựa chọn để xem xét selected trong mảng x, mức chi phí tƣơng ứng

với nhánh hiện tại countselected, mảng chi phí phải trả cho các bác sĩ C, danh sách các dịch vụ U, danh sách các bác sĩ và các dịch vụ mà bác sĩ đó có thể phục vụ listSets. Sau khi thủ tục kết thúc, giải pháp tối ƣu sẽ đƣợc lƣu trữ trong mảng result.

Dựa vào mảng result ta có thể biết đƣợc bác sĩ i có đƣợc sử dụng (result[i]=1) hoặc không đƣợc sử dụng (result[i]=0). Từ đó chúng ta có thể biết đƣợc tổng chi phí mà bệnh viện sẽ chi trả ứng với giải pháp tối ƣu là bao nhiêu.

public static void branchAndBound(ref int[] x, int selected,

int countselected,int[] C, ArrayList U, List<ArrayList> listSets) {

// Nếu bác sĩ đang xét được chọn thì tính lại chi phí if (x[selected] == 1) countselected += C[selected]; ArrayList univers = new ArrayList();

univers.AddRange(U);

ArrayList selectedSet = new ArrayList();

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ if(x[selected] == 1)

foreach (Object o in selectedSet) univers.Remove(o); if (univers.Count == 0)

{

// Nếu giải pháp tìm được tốt hơn giải pháp hiện thời thì cập nhật lại if (countselected < bestSoFar)

{

bestSoFar = countselected; for (int i = 0; i < x.Length; i++) {

result[i] = x[i]; }

} }

if (selected == x.Length - 1) return; x[selected + 1] = 1;

// Phân nhánh kế tiếp

if (countselected + C[selected+1] < bestSoFar) {

branchAndBound(ref x, selected + 1, countselected, C, univers, listSets); }

x[selected + 1] = 0;

branchAndBound(ref x, selected + 1, countselected, C, univers, listSets); }

Một phần của tài liệu một số thuật toán giải bài toán phủ tập hợp và ứng dụng (Trang 65 - 76)

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

(76 trang)