Giải thuật đưa banner quảng cáo ra trang Web

Một phần của tài liệu THIẾT KẾ VÀ HIỆN THỰC CHƯƠNG TRÌNH QUẢN LÝ QUẢNG CÁO TRÊN TRANG WEB.doc (Trang 67 - 69)

1. Giải thuật tạo ra số ngẫu nhiên :

Theo phương pháp đồng dư tuyến tính - một phương pháp tạo số ngẫu nhiên của D.Lehner, ta cĩ đoạn chương trình tạo ra N số ngẫu nhiên cho mảng A như sau:

a[0] := seed;

for i := 1 to N do a[i]:=(a[i-1]*b + 1) mod m; với ba hằng số : seed, b và m

trong thuật tốn này, để tạo số ngẫu nhiên mới, ta dùng số trước đĩ nhân với b, cộng thêm 1, và lấy phần dư trong phép chia cho m. Như vậy số nhận được luơn nằm trong đoạn từ 0 tới m -1.

Tuy nhiên, trên thực tế các số khơng thực sự ngẫu nhiên, nhưng cũng cĩ thể hữu dụng như sự xấp xỉ của các số ngẫu nhiên - các số này thường được gọi là các số giả ngẫu nhiên (pseudo-random)

Một trong những vấn đề đặt ra là việc chọn ba hằng số trên như thế nào. Trước hết, m nên lớn, cĩ thể là giá trị tối đa của một word, tuy nhiên nếu khơng cần thiết cũng khơng hồn tồn phải lớn như vậy. Thường chọn m là lũy thừa của 10 hay 2, ở đây ta chọn m. Thứ hai, b khơng quá lớn cũng khơng quá nhỏ (người ta hay chọn b cĩ ít hơn m một chữ số). Thứ ba, b là một hằng số tùy ý khơng theo một mẫu riêng nào cả, ngoại trừ nĩ nên kết thúc bởi ...x21, với x chẵn (điều này tránh được một vài sự cố cĩ thể xảy ra mà các phân tích tốn học cịn để hở).

Những quy luật nêu trên được phát triển bởi D.E.Knuth. Knuth chứng minh rằng các lựa chọn này làm cho phương pháp đồng dư tuyến tính tạo ra các số ngẫu nhiên tốt, thoả mãn được nhiều kiểm tra thống kêphức tạp.

Áp dụng giải thuật vào chương trình : Đầu tiên ta chọn số seed :

var now = new Date(); var seed = now.getTime();

- hàm Date() trả về ngày tháng hiện tại.

- hàm getTime() trả về thời gian (milli giây) tính từ 00h:00m:00s ngày 1/1/1970 cho tới thời điểm hiện tại gọi hàm này.

Do đĩ sau dịng chương trình trên, ta sẽ cĩ seed là một số rất lớn. Để bảo đảm cho số nhận được là số 32 bit (luơn nhỏ hơn hoặc bằng FFFFFFFF), ta lấy phần dư của phép tốn : seed (mod) 0xFFFFFFFF

Như vậy, ta sẽ cĩ : seed = now.getTime() % 0xFFFFFFFF

Chọn m và b là các số theo quy luật đã nêu ở trên :

m = 0x7FFFFFFF và b = 0x015A4E21

Cho nên seed bây giờ (ta gọi là seed2) sẽ được tính theo cơng thức :

seed2 = (seed * 0x015A4E21) % 0x7FFFFFFF

phép tính trên cũng bảo đảm được rằng seed2 luơn nhỏ hơn seed và khơng tồn tại các chữ số từ A-F trong những số được sinh ra.

Để nhận được một chuỗi các số ngẫu nhiên đủ nhỏ (nhỏ hơn hoặc bằng 5 chữ số) , ta lấy seed2 nhận được chia cho 2^16 (tương đương 10000h). Sẽ khơng bao giờ tồn tại số âm trong kết quả vì ta đã kiểm tra được seed2 luơn nhỏ hơn seed.

Để bảo đảm các số nhận được luơn nhỏ hơn 100000h -1, ta tiếp tục lấy phần dư của kết quả nhận chia cho 100000H :

result = (seed >> 16 ) % 100000

Lưu ý: phép dịch phải 1 lần tương đương với phép chia cho 2 lũy thừa. Ví dụ : x >>1 tương đương với x/2.

x>>2 tương đương với x/4 .

Đây chính là các danh hiệu duy nhất được gán cho các ad banner cĩ trọng số tương đương nhau mỗi khi chúng xuất hiện.

Trọng số của các ad banners trong nhĩm:

Cách thức mà AdServer đưa một ad banner ra trang Web khơng dựa trên campaign mà dựa trên nhĩm. Chính từ một nhĩm, một ad banner với trong số xác định sẽ được chọn và được target trên Web site. Một nhĩm chứa nhiều ad banners thuộc nhiều Advertiser. Nếu ta gán trọng số ở mức Campaign của Advertiser, thì ta sẽ khơng thể so sánh trọng số của một ad banner trong Campaign này với trọng số của ad banner khác trong Campaign của Advertiser khác.

Việc đưa ad banner ra trang Web phụ thuộc vào trọng số của chúng. Ad banners cĩ trọng số càng lớn thì khả năng xuất hiện càng cao.

2. Giải thuật chọn ad banner trong một nhĩm:

Hai ad banner kế cận nhau thì nên khác nhau, các ad banner được chọn theo ID của chúng (duy nhất).

Việc chọn ad banner cịn phụ thuộc vào trọng số của ad banner. Ta sẽ xét trọng số của từng ad banner trên tổng trọng số của tất cả ad banner trong một nhĩm. (adsbygoogle = window.adsbygoogle || []).push({});

Thuật giải được hiện thực trong hàm “Get_Random_Ad()”

o Database : Groups và GroupBanners. o Xét một ad banner X trong nhĩm nào đĩ.

o Ta sẽ xét các nhĩm con của nĩ (bằng cách kiểm tra Group_ID). Nếu khơng cĩ nhĩm con thì ad banner X sẽ được đưa ra.

o Nếu cĩ nhĩm con, xét danh sách nhĩm con – gọi danh sách này là S.

o Nếu banner X khơng tồn tại (rỗng) thì sẽ thực thi lệnh SQL chọn tất cả record trong bảng GroupBanners với Group_ID thuộc danh sách S

o Ngược lại, sẽ thực thi lệnh SQL chọn chọn tất cả record trong bảng GroupBanners với Group_ID thuộc danh sách S và Banner_ID khác với ID của Banner X.

* Thực thi lệnh SQL :

o Mở Database tương ứng. Nếu cĩ lỗi xảy ra thì đĩng database và trả về banner X.

o Duyệt tất cả các record trong bảng GroupBanners.

* Gọi trọng số của ad banner là W (Weight). Gọi số thứ tự record là Recc. Trường hợp xấu nhất là khi trong nhĩm tồn tại 100 ad banner, mỗi ad banner cĩ W = 1. Tuy nhiên, trên thực tế điều này rất khĩ xảy ra. Ta tạo một mảng chứa 100 phần tử đại diện cho 100% của trọng số, cĩ tên là arrWeight[100].

Đặt 2 biến ZeroWeight và TotalWeight là 2 biến tương ứng khi W=0 hoặc W=100. Khi chưa đi tới cuối bảng, tăng Recc lên 1 :

- Nếu W = 0 thì tăng ZeroWeight lên 1.

- Ngược lại : arrWeight[TotalWeight] = Recc và tăng biến TotalWeight lên 1.

- Nếu Recc = 0 thì đĩng database và trả về ad banner X.

- Nếu Recc = 1 thì Banner ID trả về sẽ là ad banner duy nhất được chọn trong GroupBanners.

- Nếu Recc > 1 :

+ Gọi “temp” là một số ngẫu nhiên theo thời gian (hàm rand()). Gọi rand_num là một biến đại diện cho số ngẫu nhiên. Ta sẽ chọn ad banner bất kỳ nằm trong số những ad banner thuộc nhĩm.

+ Nếu như TotalWeight = 0 thì rand_num = (temp mod Recc) + 1. Phép tốn này bảo đảm rằng rand_num luơn nằm trong đoạn từ 0 tới Recc.

+ Nếu TotalWeight > 0 thì :

rand_num = arrWeight[(temp) mod (TotalWeight)]

vì kết quả của phép tốn mod ở trên luơn nhỏ hơn ToTalWeight nên số rand_num luơn chọn được trong mảng arrWeight.

Dù trong bất kỳ trường nào, con số rand_num được chọn luơn nằm trong đoạn từ 0 tới 100, phù hợp với cách đặt trọng số của ad banner.

- Định vị trí của ad banner trên record tương ứng với số rand_num đã xác định (sử dụng hàm SetAbsolutePosition())

- Banner ID ở kết quả trả về là Banner ID nhận được dựa trên truy xuất database tại vị trí trên.

Một phần của tài liệu THIẾT KẾ VÀ HIỆN THỰC CHƯƠNG TRÌNH QUẢN LÝ QUẢNG CÁO TRÊN TRANG WEB.doc (Trang 67 - 69)