CHƯƠNG 3 : THUẬT TOÁN CẢI TIẾN
3.4. KẾT QUẢ THỬ NGHIỆM
Trong phần này luận văn minh hoạ thuật toán kiểm chứng LDI bằng thuật toán trước và thuật toán cải tiến đối với hệ chắn tàu đã được mô tả trong hình 1-5, hình 1-4, hình 1-6.
Với hệ số a, b, c lấy ngẫu nhiên xét ôt ôtômat đạt được trong hình 1-6 gồm 2 đồng hồ x, y , 8 trạng thái, 11 phép chuyển được minh họa.
0 0
D C Dn
Hay chính là D 0 ( ,C MD)( ,B Dn)0
Chương trình cài đặt trên ngôn ngữ lập trình PHP, một ngôn ngữ lập trình mã nguồn mở, rất mạnh, hoàn toàn miễn phí để viết mã:
Web server: Apache.
Đầu vào: tệp dữ liệu được mã hóa, sử dụng bộ giá trị (a,b,c) [1] để đánh giá kết quả đạt được so độ phức tạp trong trường hợp cụ thể. Do các bước xây dựng đồ thị RG
vẫn giữ nguyên nên ta chỉ so sánh thời gian kiểm chứng đồ thị phục vụ LDI chưa cải tiến và cải tiến.
- Thuật toán LDI(s): là thời gian kiểm chứng đồ thị G chưa cải tiến - Thuật toán New(s): là thời gian kiểm chứng đồ thị G cải tiến
Bảng kết quả được mô tả trong bảng 3-2. Từ kết quả bảng đã cho ta có thể thấy được với đồ thị LDI cải tiến thì thời gian phục vụ kiểm chứng, số đỉnh và số cung được giảm rất nhiều (điều này đã được chứng minh trong phần 3.3).
Biểu đồ hình 3-3 so sánh đường chạy thời gian trong 2 thuật toán cải tiến và chưa cải tiến. Qua đó ta thấy với thuật toán chưa cải tiến, đường chạy giá trị thời gian khá cao, cách xa thời gian được xác định với thuật toán đã cải tiến.
Bảng 3-2: Kết quả so sánh giữa hai thuật toán
Stt Ôtômat a b c LDI (s) Gi.v _old Gi.e _old LDI New (s) Gi.v. _new Gi.e. _new Kết quả
0 Otomat2.txt 1 1 1 4.1166 29 49 2.6692 29 49 A thoả LDI
1 Otomat2.1.txt 8 4 1 84.9232 137 171 2.4431 29 63 A thỏa LDI
2 Otomat2.2.txt 1 5 8 497.2818 690 863 8.2879 62 259 A không thoả
3 Otomat2.3.txt 2 6 2 218.1486 117 151 13.5175 31 65 A thỏa LDI
4 otomat2.4.txt 3 9 6 85.4224 507 623 3.8451 55 171 A không thoả
5 otomat2.5.txt 4 8 5 25.0469 346 427 1.7853 46 127 A không thoả
6 otomat2.6.txt 9 9 4 1389.0206 265 311 21.2592 37 83 A thoả LDI
7 otomat2.7.txt 8 9 9 496.7484 1078 1253 11.1447 61 236 A không thoả
8 otomat2.8.txt 1 6 1 172.1495 96 122 8.0531 28 54 A thoả LDI
9 otomat2.9.txt 2 5 1 19.6034 74 95 2.0209 24 45 A thoả LDI
10 otomat2.10.txt 5 7 9 497.2818 1076 1284 16.2637 64 272 A không thoả
11 otomat2.11.txt 2 5 7 178.5583 598 757 11.3664 56 215 A không thoả
12 otomat2.12.txt 4 4 4 1570.7291 186 245 87.4372 34 93 A thỏa LDI
13 otomat2.13.txt 6 5 9 420.6804 997 1199 15.9255 61 263 A không thoả
14 otomat2.14.txt 3 9 8 457.3596 881 1061 10.4706 65 265 A không thoả
15 otomat2.15.txt 2 2 2 32.9247 61 92 8.3038 24 55 A thỏa LDI
16 otomat2.16.txt 7 8 4 1221.7141 237 284 30.4505 37 84 A thoả LDI
17 otomat2.17.txt 4 3 9 219.5615 802 993 10.5765 61 252 A không thoả
18 otomat2.18.txt 6 4 3 273.728 144 186 13.9709 30 72 A thoả LDI
19 otomat2.19.txt 7 8 8 270.7726 821 970 7.7269 56 205 A không thoả
Biểu đồ đường chạy thời gian hinh 2-3: Với trục hoành thể hiện thứ tự ôtômat và trục tung là giá trị thời gian.
0 200 400 600 800 1000 1200 1400 1600 1800 0 5 10 15 20 25 TT TG Chưa CT Cải tiến
KẾT LUẬN
Với mục tiêu cải tiến thuật toán kiểm chứng tính đúng đắn của công thức khoảng trong luận văn đã nghiên cứu cách đặc tả hệ thống, đặc tả yêu cầu, kỹ thuật kiểm chứng. Và từ thuật toán đã được xây dựng để kiểm chứng lớp công thức LDI, luận văn nghiên cứu cách cải tiến thuật toán này bằng cách cải tiến đồ thị LDI nhằm rút gọn số đỉnh của đồ thị phục vụ kiểm chứng. Qua quá trình nghiên cứu luận văn đạt được một số kết quả nghiên cứu chính thể hiện trên những mặt sau:
Kết quả đạt được:
Tìm hiểu các khái niệm cơ bản liên quan đến hệ thời gian thực, kiểm chứng mô hình, các công cụ đặc tả hệ thống và yêu cầu.
Tìm hiểu kĩ thuật kiểm chứng mô hình đối với công thức bất biến khoảng tuyến tính (LDI) dựa vào kĩ thuật duyệt đồ thị
Cải tiến thuật toán kiểm chứng đã có. Cài đặt thuật toán
Ngoài những kết quả đạt được, trong thời gian tới luận văn có thể tiếp tục với các hướng nghiên cứu:
Tìm các phương pháp để cải tiến thuật toán tốt hơn:
Mở rộng kết quả kiểm chứng cho một số công thức rời rạc hóa được có liên quan đến công thức khoảng tuyến tính
Xây dựng hoàn thiện chương trình, tìm các tính năng mới giảm thiểu độ trễ thời gian, tạo các module tích hợp nhằm cải tiến chương trình thực hiện nhanh hơn.
TÀI LIỆU THAM KHẢO
Tiếng Việt
[1] Phạm Hồng Thái, “Một số phương pháp kiểm chứng tính đúng đắn của Hệ thời gian thực bằng thuật toán” luận án tiến sỹ khoa học trường Đại học Công nghệ - Đại học Quốc gia Hà Nội, 2005
[2] Nguyễn Văn Thọ “Đại cương về hệ thống thời gian thực”, Khoa Điện tử Viễn thông, Đại học Duy Tân, 2010
Tiếng Anh
[3] Alur, R. and D.L. Dill, “A theory of timed automata”, Theoretical Computer Science pp.183 – 235, 1994
[4] Phillip A. Laplante, Seppo J. Ovaska, “Real time systems design and analysis”. Fourth Edition, Published 2012 by John Wiley & Sons, Inc pp.1-149, 2012
[5] Michael R.Hansen, Dang Van Hung, "A Theory of Duration Calculus with Application ", Domain Modeling and the Duration Calculus, Springer-Verlag Berlin Heidelberg , Volume: 4710, pp. 119-176, 2007
[6] M.R. Hansen, Z. Chaochen (1997), "Duration Calculus: Logical Foundations",
Formal Aspects of Computing, 3:1-000, pp. 1-49, 1997
[7] Zhou Chaochen, Zhang Jingzhong, Yang Lu, and Li Xiaoshan (1994), "LinearDuration Invariants", Research Report 11, UNU/IIST, P.O.Box 3088, Macau, July 1994. Published inFormal Techniques in Real-Time and Fault- Tolerant systems, LNCS 863, 1994.
[8] Johan Bengtsson, Wang Yi “Timed Automata: Semantics, Algorithms and Tools”, Springer-Verlag Berlin Heidelberg, Volume 3098, 2004, pp 87-124, 2004
[9] Zhiming Liu, Miaomiao Zhang, and Dang Van Hung, “Verification of Linear Duration Invariants by Model Checking CTL Properties”, Theoretical Aspects of Computing, Springer-Verlag Berlin Heidelberg, pp.395-409, 2008
[10] Pham Hong Thai, Dang Van Hung, “Verifying Linear Duration Constraints of Timed Automata” United Nations University, International Institute for Software Technology, P. O. Box 3058, Macau.
PHỤ LỤC I . BỘ KIỂM CHỨNG MÔ HÌNH LDI 1. CẤU TRÚC DỮ LIỆU
1.1 ÔTÔMAT
Mục này thực hiện thiết kế cấu trúc dữ liệu để thể hiện ôtômat thời gian
A=<S, S0, ∑, X, I, E>, ta sẽ sử dụng cấu trúc mảng trong PHP để lưu các thành phần của ôtômat A.
private $aryLocation = array( loc_id => array(
'loc_id' => xxx,
'loc_name' => 'Ten vi tri', 'invar' => array( xi => array( 'low' => xx, //xi >= xx 'up' => xx //xi <= xx ), ),
'c' => xx, //He so (cs) cua vi tri trong LDI ),
);
1.2 LDI
Các hệ số LDI ứng với từng vị trí của ôtômat được đưa vào cấu trúc vị trí của ôtômat còn các hệ số A, B, M của công thức LDI sẽ được đưa vào trong cấu trúc mảng sau: $aryLdi = array( ‘A’ => xxx, //Hệ số A ‘B’ => xxx, //Hệ số B ‘M’ => xxx //Hệ số M ); 1.3 ĐỒ THỊ PHÂN VÙNG
protected $graphRegion = array( array(
'num_vertex' => 'So dinh', 'num_edge' => 'So cung', 'aryVertex' => array( {id} => array(
'id' => xxx,
'vertex' => {loc_name}_[{region}], 'loc_name' => 'Ten vi tri',
'region' => 'Vung dong ho', 'ldi_c' => 'He so LDI',
'visited' => 'Co xac dinh dinh da duyet', ),
), 'aryEdge' => array( i => array( 'id_form' => xxx, 'id_to' => xxx, 'vertex_form' => xxx, 'vertex_to' => xxx, 'duration_low' => xxx, 'duration_up' => xxx, ), ), ), ); 1.4 ĐỒ THỊ TRỌNG SỐ
protected $weighGraph = array( array(
'num_vertex' => 'So dinh', 'num_edge' => 'So cung', 'aryVertex' => array( {id} => array(
'id' => xxx,
'vertex' => {loc_name}_[{region}], 'loc_name' => 'Ten vi tri',
'region' => 'Vung dong ho', ), ), 'aryEdge' => array( i => array( 'id_form' => xxx, 'id_to' => xxx, 'vertex_form' => xxx, 'vertex_to' => xxx, 'w' => xxx, ), ), ), );
1.5 ĐƯỜNG ĐI CỦA ĐỒ THỊ
Sử dụng ngăn xếp là 1 mảng để lưu vết đường đi phục vụ cho thuật toán (vét cạn) duyệt đồ thị trọng số LDI để kiểm chứng công thức LDI, ngăn xếp này lưu tên mỗi đỉnh và tập các đỉnh kề với nó khi thuật toán duyệt đi qua. Ngăn xếp này được thiết kế như sau:
$aryStackPath = array(
i => array( //thông tin đỉnh thứ i+1 trong đường đi
v => array(v1,v2,…,vk), //đỉnh v và các đỉnh kề với v
…
), );
2. THIẾT KẾ DỮ LIỆU
Dữ liệu đầu vào được cho dưới dạng ôtômat thời gian hoặc lưới ôtômat thời gian, và các hệ số của vị trí của ôtômat, các hệ số A, B, M của công thức LDI được lưu trong 1 file *.txt có cấu trúc phù hợp với cấu trúc dữ liệu được mô tả ở trên. Chương
trình sẽ đọc dữ liệu từ file *.txt vào và tính toán để được kết quả (ôtômat song song, ôtômat đạt được, đồ thị vùng đạt được nguyên, đồ thị trọng số phục vụ LDI, kết quả kiểm chứng, thời gian chạy chương trình).
File dữ liệu đầu vào *.txt được thiết kế như sau:
(nếu giá trị nào đó là vô cùng thì thay bằng chữ U)
Dòng 1: {Hệ số A}_{Hệ số B}_{Hệ số M} // hệ số của công thức LDI Dòng 2: {số đỉnh}_{tên vị trí ban đầu} // ôtômat 1
Dòng 3: {tên vị trí}#xi_low_up|xj_low_up|…#{hệ số ldi} // ôtômat 1 ({tên vị trí}#{các ràng buộc}#{hệ số ldi}) //mỗi đỉnh 1 dòng
…
Dòng k: {số cạnh} // ôtômat 1
Dòng k+1: li#xi_xj_low_up|…#{nhãn}#xi_1|xj_1|…#lj // ôtômat 1 (phép chuyển e = < li, (low <= xi - xj <=up,…), {nhãn},{ xi, xj,…}, lj >) ….
(nếu có ôtômat 2,3,… thì lặp lại từ dòng 2 và lưu vào các dòng tiếp theo)
Otomat21.txt tệp dữ liệu mô tả hệ chắn tàu với a=b=c=1
0_U_0 4_A A#x1_0_U|x2_0_U#0 B#x1_0_U|x2_0_U#0 C#x1_0_U|x2_0_U#1 P#x1_0_U|x2_0_U#0 4 A#x1_x0_0_U|x2_x0_0_U#a#x1_1#B B#x1_x0_1_U|x2_x0_0_U#b#x1_1#C C#x1_x0_0_U|x2_x0_0_U#c#x1_1#P P#x1_x0_1_U|x2_x0_0_U#d#x1_1#A 4_U U#x1_0_U|x2_0_U#0 MD#x1_0_U|x2_0_U#0 Dn#x1_0_U|x2_0_U#-1 MU#x1_0_U|x2_0_U#0 4
U#x1_x0_0_U|x2_x0_0_U#a#x2_1#MD MD#x1_x0_0_U|x2_x0_0_1#e#x2_1#Dn Dn#x1_x0_0_U|x2_x0_0_U#c#x2_1#MU MU#x1_x0_0_U|x2_x0_0_U#f#x2_1#U MU#x1_x0_0_U|x2_x0_0_U#a#x2_1#MD
3. Chương trình cải tiến
GraphLdinewLogic: chương trình kiểm chứng LDI dùng thuật toán cái tiến GraphLdiLogic: chương trình kiểm chứng LDI dùng thuật toán chưa cái tiến GraphRegionLogic: chương trình xử lý đồ thị trọng số
OtomatLogic: chương trình xử lí ôtômat
4. Một số hàm chính Tạo đồ thị vùng nguyên
public function createRegionGraph($aryOtomat, $aryConstantMaxK) { $this->logger->log( " Begin method: " . __METHOD__ . "()"); $maxK = max($aryConstantMaxK); $locationStart = $aryOtomat['init']; $aryLocation = $aryOtomat['aryLocation']; $aryTransition = $aryOtomat['aryTransition']; $aryClock = $aryOtomat['clocks'];
//Khoi tao so dinh hien tai
$this->graphRegion['num_vertex'] = 1;
//Khoi tao so canh hien tai
$this->graphRegion['num_edge'] = 0;
//Nhap dinh <s0, (0,0)>
$region0 = join(',', array_fill(0, count($aryClock), 0)); $regionK = join(',', array_fill(0, count($aryClock), 'U'));
//Id region $regionId = 1;
$vertex0 = $this->createVertexRegion($locationStart, $region0); $this->graphRegion['aryVertex'][$regionId] = array( 'id' => $regionId, 'vertex' => $vertex0, 'loc_name' => $locationStart, 'region' => $region0, 'ldi_c' => $aryLocation[$locationStart]['c'], 'visited' => 0, );
//Khoi tao tap canh rong
$this->graphRegion['aryEdge'] = array();
while (true) {
//lay dinh chua tham trong V
$vertex = $this->getVertexNotVisited();
//neu tat ca cac dinh da tham thi ket thuc if ($vertex === false) {
break ; }
//Dinh s trong Otomat
$loc_name_from = $vertex['loc_name']; $region = $vertex['region'];
$vertex_from = $vertex['vertex']; $id_from = $vertex['id'];
//Loop Transition cua Otomat
foreach ($aryTransition as $transition) {
//Neu ton tai phep chuyen e = <s, g, a, λ, s'>
if (strcmp($loc_name_from, $transition['loc_name_from']) == 0) {
$loc_name_to = $transition['loc_name_to'];
//Xac dinh xem co chuyen dc khong for ($d = 0; $d <= $maxK + 1; $d++) {
$regionSucc = $this-> creatRegionPlus($region, $d, $aryConstantMaxK);
//Kiem tra dieu kien I(s) if (!$this->
checkGuard($regionSucc, $aryLocation[$loc_name_from]['invar'])) { continue;
}
//Kiem tra dieu kien rang buoc g
if (!$this-> checkGuard($regionSucc, $transition['guard'])) { continue;
}
//Reset clock
$regionTo = $this-> resetRegionClock($regionSucc, $transition['reset']);
//Kiem tra dieu kien I(s') sau khi reset
if (!$this-> checkGuard($regionTo, $aryLocation[$loc_name_to]['invar'])) { continue;
}
$regionTo = $this-> reformatRegion($regionTo, $aryConstantMaxK);
//Kiem tra dinh nay da co chua
$vertex_to = $this-> createVertexRegion($loc_name_to, $regionTo); $vertexId = $this->getVertex($vertex_to);
//Neu chua co thi bo sung if ($vertexId == 0) { $regionId++;
$this->
addVertexRegion($loc_name_to, $regionTo, $aryLocation[$loc_name_to]['c'], $regionI d); $id_to = $regionId; } else { $id_to = $vertexId; }
//Kiem tra va bo sung cung neu chua co if (!$this->isExistEdge($id_from, $id_to)) { $durationLow = $durationUp = 0; if (strcmp($regionK, $regionSucc) != 0) { $durationLow = $durationUp = $d; } else { $durationLow = $d; $durationUp = _PHP_INT_MAX; }
$this-> addEdgeRegion($durationLow, $durationUp, $id_from, $id_to); }
} //End loop $maxK
} //End Neu ton tai phep chuyen e = <s, g, a, λ, s'> } //End Loop Transition cua Otomat
//Danh dau da duyet xong
$this->graphRegion['aryVertex'][$id_from]['visited'] = 1; } //End While()
//Loai bo du lieu khong can thiet
foreach ($this->graphRegion['aryVertex'] as $rgid => $info) { unset($info['loc_name']); unset($info['region']); unset($info['visited']); $this->graphRegion['aryVertex'][$rgid] = $info; }
$this->logger->log( " End method: " . __METHOD__ . "()"); }
public function createWeighGraphLdi($graphRegion) {
//Tap dinh giu nguyen (Chi them dinh moi) //Sao chep dinh cu sang moi
foreach ($graphRegion['aryVertex'] as $id => $value) { $this->weighGraphLdi['aryVertex'][$id] = $value; }
$this->weighGraphLdi['num_vertex'] = $graphRegion['num_vertex'];
//Tap cung cu bi loai de thay bang tap cung moi $this->weighGraphLdi['num_edge'] = 0;
//Buoc 1: Kiem tra Neu $graphRegion chua cung vo han thi ket thuc va KL G khong th oa LDI
//Buoc 2: Tinh lai so dinh va cung cho do thi moi $weighGraphLdi theo cac TH sau: /*
[0,0]: 1 cung co trong so 0
[0,1]: 1cung 1 va 2 cung 0; 1 dinh moi [1,1]: 1 cung 1
[u=l && u > 1]: u-1 dinh(n+1->n+u-1); u cung trong so 1 [l < u && u > 1]:
- Them u dinh (n+1 -> n+u) [u-1 dinh + 1 dinh don hoa do thi] - Them u cung trong so 1
- Them u-l+1 cung trong so 0 (ca cung don hoa do thi) */
//Bo sung tap dinh va cung ho Gi //Cung
foreach ($graphRegion['aryEdge'] as $edge) { $l = $edge['duration_low']; $u = $edge['duration_up']; $id_form = $edge['id_form']; $id_to = $edge['id_to']; $ldi_c = $graphRegion['aryVertex'][$id_form]['ldi_c']; $vertex = $graphRegion['aryVertex'][$id_form]['vertex'];
//[0,0] them cung co trong so 0 if ($l == 0 && $u == 0) { $this->addEdge($id_form, $id_to, 0); continue; }
//[0,0] Tao 1 cung trong so 1 va 2 cung trong so 0 if ($l == 0 && $u == 1) {
//Them 1 cung co trong so 1
//Them 1 Dinh phu moi
$this->addVertex($vertex, $ldi_c);
//Them 2 cung moi co trong so 0
$n = $this->weighGraphLdi['num_vertex']; $this->addEdge($id_form, $n, 0); $this->addEdge($n, $id_to, 0); continue; } //[1,1] if ($l == 1 && $u == 1) {
//Them 1 cung moi co trong so 1 $this->addEdge($id_form, $id_to, 1); continue; } //TH u = l va u > 1; if ($l == $u && $u > 1) {
//Them u-1 dinhh tu (n+1) den (n+u-1) $n = $this->weighGraphLdi['num_vertex']; $dau = $n + 1; $cuoi = $n + $u - 1; for ($i = 1; $i <= $u-1; $i++) { $this->addVertex($vertex, $ldi_c); }
//Them u cung trong so 1 //cung dau
$this->addEdge($id_form, $dau, 1);
//Cung cuoi trong so 1
$this->addEdge($cuoi, $id_to, 1);
//Them u-2 cung giua trong so 1
for ($j = $dau; $j <= $cuoi - 1; $j++) { $this->addEdge($j, $j + 1, 1); } continue; } //TH l < u va u > 1
//Them u dinh va u cung trong so 1, u-l+1 cung trong so 0 if ($l < $u && $u > 1) {
//Them u dinh tu n+1(dau) den n+u (cuoi) $n = $this->weighGraphLdi['num_vertex']; $dau = $n + 1; $cuoi = $n + $u;
for ($i = 1; $i <= $u; $i++) {
$this->addVertex($vertex, $ldi_c); }
//Them u cung co trong so 1 //cung dau ts 1 $this->addEdge($id_form, $dau, 1); //Cung cuoi $this->addEdge($cuoi - 1, $id_to, 1);
//Them u-2 cung giua ts 1
for ($j = $dau; $j <= $cuoi - 2; $j++) {
$this->addEdge($j, $j + 1, 1); }
//Them 2 cung phu trong so 0 (2 cung don hoa do thi) $this->addEdge($cuoi-1, $cuoi, 0);
$this->addEdge($cuoi, $id_to, 0);
//Them (u-l+1)-2 cung trong so 0 if ($l == 0) {
//Them cung dau
$this->addEdge($id_form, $id_to, 0);
//Them (u-l+1)-3 cung giua
for ($j = $dau; $j <= $cuoi - 2; $j++) { $this->addEdge($j, $id_to, 0); } } if ($l > 0) {
//Them (u-l+1)-2 cung trong so 0
for ($j = $dau + $l - 1; $j <= $cuoi - 2; $j++) { $this->addEdge($j, $id_to, 0); } } continue; } }
//$this->logger->log( __METHOD__."() weighGraphLdi = " . print_r($this- >weighGraphLdi, true));
return $this->weighGraphLdi; }
Tạo LDI cải tiến
public function createWeighGraphLdiRefine($graphRegion) {
//Sao chep dinh cu sang moi
foreach ($graphRegion['aryVertex'] as $id => $value) { $this->weighGraphLdi['aryVertex'][$id] = $value; }
$this->weighGraphLdi['num_vertex'] = $graphRegion['num_vertex'];
//Tap cung cu bi loai de thay bang tap cung moi $this->weighGraphLdi['num_edge'] = 0;
//Buoc 1: Kiem tra Neu $graphRegion chua cung vo han thi ket thuc va KL G khong th oa LDI
//Buoc 2: Tinh lai so dinh va cung cho do thi moi $weighGraphLdi theo cac TH sau: