Giới thiệu về Javascript và NodeJS

Một phần của tài liệu (LUẬN văn THẠC sĩ) phát triển thuật toán tìm đường cho nền tảng cung cấp dịch vụ địa chỉ việt nam​ (Trang 25)

2.5.1. Giới thiệu, lịch sử phát triển Javascript

Cùng thời điểm Netscape bắt đầu sử dụng công nghệ Java trên trình duyệt Netscape, LiveScript đã được đổi tên thành JavaScript để được chú ý hơn bởi ngôn ngữ lập trình Java lúc đó đang được coi là một hiện tượng [15]. JavaScript được bổ sung vào trình duyệt Netscape bắt đầu từ phiên bản 2.0b3 của trình duyệt này vào tháng 12 năm 1995. Trên thực tế, hai ngôn ngữ lập trình Java và JavaScript không có liên quan gì đến nhau, ngoại trừ việc cú pháp của cả hai ngôn ngữ cùng được phát triển dựa trên cú pháp của C. JavaScript gồm 2 mảng là client-server thực hiện lệnh trên máy của end-user và web- server.

Sau thành công của JavaScript, Microsoft bắt đầu phát triển JScript, một ngôn ngữ có cùng ứng dụng và tương thích với JavaScript. JScript được bổ sung vào trình duyệt Internet Explorer bắt đầu từ Internet Explorer phiên bản 3.0 được phát hành tháng 8 năm

1996. JavaScript là một ngôn ngữ lập trình website, được tích hợp và nhúng trong HTML giúp website sống động. JavaScript cho phép kiểm soát các hành vi của trang web tốt hơn so với khi chỉ sử dụng HTML. JavaScript là ngôn ngữ lập trình được hỗ trợ hầu như trên tất cả các trình duyệt như Firefox, Chrome... thậm trí các trình duyệt trên thiết bị di động.

2.5.2 Giới thiệu về NodeJS

NodeJS là một nền tảng mã nguồn mở được xây dựng trên nền tảng Javascript V8 Engine của Chrome, được sử dụng để phát triển các ứng dụng Web. NodeJS sử dụng cơ chế hướng sự kiện , mô hình vào/ra không khóa, điều này làm cho NodeJS gọn nhẹ và hiệu quả. Các ứng dụng NodeJS được viết bằng Javascript và có thể chạy trên nhiều nền tảng khác nhau như OS X, Microsoft Windows và Linux. NodeJS cung cấp các thư viện phong phú ở dạng các mô-đun khác nhau giúp đơn giản hóa việc lập trình và giảm thời gian ở mức thấp nhất [16].

NodeJS được tạo bởi Ryan Dahl từ năm 2009, và phát triển dưới sự bảo trợ của Joyent . NodeJS được tạo lần đầu cho hệ điều hành Linux sử dụng. Nó được phát triển và bảo trì vởi Ryan Dahl và được tài trợ bởi Joyent Trong năm 2011, một bộ phần package manager đã giới tiệu bộ thư viện cho NodeJS gọi là npm. Tháng 6 năm 2011, Microsoft hợp tác với Joyent để tạo ra bản cho Windows. Tháng 12, Do xung đột nội bộ nên NodeJS bị chia rẽ, IO.js được hình thành [16].

Những lý do để sử dụng NodeJS:

• Bất đồng bộ và hướng sự kiện: Tất cả API của các thư viện NodeJS đều bất đồng bộ. Về cơ bản, nó có nghĩa là một máy chủ NodeJS không bao giờ chờ một API trả về dữ liệu. Máy chủ sẽ chuyển sang API tiếp theo sau khi gọi một API và cơ chế thông báo sự kiện của NodeJS giúp máy chủ nhận được phản hồi từ cuộc gọi API trước đó.

NodeJS sử dụng một chương trình luồng duy nhất và cùng một chương trình có thể cung cấp dịch vụ cho một số lượng yêu cầu lớn hơn so với các máy chủ kiểu truyền thống như Apache HTTP Server.

• Không đệm: Các ứng dụng NodeJS không bao giờ đệm dữ liệu.

• Thời gian thực: ở đây chính là xử lý giao tiếp từ máy khách tới máy chủ theo thời gian thực.

2.6. Giới thiệu về Python và các thư viện, bộ thư viện sử dụng 2.6.1. Giới thiệu về Python 2.6.1. Giới thiệu về Python

Python là ngôn ngữ lập trình bậc cao, dùng để phát triển website và nhiều ứng dụng khác nhau. Python được ra bởi Guido van Rossum và được phát triển trong dự án mã nguồn mở [17]. Python đã được hình thành vào cuối những năm 1980, và việc thực hiện nó vào tháng 12 năm 1989 bởi Guido van Rossum tại Centrum Wiskunde & Informatica (CWI) ở Hà Lan như là một kế thừa cho ngôn ngữ ABC (tự lấy cảm hứng từ SETL) có khả năng xử lý ngoại lệ và giao tiếp với Hệ điều hành Amoeba. Van Rossum là tác giả chính của Python, và vai trò trung tâm của ông trong việc quyết định hướng phát triển của Python [17].

Python 2.0 đã được phát hành vào ngày 16 tháng 10 năm 2000 và có nhiều tính năng mới, bao gồm bộ thu gom rác theo chu kỳ và hỗ trợ Unicode. Với việc phát hành này quá trình phát triển đã được thay đổi và trở nên minh bạch hơn và cộng đồng hậu thuẫn. Python 3.0 được phát hành năm 2008, sau một thời gian dài thử nghiệm. Cho tới năm 2017, Python đang có phiên bản 3.7.

Đặc điểm nổi bật

• Ngữ pháp đơn giản, dễ đọc.

• Vừa hướng thủ tục, vừa hướng đối tượng.

• Hỗ trợ module và hỗ trợ gói (package).

• Xử lý lỗi bằng ngoại lệ (Exception).

• Kiểu dữ liệu động ở mức cao.

• Có các bộ thư viện chuẩn và các module ngoài, đáp ứng tất cả các nhu cầu lập trình.

• Có khả năng tương tác với các module khác viết trên C/C++ (Hoặc Java cho Jython, hoặc .Net cho IronPython).

2.6.2 Bộ thư viện Scikit-Learn (sklearn)

Dự án này đã được bắt đầu vào năm 2007 như là một dự án Google Summer of Code của David Cournapeau. Cuối năm đó, Matthieu Brucher bắt đầu thực hiện dự án này như một phần của luận án của mình.

Năm 2010, Fabian Pedregosa, Gael Varoquaux, Alexandre Gramfort và Vincent Michel của INRIA đã lãnh đạo dự án và phát hành công khai lần đầu tiên vào ngày 1 tháng 2 năm 2010. Kể từ đó, một số bản phát hành đã xuất hiện sau chu kỳ ~ 3 tháng và phát triển mạnh cộng đồng quốc tế đã và đang dẫn đầu sự phát triển [18].

Scikit-learn (viết tắt là sklearn) là một thư viện mã nguồn mở trong ngành học máy, rất mạnh mẽ và thông dụng với cộng đồng Python, được thiết kế trên nền NumPy và SciPy. Scikit-learn chứa hầu hết các thuật toán học máy hiện đại nhất, đi kèm với tài liệu chi tiết. Điểm mạnh của thư viện này là nó được sử dụng phổ biến trong học thuật và công nghiệp, do đó nó luôn được cập nhật và có một cộng đồng người dùng sử dụng lớn [19].

Hiện nay có nhiều thư viện mã nguồn mở phục vụ cho nghiên cứu học máy. Bên cạnh Scikit-learn, có 2 thư viện nổi bật khác là:

• LibSVM: Được viết trên C bởi Chih-Chung Chang và Chih-Jen Lin. Như tên gọi của nó, thư viện này chứa các thuật toán SVM (Support Vector Machine), nhóm thuật toán mạnh mẽ hỗ trợ cả regression và classification tasks [20].

• TensorFlows: Do các nhà khoa học của viện nghiên cứu Google Brain phát triển. TensorFlows được viết trên Python và là thư viện mở [21].

Trong khi TensorFlows ở mức độ cấp thấp thì Scikit-learn cho phép ta sử dụng ngay các thuật toán quan trọng một cách đơn giản và hiệu quả. Nói vậy không có nghĩa Scikit-

2.6.3 Flask

Trong phát triển ứng dụng web, Python có nhiều bộ thư viện hỗ trợ lập trình viên như Django, Tornado, Pyramid,… Trong đó, Flask là một bộ thư viện nhỏ gọn được viết bằng Python. “Nhỏ gọn” không có nghĩa là thiếu chức năng mà “nhỏ gọn” theo triết lý thiết kế là cung cấp một lõi chức năng cần thiết nhất cho ứng dụng web nhưng người dùng có thể mở rộng bất cứ lúc nào. Flask luôn hỗ trợ các thành phần tiện ích mở rộng cho ứng dụng như tích hợp cơ sở dữ liệu, xác thực biểu mẫu, xử lý tải lên, các công nghệ xác thực, mẫu, email, RESTful..., chỉ khác là khi nào bạn muốn thì bạn mới đưa vào thôi [22]. Người dùng có thể tập trung xây dựng ứng dụng web ngay từ đầu trong một khoảng thời gian rất ngắn và có thể phát triển quy mô của ứng dụng tùy theo yêu cầu.

Sau khi cài đặt Python, để cài đặt Flask chỉ cần bạn gõ lệnh: pip install Flask Bây giờ chúng ta thử tạo ứng dụng web với câu chào Hello World!. Thật đơn giản bạn sẽ tạo một thư mục với tên thư mục là tên ứng dụng, sau đó, tạo một tập tin .py và viết mã. Ví dụ như: hello.py như Hình 2.3.

Hình 2.3. Ví dụ ứng dụng Hello World trên bộ thư viện Flask

Sau đó chỉ cần run là trang web này sẽ hiển thị trên http://127.0.0.1:5000/

Kết quả như ở Hình 2.4. Như bạn thấy, Flask tập trung vào sự tối giản, cho phép chúng ta ứng dụng Flask thật sự phù hợp cho việc xây dựng các ứng dụng web có quy mô vừa và nhỏ, các API và dịch vụ web:

• Xây dựng ứng dụng web rất giống với việc viết các mô-đun Python chuẩn, cấu trúc gọn gàng và rõ ràng.

• Thay vì cung cấp hết tất cả mọi thứ, Flask cung cấp cho người dùng các thành phần cốt lõi thường được sử dụng nhất của khung ứng dụng web như định tuyến trang, yêu cầu và phản hồi, các mẫu,...

• Với Flask, việc chọn các thành phần nào cho ứng dụng là việc của chúng ta. Điều này thật tuyệt, vì mỗi ứng dụng web có những đặc điểm và tính năng riêng, nó không phần phải chứa các thành phần mà nó không dùng.

• Flask có kiến trúc nhỏ gọn nên bạn hoàn toàn không bị bó buộc bởi bộ khung cồng kềnh, không gặp bất cứ khó khăn nào khi cấu hình hay tổ chức ứng dụng. Không những thế, Flask còn có các ưu điểm nổi bật như: cực kỳ linh hoạt, tối giản, dễ tìm hiểu và sử dụng, định tuyến dễ dàng, rất dễ mở rộng. Vì vậy, công việc chính của bạn là chỉ cần xác định ý tưởng, mục tiêu, tập trung vào việc xây dựng ứng dụng web mà thôi.

• Flask cung cấp rất nhiều tài liệu từ cài đặt đến thực hiện và triển khai, từ hướng dẫn nhanh đến hướng dẫn chi tiết. Bạn có thể dễ dàng tìm kiếm, tham khảo, học tập về lập trình ứng dụng web với Flask bộ thư viện miễn phí trên Internet.

• Cộng đồng Flask khá lớn. Bạn có thể dễ dàng, nhanh chóng tìm được giải pháp từ cộng đồng người sử dụng Flask mỗi khi gặp vấn đề cần giúp đỡ ví dụ như gặp lỗi, cách cài đặt thư viện, cách triển khai ứng dụng...

Hình 2.4. Ví dụ ứng dụng Hello World trên bộ thư viện Flask

2.7. Giới thiệu RNN

RNN (Recurrent Neural Network – Mạng nơ-ron hồi quy) là một trong những mô hình học sâu trong công nghệ trí tuệ nhân tạo.Ý tưởng chính của RNN là sử dụng chuỗi

của một chuỗi với đầu ra phụ thuộc vào cả các phép tính trước đó. Nói cách khác, RNN có khả năng nhớ các thông tin được tính toán trước đó. Trên lý thuyết, RNN có thể sử dụng được thông tin của một văn bản rất dài, tuy nhiên thực tế thì nó chỉ có thể nhớ được một vài bước trước đó mà thôi. Trong lĩnh vực xử lý ngôn ngữ tự nhiên đã ghi nhận được nhiều thành công của RNN cho nhiều vấn đề khác nhau.

CHƯƠNG 3. ĐỀ XUẤT PHƯƠNG PHÁP

3.1 Thu thập dữ liệu Google Traffic Tiles

Hiện nay, dữ liệu giao thông được cung cấp bởi một số bên như: INRIX, Here, TomTom, Waze, Uber,… Tuy nhiên, các dịch vụ này đều phải trả phí với phí dịch vụ cao, không có khả năng sử dụng trên diện rộng

Google có thu thập dữ liệu của người dùng bằng nhiều phương pháp khác nhau. Từ đó, Google đã công khai một bộ dữ liệu Google Traffic Tiles là dịch vụ theo chuẩn WMTS của OGC thể hiện dữ liệu giao thông trực tiếp trên đường. Đường dẫn của Google Traffic Tiles: https://mt1.google.com/vt/lyrs=transit,traffic&x={x}&y={y}&z={z}.

Chi tiết thông số về Google Traffic Tiles được trình bày ở Bảng 3.1.

Bảng 3.1. Thông số chi tiết Google Traffic Tiles

Tên Google Traffic Tiles

Địa chỉ Server mt1.google.com

Đường dẫn /vt/lyrs=transit,traffic&x={x}&y={y}&z={z}

Kích thước 256

Độ zoom lớn nhất 1

Độ zoom nhỏ nhất 18

Hình 3.1. Dữ liệu giao thông của Google hiển thị trên nền tảng dữ liệu VMap

Do dữ liệu giao thông thay đổi liên tục, Google Traffic thay đổi sau mỗi năm phút, để tăng tốc thuật toán, chúng ta cần tải về bộ dữ liệu Google Traffic Tiles. Do số lượng ảnh cả Việt Nam và Hà Nội là rất lớn, trong luận văn này tôi tiến hành thử nghiệm tại 12 quận bao gồm:

Ba Đình, Cầu Giấy, Đống Đa, Hà Đông, Hai Bà Trưng, Hoàn Kiếm, Hoàng Mai, Long Biên, Bắc Từ Liêm, Nam Từ Liêm, Tây Hồ, Thanh Xuân.

Xây dựng một công cụ để tải về Google Traffic Tiles: - Ngôn ngữ sử dụng: NodeJS

- Thư viện: request, polygon-lookup - Thu thập tại 12 quận tại Hà Nội

- Độ zoom: 18 (Đây là độ zoom lớn nhất của bộ dữ liệu Google Traffic Tiles mà Google cung cấp)

Từ khung nhìn chọn trước được miêu tả trong Bảng 3.2, công cụ sẽ tính toán ra các thông số Xmax, Ymax, Xmin, Ymin (là tọa độ lớn nhất và nhỏ nhất của các mảnh bản đồ cần tải về) tại độ Zoom 18 để tính toán tất cả các tile ảnh cần tải về. Sử dụng vòng lặp và hàm PolygonLookup cửa thư viện polygon-lookup để lần lượt kiểm tra xem tọa độ các Tile có thuộc 1 trong 12 quận thử nghiệm hay không, nếu có sẽ tải về tương ứng dữ liệu

ảnh đó bằng cách sử dụng thư viện request và lưu trữ dưới dạng cây thư mục {Độ Zoom}/{X}/{Y}.png. Dữ liệu ranh giới hành chính được sử dụng ở đây là dữ liệu hành

chính 1:50.000 của Bộ Tài nguyên và Môi trường dưới định dạng GeoJSON.

Hình 3.2. Dữ liệu ranh giới hành chính

Bảng 3.2. Thông tin thử nghiệm tải về dữ liệu

Góc Bắc (vĩ độ) Góc Tây (kinh độ) Góc Nam (vĩ độ) Góc Đông (kinh độ)

21.379 105.281 20.554 106.027 Công thức tính X từ kinh độ: 𝑌 = 𝑙𝑜𝑛 + 180 360 ∗ 2𝑧𝑜𝑜𝑚 Công thức tính Y từ vĩ độ: 1 − log(tan (𝑙𝑎𝑡 ∗ 𝜋180 ) + 1 cos(𝑙𝑎𝑡 ∗ 𝜋) )

Công thức tính vĩ độ từ Y:

𝑙𝑎𝑡 = 180

𝜋 ∗ arctan(0.5 ∗ (exp(𝑛) − exp (−𝑛)))

- Trong đó n được tính theo công thức sau:

𝑛 = 𝜋 − 2 ∗ 𝜋 ∗ 𝑌 ∗ 𝑧𝑜𝑜𝑚 2𝑧𝑜𝑜𝑚

Kết quả chạy thử nghiệm: - Tổng số tile: 15.128 tile

- Thời gian trung bình tải về: 133,46 giây

Hình 3.3. Một phần dữ liệu thu thập được

3.2 Xây dựng thuật toán tìm đường đi nhanh nhất theo thời gian 3.2.1 Đề xuất phương pháp tìm đường 3.2.1 Đề xuất phương pháp tìm đường

Phương pháp mới được thể hiện trong Hình 3.4. Khi người dùng gửi yêu cầu đến dịch vụ tìm đường mới, thông tin tọa độ của điểm đi và điểm đến sẽ được truyền đền

Thuật toán tìm đường đi nhanh nhất sẽ được trình bày ở phần sau của luận văn. Thuật toán sẽ sử dụng dịch vụ tìm đường hiện tại của VMap (ở đây là GraphHopper) và bổ sung thuật toán tìm đường đi nhanh nhất để đưa ra kết quả là đường đi nhanh nhất kèm thời gian ước lượng thực tế cho người dùng.

Hình 3.4. Kiến trúc hệ thống tìm đường mới

Xây dựng API dẫn đường mới cho VMap: - Ngôn ngữ sử dụng: python

- Thư viện: flask, json, requests, polyline, pickle, sklearn

API dẫn đường mới sẽ có đường dẫn và cấu trúc truy vấn tương tự với dịch vụ hiện có của VMap. Các trường cụ thể được thể hiện ở Bảng 3.3. API khi có yêu cầu gửi lên sẽ sử dụng thư viện request để lấy kết quả chỉ đường từ dịch vụ chỉ đường hiện có của VMap. Dữ liệu đường đi của kết quả chỉ đường này sẽ được truyền vào mô hình sẽ được trình bày bên dưới, đã được lưu lại bằng cách sử dụng thư viện pickle, để tính toán lại ước lượng thời gian di chuyển. Để thay đổi giá trị ước lượng thời gian di chuyển của kết quả trả về, ta cần quan tâm tới 2 thông số là points_encodedinstructions. Nếu người dùng sử dụng thông số points_encoded=”true”, API sẽ sử dụng thư viện polyline để giải mã dữ liệu đường đi đã được mã hóa, truyền dữ liệu đường đi vào mô hình. Nếu

tìm đường của dịch vụ chỉ đường VMap và thêm một thông số time_in_traffic tương ứng với mỗi thông số time của kết quả.

Kết quả trả về dưới dạng JSON, có cấu trúc như ở Bảng 3.4.

Bảng 3.3. Các thông số truy vấn có thể gửi lên

Thông số Miêu tả

point (bắt buộc) Điểm đầu và điểm cuối mà người dung muốn tìm

Một phần của tài liệu (LUẬN văn THẠC sĩ) phát triển thuật toán tìm đường cho nền tảng cung cấp dịch vụ địa chỉ việt nam​ (Trang 25)

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

(53 trang)