CÁO TRỰC TUYẾN EASY- OP
Tổng quan về phần mềm
Dựa trên những kiến thức em nghiên cứu được, cho thấy việc tối ưu hóa quảng cáo trên máy tìm kiếm Google phải được thực hiện bằng việc tối ưu mục mô tả quảng cao và thống kê những từ khóa có số lượng clicks lớn nhất, số cost bé nhất. người dùng chọn một file đầu vào là một file CSV được convert từ kết quả chiến dịch. Và màn hình sẽ hiển thị những từ khóa ứng với yêu cầu là nhiều clicks nhất và chi phí (cost) thấp nhất. Kiến trúc của hệ thống được xây dựng dựa theo các thành phần sau:
- FileLoader: Đọc file CSV để lấy dữ liệu đầu vào.
- KeywordProcess: Xử lý và chọn keywords, tính toán trong cả bộ từ khóa, tìm ra keywords có click nhiều nhất, mức cost thấp nhất, liệt kê theo ngày và đưa ra mức bid hợp lý nhất
- Xuất kết quả ra màn hình.
FileLoader: Đọc file CSV để lấy dữ liệu đầu vào.
Với một chương trình mang tính thống kê, việc sử đụng được các file có tính thống kê như Excel hay các chương trình bảng tính thông thường.
Chức năng này được hoàn thiện bởi sử dụng phương thức đọc theo dấu phấy, lấy dấu phẩy là quy ước ngăn cách, và ngăn cách theo dòng.
while ((thisLine = myInput.readLine()) != null) {
//while ((thisLine = myInput.readUTF()) != null) { //beginning of outer while loop
count ++;
if (count == 1) continue;
DataSource buffer = new DataSource();
StringTokenizer st =new StringTokenizer(thisLine,",");// read the current line
try { // Set Date
DateFormat formatter = new SimpleDateFormat("m/d/y"); buffer.SetDate(formatter.parse(st.nextToken())); } catch (ParseException e) { System.out.println("Exception :" + e); } buffer.SetKeyword(st.nextToken()); buffer.SetQualityScore(new Integer(st.nextToken())); buffer.SetCPC(new Double(st.nextToken().substring(1))); buffer.SetImpression(new Integer(st.nextToken())); buffer.SetClicks(new Integer(st.nextToken())); String a = st.nextToken(); a = a.substring(0, a.length() - 1); Double b = new Double(a) * 100; b = b.intValue() * 0.0001; buffer.SetCTR(b); buffer.SetAvgCPC(new Double(st.nextToken().substring(1))); buffer.SetCost(new Double(st.nextToken().substring(1))); buffer.SetPosition(new Double(st.nextToken())); dataSource.add(buffer);
}
KeywordProcess: Xử lý, chọn Keywords, tính toán cả bộ từ khóa, tìm ra keywords có clicks nhiều nhất, mức cost thấp nhất, liệt kê theo ngày, đưa ra mức bid hợp lý nhất.
Bằng thuật toán quy hoạch động. Với yêu cầu lấy được bộ keywords với số lượng clicks lớn nhất và mức cost nhỏ nhất ứng với ngân sách budget cho sẵn
public static ArrayList<DataSource> optimizationRound(int budget, ArrayList<DataSource> listSource) {
if (budget > 10000) return null;
for (int i = 0; i < listSource.size(); i++) {
listSource.get(i).SetCost(Math.ceil(listSource.get(i).GetCost())); }
int[][] opt = new int[listSource.size() + 1][budget + 1]; boolean[][] sol = new boolean[listSource.size() + 1][budget + 1];
for (int n = 1; n <= listSource.size(); n++) { for (int w = 1; w <= budget; w++) { // don't take item n
int option1 = opt[n-1][w]; // take item n
int option2 = Integer.MIN_VALUE;
if ((int)listSource.get(n - 1).GetCost() <= w) option2 = listSource.get(n - 1).GetClicks() + opt[n-1][w - (int)listSource.get(n - 1).GetCost()];
// select better of two options
opt[n][w] = Math.max(option1, option2); sol[n][w] = (option2 > option1);
} } }
Và sau đó đưa vào Mảng để chờ xuất ra // determine which items to take
boolean[] take = new boolean[listSource.size() + 1]; for (int n = listSource.size(), w = budget; n > 0; n--) {
if (sol[n][w]) { take[n] = true; w = w - (int)listSource.get(n - 1).GetCost(); } else { take[n] = false; }
}
int size = listSource.size();
for (int n = size; n > 0; n--) {
if (!take [n]) listSource.remove(n - 1); }
return listSource; }
Mức bid sẽ chính bằng trung bình cost chia cho trung bình clicks Bid = avrgCost1/avrgClicks1;
Ngày và tháng được xuất ra cùng dòng với keyword for (int i = 0; i < result.size(); i ++) {
System.out.println("---");