Chu trình vận hành xe cơ giới thường do các tổ chức nhà nước, hiệp hội
chuyên môn hoặc hãng chế tạo ôtô nghiên cứu và thiết lập. Ở Hoa Kỳ, EPA
(Environmental Protection Agency) là tổ chức có trách nhiệm xây dựng các chu
trình vận hành và các qui định liên quan để theo đó xe cơ giới được thử nghiệm.
Các loại xe cơ giới tham gia giao thông tại Hoa Kỳ được thử nghiệm theo các chu
trình vận hành sau đây :
UDDS (Urban Dynamometer Driving Schedule) áp dụng cho ôtô có chế
độ làm việc nhẹ được vận hành trong điều kiện của thành phố;
162 trang |
Chia sẻ: toanphat99 | Lượt xem: 2600 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Luận án Nghiên cứu tối ưu hóa thiết kế độ lớn và tham số điều khiển nguồn năng lượng hệ động lực xe hybrid, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ủa 'mc_trq_scale'
global i3_max % Giới hạn trên của 'ess_cap_scale'
global i4_max % Giới hạn trên của 'cs_dl_assist_trq_threshold'
global i5_max % Giới hạn trên của 'cs_mc_assist_min_frac'
global i6_max % Giới hạn trên của 'cs_mc_assist_slope'
global i7_max % Giới hạn trên của 'cs_mc_assist_max_frac'
global i8_max % Giới hạn trên của 'cs_dl_regen_trq_threshold'
global i9_max % Giới hạn trên của 'cs_mc_regen_min_frac'
global i10_max % Giới hạn trên của 'cs_mc_regen_slope'
global i11_max % Giới hạn trên của 'cs_mc_regen_max_frac'
global i12_max % Giới hạn trên của 'cs_decel_regen_threshold'
global i13_max % Giới hạn trên của 'cs_lo_soc'
global i14_max % Giới hạn trên của 'cs_hi_soc'
global FC % Tiêu thụ nhiên liệu
global HC % Hàm lượng HC
global CO % Hàm lượng CO
global Nox % Hàm lượng NOx
global accel1
global accel2
global accel3
global dist
global maxAcc % Gia tốc cực đại
global maxSpeed
global gra % Khả năng leo dốc
global time % Thời gian tăng tốc từ lúc khởi hành đến khi xe chạy 200m
clc; close all; clear all; % Xóa màn hình, xóa trị số biến
input.init.saved_veh_file='INSIGHT_defaults_in';
[a,b]=adv_no_gui('initialize',input);
139
i1_min=0.271; % Giá trị nhỏ nhất của 'fc_trq_scale'
i1_max=0.49; % Giá trị lớn nhất của 'fc_trq_scale'
i2_min=0.271; % Giá trị nhỏ nhất của 'mc_trq_scale'
i2_max=1.355; % Giá trị lớn nhất của 'mc_trq_scale'
i3_min=0.97; % Giá trị nhỏ nhất của 'ess_cap_scale'
i3_max=4.84; % Giá trị lớn nhất của 'ess_cap_scale'
i4_min=0; % Giá trị nhỏ nhất của 'cs_dl_assist_trq_threshold'
i4_max=60; % Giá trị lớn nhất của 'cs_dl_assist_trq_threshold' (N.m)
i5_min=0; % Giá trị nhỏ nhất của 'cs_mc_assist_min_frac'
i5_max=0.2; % Giá trị lớn nhất của 'cs_mc_assist_min_frac'
i6_min=0; % Giá trị nhỏ nhất của 'cs_mc_assist_slope'
i6_max=1; % Giá trị lớn nhất của 'cs_mc_assist_slope'
i7_min=0.21; % Giá trị nhỏ nhất của 'cs_mc_assist_max_frac'
i7_max=1;% Giá trị lớn nhất của 'cs_mc_assist_max_frac'
i8_min=-40; % Giá trị nhỏ nhất của 'cs_dl_regen_trq_threshold',
i8_max=0;% Giá trị lớn nhất của 'cs_dl_regen_trq_threshold',
i9_min=0; % Giá trị nhỏ nhất của 'cs_mc_regen_min_frac'
i9_max=0.2;% Giá trị lớn nhất của 'cs_mc_regen_min_frac'
i10_min=0; % Giá trị nhỏ nhất của 'cs_mc_regen_slope'
i10_max=1;% Giá trị lớn nhất của 'cs_mc_regen_slope'
i11_min=0.21; % Giá trị nhỏ nhất của 'cs_mc_regen_max_frac'
i11_max=1;% Giá trị lớn nhất của 'cs_mc_regen_max_frac'
i12_min=0; % Giá trị nhỏ nhất của 'cs_decel_regen_threshold'
i12_max=30;% Giá trị lớn nhất của 'cs_decel_regen_threshold'
i13_min=0.15; %Giá trị nhỏ nhất của 'cs_lo_soc'
i13_max=0.57;% Giá trị lớn nhất của 'cs_lo_soc'
i14_min=0.58; % Giá trị nhỏ nhất của 'cs_hi_soc'
i14_max=0.95;% Giá trị lớn nhất của 'cs_hi_soc'
n= 20; % Số lượng ong trinh sát
itr=35; % Số vòng lặp
m=5; % Số lượng vùng tìm kiếm cục bộ được chọn
e=1; % Số lượng vùng tìm kiếm cục bộ tốt nhất trong số vùng chọn
n1=5; % Số lượng ong tìm kiếm cục bộ ở vùng được chọn trừ vùng tốt nhất
n2=10; % Số lượng ong tìm kiếm cục bộ ở vùng tốt nhất trong số vùng chọn
ngh1=(i1_max-i1_min)/40; % Bán kính tìm kiếm cục bộ
ngh2=(i2_max-i2_min)/40;
ngh3=(i3_max-i3_min)/40;
ngh4=(i4_max-i4_min)/40;
ngh5=(i5_max-i5_min)/40;
ngh6=(i6_max-i6_min)/40;
ngh7=(i7_max-i7_min)/40;
ngh8=(i8_max-i8_min)/40;
ngh9=(i9_max-i9_min)/40;
ngh10=(i10_max-i10_min)/40;
ngh11=(i11_max-i11_min)/40;
ngh12=(i12_max-i12_min)/40;
ngh13=(i13_max-i13_min)/40;
ngh14=(i14_max-i14_min)/40;
element=0; % Đếm số ong hiện tại
140
load count;
disp(count)
if count==0 % Nếu đây là lần đầu chạy chương trình
disp(' ');
disp('This is THE FIRST time to run the optimization program');
disp(' ');
U=X_random(n,i1_max, i2_max,i3_max, i4_max, i5_max, i6_max,i7_max,
i8_max,i9_max,i10_max,i11_max, i12_max,i13_max,i14_max, i1_min, i2_min,i3_min,
i4_min, i5_min,i6_min,
i7_min,i8_min,i9_min,i10_min,i11_min,i12_min,i13_min,i14_min)
for i=1:n
Par_Q(i,1)=U(i,1);
Par_Q(i,2)=U(i,2);
Par_Q(i,3)=U(i,3);
Par_Q(i,4)=U(i,4);
Par_Q(i,5)=U(i,5);
Par_Q(i,6)=U(i,6);
Par_Q(i,7)=U(i,7);
Par_Q(i,8)=U(i,8);
Par_Q(i,9)=U(i,9);
Par_Q(i,10)=U(i,10);
Par_Q(i,11)=U(i,11);
Par_Q(i,12)=U(i,12);
Par_Q(i,13)=U(i,13);
Par_Q(i,14)=U(i,14);
temp=fn(U(i,1),U(i,2),U(i,3),U(i,4),U(i,5),U(i,6),U(i,7),U(i,8),U(i,9),U(i,10),U(
i,11),U(i,12),U(i,13),U(i,14));
while temp==-1
U(i,:)=X_random(1,i1_max, i2_max,i3_max, i4_max, i5_max,
i6_max,i7_max, i8_max,i9_max,i10_max,i11_max, i12_max,i13_max,i14_max, i1_min,
i2_min,i3_min, i4_min, i5_min,i6_min,
i7_min,i8_min,i9_min,i10_min,i11_min,i12_min,i13_min,i14_min)
Par_Q(i,1)=U(i,1);
Par_Q(i,2)=U(i,2);
Par_Q(i,3)=U(i,3);
Par_Q(i,4)=U(i,4);
Par_Q(i,5)=U(i,5);
Par_Q(i,6)=U(i,6);
Par_Q(i,7)=U(i,7);
Par_Q(i,8)=U(i,8);
Par_Q(i,9)=U(i,9);
Par_Q(i,10)=U(i,10);
Par_Q(i,11)=U(i,11);
Par_Q(i,12)=U(i,12);
Par_Q(i,13)=U(i,13);
Par_Q(i,14)=U(i,14);
temp=fn(U(i,1),U(i,2),U(i,3),U(i,4),U(i,5),U(i,6),U(i,7),U(i,8),U(i,9),U(i,10),U(
i,11),U(i,12),U(i,13),U(i,14));
end
Par_Q(i,15)=temp;
Par_Q(i,16)=FC;
Par_Q(i,17)=HC;
Par_Q(i,18)=CO;
Par_Q(i,19)=NOx;
Par_Q(i,20)=PM;
Par_Q(i,21)=accel1;
Par_Q(i,22)=accel2;
Par_Q(i,23)=accel3;
Par_Q(i,24)=dist;
Par_Q(i,25)=maxAcc;
Par_Q(i,26)=maxSpeed;
Par_Q(i,27)=gra;
141
Par_Q(i,28)=time;
element=element+1; % Tăng số ong lên 1
all_bees(element,:)=[element,U(i,1),U(i,2),U(i,3),U(i,4),U(i,5),U(i,6),U(i,7),U(i
,8),U(i,9),U(i,10),U(i,11),U(i,12),U(i,13),U(i,14),temp,FC,HC,CO,NOx,PM,accel1,ac
cel2,accel3,dist,maxAcc,maxSpeed,gra,time];
disp(' ');
disp(sprintf('The number of evaluated fitness functions:
%02.0f',element));
disp(' ');
end
Par_Q=sortrows(Par_Q,11)
all_inter_val(1,:)=[0,Par_Q(1,:)];
first=Par_Q;
last=first;
save all_bees all_bees; % Lưu vào bộ nhớ
save first first;
save element element;
save all_inter_val all_inter_val;
U
clear U;
clear i; h=0;
else % Nếu đây không phải là lần đầu chạy chương trình
disp(' ');
disp('This is NOT the first time to run the optimization program');
disp(' ');
load all_bees; % Load dữ liệu ở bộ nhớ ra
load last;
load element;
Par_Q=last
load all_inter_val
end
for k=1:itr % Vòng lặp bắt đầu
disp(' ');
disp(sprintf('Interation Number: %02.0f',k));
disp(' ');
% ______________________________________________________________________
for j=1:e % Số vùng tốt nhất trong vùng được chọn
for i=1:n2 % Số ong tìm kiếm cục bộ trong vùng tốt nhất
U=bee_dance(ngh1,ngh2,ngh3,ngh4,ngh5,ngh6,ngh7,ngh8,ngh9,ngh10,ngh11,ngh12,ngh13,
ngh14, Par_Q(j,1), Par_Q(j,2),Par_Q(j,3),Par_Q(j,4),Par_Q(j,5),
Par_Q(j,6),Par_Q(j,7),Par_Q(j,8),Par_Q(j,9),Par_Q(j,10),Par_Q(j,11),Par_Q(j,12),P
ar_Q(j,13),Par_Q(j,14),i1_min,i2_min,i3_min,i4_min,i5_min,i6_min,i7_min,i8_min,i9
_min,i10_min,i11_min,i12_min,i13_min,i14_min,i1_max,i2_max,i3_max,i4_max,i5_max,i
6_max,i7_max,i8_max,i9_max,i10_max,i11_max,i12_max,i13_max,i14_max);
temp=fn(U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10),U(11),U(12),U(13),U(14
));
while temp==-1 % Khi có lỗi xuất hiện (không tính được fn)
U=bee_dance(ngh1,ngh2,ngh3,ngh4,ngh5,ngh6,ngh7,ngh8,ngh9,ngh10,ngh11,ngh12,ngh13,
ngh14, Par_Q(j,1), Par_Q(j,2),Par_Q(j,3),Par_Q(j,4),Par_Q(j,5),
Par_Q(j,6),Par_Q(j,7),Par_Q(j,8),Par_Q(j,9),Par_Q(j,10),Par_Q(j,11),Par_Q(j,12),P
ar_Q(j,13),Par_Q(j,14),i1_min,i2_min,i3_min,i4_min,i5_min,i6_min,i7_min,i8_min,i9
_min,i10_min,i11_min,i12_min,i13_min,i14_min,i1_max,i2_max,i3_max,i4_max,i5_max,i
6_max,i7_max,i8_max,i9_max,i10_max,i11_max,i12_max,i13_max,i14_max);
temp=fn(U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10),U(11),U(12),U(13),U(14
));
end
if temp< Par_Q(j,15)
142
Par_Q(j,:)=[U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10),U(11),U(12),U(13),
U(14),temp,FC,HC,CO,NOx,PM,accel1,accel2,accel3,dist,maxAcc,maxSpeed,gra,time];
end
element=element+1; % Tăng số ong lên 1
all_bees(element,:)=[element,U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10),U
(11),U(12),U(13),U(14),temp,FC,HC,CO,NOx,PM,accel1,accel2,accel3,dist,maxAcc,maxS
peed,gra,time];
disp(' ');
disp(sprintf('The number of evaluated fitness functions:
%02.0f',element));
disp(' ');
end
end
% _______________________________________________________________________
for j=e+1:m % Số vùng còn lại trong vùng được chọn
for i=1 : n1 % Số ong tìm kiếm cục bộ trong vùng được chọn
U=bee_dance(ngh1,ngh2,ngh3,ngh4,ngh5,ngh6,ngh7,ngh8,ngh9,ngh10,ngh11,ngh12,ngh13,
ngh14, Par_Q(j,1), Par_Q(j,2),Par_Q(j,3),Par_Q(j,4),Par_Q(j,5),
Par_Q(j,6),Par_Q(j,7),Par_Q(j,8),Par_Q(j,9),Par_Q(j,10),Par_Q(j,11),Par_Q(j,12),P
ar_Q(j,13),Par_Q(j,14),i1_min,i2_min,i3_min,i4_min,i5_min,i6_min,i7_min,i8_min,i9
_min,i10_min,i11_min,i12_min,i13_min,i14_min,i1_max,i2_max,i3_max,i4_max,i5_max,i
6_max,i7_max,i8_max,i9_max,i10_max,i11_max,i12_max,i13_max,i14_max);
temp=fn(U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10),U(11),U(12),U(13),U(14
));
while temp==-1 % Khi có lỗi xuất hiện (không tính được fn)
U=bee_dance(ngh1,ngh2,ngh3,ngh4,ngh5,ngh6,ngh7,ngh8,ngh9,ngh10,ngh11,ngh12,ngh13,
ngh14, Par_Q(j,1), Par_Q(j,2),Par_Q(j,3),Par_Q(j,4),Par_Q(j,5),
Par_Q(j,6),Par_Q(j,7),Par_Q(j,8),Par_Q(j,9),Par_Q(j,10),Par_Q(j,11),Par_Q(j,12),P
ar_Q(j,13),Par_Q(j,14),i1_min,i2_min,i3_min,i4_min,i5_min,i6_min,i7_min,i8_min,i9
_min,i10_min,i11_min,i12_min,i13_min,i14_min,i1_max,i2_max,i3_max,i4_max,i5_max,i
6_max,i7_max,i8_max,i9_max,i10_max,i11_max,i12_max,i13_max,i14_max);
temp=fn(U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10),U(11),U(12),U(13),U(14
));
end
if temp< Par_Q(j,15)
Par_Q(j,:)=[U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10),U(11),U(12),U(13),
U(14),temp,FC,HC,CO,NOx,PM,accel1,accel2,accel3,dist,maxAcc,maxSpeed,gra,time];
end
element=element+1;
all_bees(element,:)=[element,U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10),U
(11),U(12),U(13),U(14),temp,FC,HC,CO,NOx,PM,accel1,accel2,accel3,dist,maxAcc,maxS
peed,gra,time];
disp(' ');
disp(sprintf('The number of evaluated fitness functions:
%02.0f',element));
disp(' ');
end
end
% _______________________________________________________________________
for i=m+1:n
U=X_random(1,i1_max, i2_max,i3_max, i4_max, i5_max, i6_max,i7_max,
i8_max,i9_max,i10_max,i11_max,i12_max,i13_max,i14_max,i1_min,i2_min,i3_min,i4_min
,i5_min,i6_min,i7_min,i8_min,i9_min,i10_min,i11_min,i12_min,i13_min,i14_min);
temp=fn(U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10),U(11),U(12),U(13),U(14
));
143
while temp==-1
U=X_random(1,i1_max, i2_max,i3_max, i4_max, i5_max, i6_max,i7_max,
i8_max,i9_max,i10_max,i11_max,i12_max,i13_max,i14_max,i1_min,i2_min,i3_min,i4_min
,i5_min,i6_min,i7_min,i8_min,i9_min,i10_min,i11_min,i12_min,i13_min,i14_min);
temp=fn(U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10),U(11),U(12),U(13),U(14
));
end
Par_Q(i,:)=[U(1), U(2),U(3),U(4),U(5),
U(6),U(7),U(8),U(9),U(10),U(11),U(12),U(13),U(14),temp];
element=element+1;
all_bees(element,:)=[element,U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10),U
(11),U(12),U(13),U(14),temp,FC,HC,CO,NOx,PM,accel1,accel2,accel3,dist,maxAcc,maxS
peed,gra,time];
disp(' ');
disp(sprintf('The number of evaluated fitness functions:
%02.0f',element));
disp(' ');
end
% _______________________________________________________________________
Par_Q=sortrows(Par_Q,15);
all_inter_val(count+k+1,:)=[count+k,Par_Q(1,:)];
xlswrite('R_all_inter_val',all_inter_val)
xlswrite('R_all_bees',all_bees)
end % Kết thúc vòng lặp
count=count+itr;
first=last;
last=Par_Q;
xlswrite('R_last',last);
a=['fc_trq_scale','mc_trq_scale','ess_cap_scale','cs_dl_assist_trq_threshold','cs
_mc_assist_min_frac','cs_mc_assist_slope','cs_mc_assist_max_frac','cs_dl_regen_tr
q_threshold','cs_mc_regen_min_frac','cs_mc_regen_slope','cs_mc_regen_max_frac','c
s_decel_regen_threshold','cs_lo_soc','cs_hi_soc','FC'];
disp(' ');
disp(a);
last
a=['order
','fc_trq_scale','mc_trq_scale','ess_cap_scale','cs_dl_assist_trq_threshold','cs_
mc_assist_min_frac','cs_mc_assist_slope','cs_mc_assist_max_frac','cs_dl_regen_trq
_threshold','cs_mc_regen_min_frac','cs_mc_regen_slope','cs_mc_regen_max_frac','cs
_decel_regen_threshold','cs_lo_soc','cs_hi_soc','FC'];
disp(' ');
disp(a);
all_inter_val
save count count;
save last last;
save all_inter_val all_inter_val;
save element element;
save all_bees all_bees;
plot(all_inter_val(:,1),all_inter_val(:,16));
grid on;
function
U=bee_dance(ngh1,ngh2,ngh3,ngh4,ngh5,ngh6,ngh7,ngh8,ngh9,ngh10,ngh11,ngh12,ngh13,
ngh14,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x1_min,x2_min,x3_min,x4_min,
x5_min,x6_min,x7_min,x8_min,x9_min,x10_min,x11_min,x12_min,x13_min,x14_min,x1_max
,x2_max,x3_max,x4_max,x5_max,x6_max,x7_max,x8_max,x9_max,x10_max,x11_max,x12_max,
x13_max,x14_max)
U(:,1)=(x1-ngh1)+(2*ngh1.*rand(size(x1,1),1));
U(:,2)=(x2-ngh2)+(2*ngh2.*rand(size(x2,1),1));
U(:,3)=(x3-ngh3)+(2*ngh3.*rand(size(x3,1),1));
U(:,4)=(x4-ngh4)+(2*ngh4.*rand(size(x4,1),1));
U(:,5)=(x5-ngh5)+(2*ngh5.*rand(size(x5,1),1));
U(:,6)=(x6-ngh6)+(2*ngh6.*rand(size(x6,1),1));
144
U(:,7)=(x7-ngh7)+(2*ngh7.*rand(size(x7,1),1));
U(:,8)=(x8-ngh8)+(2*ngh8.*rand(size(x8,1),1))
U(:,9)=(x9-ngh9)+(2*ngh9.*rand(size(x9,1),1));
U(:,10)=(x10-ngh10)+(2*ngh10.*rand(size(x10,1),1));
U(:,11)=(x11-ngh11)+(2*ngh11.*rand(size(x11,1),1));
U(:,12)=(x12-ngh12)+(2*ngh12.*rand(size(x12,1),1));
U(:,13)=(x13-ngh13)+(2*ngh13.*rand(size(x13,1),1));
U(:,14)=(x14-ngh14)+(2*ngh14.*rand(size(x14,1),1));
if U(:,1)<x1_min
U(:,1)=x1_min;
end
if U(:,1)>x1_max
U(:,1)=x1_max;
end
if U(:,2)<x2_min
U(:,2)=x2_min;
end
if U(:,2)>x2_max
U(:,2)=x2_max;
end
if U(:,3)<x3_min
U(:,3)=x3_min;
end
if U(:,3)>x3_max
U(:,3)=x3_max;
end
if U(:,4)<x4_min
U(:,4)=x4_min;
end
if U(:,4)>x4_max
U(:,4)=x4_max;
end
if U(:,5)<x5_min
U(:,5)=x5_min;
end
if U(:,5)>x5_max
U(:,5)=x5_max;
end
if U(:,6)<x6_min
U(:,6)=x6_min;
end
if U(:,6)>x6_max
U(:,6)=x6_max;
end
if U(:,7)<x7_min
U(:,7)=x7_min;
end
if U(:,7)>x7_max
U(:,7)=x7_max;
end
if U(:,8)<x8_min
U(:,8)=x8_min;
end
if U(:,8)>x8_max
U(:,8)=x8_max;
end
if U(:,9)<x9_min
U(:,9)=x9_min;
end
if U(:,9)>x9_max
U(:,9)=x9_max;
end
if U(:,10)<x10_min
U(:,10)=x10_min;
145
end
if U(:,10)>x10_max
U(:,10)=x10_max;
end
if U(:,11)<x11_min
U(:,11)=x11_min;
end
if U(:,11)>x11_max
U(:,11)=x11_max;
end
if U(:,12)<x12_min
U(:,12)=x12_min;
end
if U(:,12)>x12_max
U(:,12)=x12_max;
end
if U(:,13)<x13_min
U(:,13)=x13_min;
end
if U(:,13)>x13_max
U(:,13)=x13_max;
end
if U(:,14)<x14_min
U(:,14)=x14_min;
end
if U(:,14)>x14_max
U(:,14)=x14_max;
end
end
function X=X_random(n, i1_max, i2_max,i3_max, i4_max, i5_max, i6_max,i7_max,
i8_max,i9_max,i10_max,i11_max, i12_max,i13_max,i14_max, i1_min, i2_min,i3_min,
i4_min, i5_min,i6_min,
i7_min,i8_min,i9_min,i10_min,i11_min,i12_min,i13_min,i14_min)
X=[i1_min+((rand(n,1)).*(i1_max-i1_min)), i2_min+((rand(n,1)).*(i2_max-
i2_min)),i3_min+((rand(n,1)).*(i3_max-i3_min)),i4_min+((rand(n,1)).*(i4_max-
i4_min)),i5_min+((rand(n,1)).*(i5_max-i5_min)), i6_min+((rand(n,1)).*(i6_max-
i6_min)),i7_min+((rand(n,1)).*(i7_max-i7_min)),i8_min+((rand(n,1)).*(i8_max-
i8_min)),i9_min+((rand(n,1)).*(i9_max-i9_min)),i10_min+((rand(n,1)).*(i10_max-
i10_min)),i11_min+((rand(n,1)).*(i11_max-
i11_min)),i12_min+((rand(n,1)).*(i12_max-
i12_min)),i13_min+((rand(n,1)).*(i13_max-
i13_min)),i14_min+((rand(n,1)).*(i14_max-i14_min))];
end
function
result=fn(i1_val,i2_val,i3_val,i4_val,i5_val,i6_val,i7_val,i8_val,i9_val,i10_val,
i11_val,i12_val,i13_val,i14_val)
input.modify.param={'fc_trq_scale','ess_cap_scale'};
input.modify.value={i1_val,i3_val}; % Origin Honda Insight
[a,b]=adv_no_gui('modify',input);
% Tính khối lượng
fc_mass1=round(evalin('base','fc_mass_scale_fun(fc_mass_scale_coef,fc_spd_
scale,fc_trq_scale,fc_base_mass,fc_acc_mass,fc_fuel_mass)'));
mc_mass1=round(i2_val*60);
ess_mass1=evalin('base','round(ess_mass_scale_fun(ess_mass_scale_coef,ess_
module_num,ess_cap_scale,ess_module_mass))');
ex_mass1=round(evalin('base','ex_mass_scale_fun(ex_mass_scale_coef,fc_pwr_
scale,ex_mass)'));
total_vehicle_mass=round(fc_mass1+mc_mass1+ess_mass1+520+ex_mass1+91+136);
input.modify.param={'fc_trq_scale','mc_trq_scale','ess_cap_scale','cs_dl_a
ssist_trq_threshold','cs_mc_assist_min_frac','cs_mc_assist_slope','cs_mc_a
ssist_max_frac','cs_dl_regen_trq_threshold','cs_mc_regen_min_frac','cs_mc_
146
regen_slope','cs_mc_regen_max_frac','cs_decel_regen_threshold','cs_lo_soc'
,'cs_hi_soc','veh_mass','wh_1st_rrc'};
input.modify.value={i1_val,i2_val,i3_val,i4_val,i5_val,i6_val,i7_val,i8_va
l,i9_val,i10_val,i11_val,i12_val,i13_val,i14_val,total_vehicle_mass,0.015}
;
[a,b]=adv_no_gui('modify',input);
input.cycle.param={'test.name'} ;
input.cycle.value={'CYC_CECDC'}; % Chu trình vận hành
[a,b]=adv_no_gui('drive_cycle',input); % Tiêu thụ nhiên liệu
if a==0
FC=(100*3.78541178)/(b.cycle.mpgge*1.609344); % liter/100km
HC=b.cycle.hc_gpm/1.609344; %g/km
CO=b.cycle.co_gpm/1.609344; %g/km
NOx=b.cycle.nox_gpm/1.609344; %g/km
PM=b.cycle.pm_gpm/1.609344; %g/km
fail=0;
else
result=-1;
fail=-1;
end
input.accel.param={'spds','dist_in_time', 'time _in_
dist','max_rate_bool','max_speed_bool'};
input.accel.value={[0 60; 40 60;0 85],5, 0.2/1.609344,1,1};
[a,b]=adv_no_gui('accel_test',input); % Tính tính năng động lực học
if a==0
if fail==0 % Kiểm tra lỗi
accel1=b.accel.times(1);
accel2=b.accel.times(2);
accel3=b.accel.times(3);
if accel1==-1
accel1=15;
a1=-1;
else
a1=0;
end
if accel2==-1
accel2=8;
a2=-1;
else
a2=0;
end
if accel3==-1
accel3=26;
a3=-1;
else
a3=0;
end
dist=b.accel.dist*0.3048;
time=b.accel.time;
maxAcc=b.accel.max_rate*0.3048;
maxSpeed=b.accel.max_speed*1.60934;
input.grade.param={'speed','duration','add_mass '};
input.grade.value={12.427,1200,0};
[a,b]=adv_no_gui('grade_test',input);% Tính khả năng leo dốc
gr=b.grade.grade;
c=length(gr);
if c==0
gra=0;
else
gra=gr
end
147
re=FC/4.9892+3.5*max(0,120-maxSpeed)/120+3.5*max(0,11-
gra)/11+3.5*max(0,time-20.4)/20.4;
result=re;
disp(' ');
disp(['FC (liter/100km) is: ', num2str(FC)]);
disp(['HC (g/km) is: ', num2str(HC)]);
disp(['CO (g/km) is: ', num2str(CO)]);
disp(['NOx (g/km) is: ', num2str(NOx)]);
disp(['PM (g/km) is: ', num2str(PM)]);
if a1~=-1
disp(['The time to accelerate from (0 - 97)km/h is (Standard
<=12s): ', num2str(accel1)]);
else
disp('The car CAN NOT get the speed range from (0-97)km/h');
end
if a2~=-1
disp(['The time to accelerate from (64 - 97)km/h is (Standard
<=5.3s): ', num2str(accel2)]);
else
disp('The car CAN NOT get the speed range from (64-97)km/h');
end
if a3~=-1
disp(['The time to accelerate from (0 - 137)km/h is (Standard
<=23.4s): ', num2str(accel3)]);
else
disp('The car can not get the speed range from (0-137)km/h');
end
clear a1;
clear a2;
clear a3;
disp(['The distance when running in 5s is (Standard >=42.7m) : ',
num2str(dist)]);
disp(['The max acceleration is (Standard >=5m/s^2 ): ',
num2str(maxAcc)]);
disp(['The max speed is (Standard >=137km/h ): ',
num2str(maxSpeed)]);
if c==0
disp('ADVISOR CAN NOT calculate the grade: ');
else
disp(['The max grade is: ', num2str(gra)]);
end
disp(['The value of fitness function is: ', num2str(result)]);
disp(' ');
clear gr;
clear re;
end
else
result=-1;
end
end
end
148
4.1.2. GIẢI THUẬT PBA
% PHẦN MỀM TỐI ƯU HÓA CHO XE HONDA INSIGHT 2000 SỬ DỤNG GIẢI THUẬT PBA
% TÁC GIẢ : VŨ THĂNG LONG – KHOA CƠ KHÍ – ĐẠI HỌC NHA TRANG
% SẢN PHẨM CỦA LUẬN ÁN TIẾN SỸ : “NGHIÊN CỨU TỐI ƯU HÓA THIẾT KẾ ĐỘ LỚN VÀ THAM
SỐ ĐIỀU KHIỂN NGUỒN NĂNG LƯỢNG HỆ ĐỘNG LỰC XE HYBRID”
function main_opt
global Par_Q
global i1_min % Giới hạn dưới của 'fc_trq_scale'
global i2_min % Giới hạn dưới của 'mc_trq_scale'
global i3_min % Giới hạn dưới của 'ess_cap_scale'
global i4_min % Giới hạn dưới của 'cs_dl_assist_trq_threshold'
global i5_min % Giới hạn dưới của 'cs_mc_assist_min_frac'
global i6_min % Giới hạn dưới của 'cs_mc_assist_slope'
global i7_min % Giới hạn dưới của 'cs_mc_assist_max_frac'
global i8_min % Giới hạn dưới của 'cs_dl_regen_trq_threshold'
global i9_min % Giới hạn dưới của 'cs_mc_regen_min_frac'
global i10_min % Giới hạn dưới của 'cs_mc_regen_slope'
global i11_min % Giới hạn dưới của 'cs_mc_regen_max_frac'
global i12_min % Giới hạn dưới của 'cs_decel_regen_threshold'
global i13_min % Giới hạn dưới của 'cs_lo_soc'
global i14_min % Giới hạn dưới của 'cs_hi_soc'
global i1_max % Giới hạn trên của 'fc_trq_scale'
global i2_max % Giới hạn trên của 'mc_trq_scale'
global i3_max % Giới hạn trên của 'ess_cap_scale'
global i4_max % Giới hạn trên của 'cs_dl_assist_trq_threshold'
global i5_max % Giới hạn trên của 'cs_mc_assist_min_frac'
global i6_max % Giới hạn trên của 'cs_mc_assist_slope'
global i7_max % Giới hạn trên của 'cs_mc_assist_max_frac'
global i8_max % Giới hạn trên của 'cs_dl_regen_trq_threshold'
global i9_max % Giới hạn trên của 'cs_mc_regen_min_frac'
global i10_max % Giới hạn trên của 'cs_mc_regen_slope'
global i11_max % Giới hạn trên của 'cs_mc_regen_max_frac'
global i12_max % Giới hạn trên của 'cs_decel_regen_threshold'
global i13_max % Giới hạn trên của 'cs_lo_soc'
global i14_max % Giới hạn trên của 'cs_hi_soc'
global FC % Tiêu thụ nhiên liệu
global HC % Hàm lượng HC
global CO % Hàm lượng CO
global Nox % Hàm lượng NOx
global accel1
global accel2
global accel3
global dist
global maxAcc % Gia tốc cực đại
global maxSpeed
global gra % Khả năng leo dốc
global time; % Thời gian tăng tốc
clc; close all; clear all; % Xóa màn hình, xóa trị số biến
input.init.saved_veh_file='INSIGHT_defaults_in';
[a,b]=adv_no_gui('initialize',input);
i1_min=0.271; % Giá trị nhỏ nhất của 'fc_trq_scale'
i1_max=0.49; % Giá trị lớn nhất của 'fc_trq_scale'
i2_min=0.271; % Giá trị nhỏ nhất của 'mc_trq_scale'
i2_max=1.355; % Giá trị lớn nhất của 'mc_trq_scale'
i3_min=0.97; % Giá trị nhỏ nhất của 'ess_cap_scale'
i3_max=4.84; % Giá trị lớn nhất của 'ess_cap_scale'
149
i4_min=0; % Giá trị nhỏ nhất của 'cs_dl_assist_trq_threshold'
i4_max=60; % Giá trị lớn nhất của 'cs_dl_assist_trq_threshold' (N.m)
i5_min=0; % Giá trị nhỏ nhất của 'cs_mc_assist_min_frac'
i5_max=0.2; % Giá trị lớn nhất của 'cs_mc_assist_min_frac'
i6_min=0; % Giá trị nhỏ nhất của 'cs_mc_assist_slope'
i6_max=1; % Giá trị lớn nhất của 'cs_mc_assist_slope'
i7_min=0.21; % Giá trị nhỏ nhất của 'cs_mc_assist_max_frac'
i7_max=1;% Giá trị lớn nhất của 'cs_mc_assist_max_frac'
i8_min=-40; % Giá trị nhỏ nhất của 'cs_dl_regen_trq_threshold',
i8_max=0;% Giá trị lớn nhất của 'cs_dl_regen_trq_threshold',
i9_min=0; % Giá trị nhỏ nhất của 'cs_mc_regen_min_frac'
i9_max=0.2;% Giá trị lớn nhất của 'cs_mc_regen_min_frac'
i10_min=0; % Giá trị nhỏ nhất của 'cs_mc_regen_slope'
i10_max=1;% Giá trị lớn nhất của 'cs_mc_regen_slope'
i11_min=0.21; % Giá trị nhỏ nhất của 'cs_mc_regen_max_frac'
i11_max=1;% Giá trị lớn nhất của 'cs_mc_regen_max_frac'
i12_min=0; % Giá trị nhỏ nhất của 'cs_decel_regen_threshold'
i12_max=30;% Giá trị lớn nhất của 'cs_decel_regen_threshold'
i13_min=0.15; %Giá trị nhỏ nhất của 'cs_lo_soc'
i13_max=0.57;% Giá trị lớn nhất của 'cs_lo_soc'
i14_min=0.58; % Giá trị nhỏ nhất của 'cs_hi_soc'
i14_max=0.95;% Giá trị lớn nhất của 'cs_hi_soc'
n= 22; % Số lượng ong trinh sát ban đầu
itr= 30; % Số vòng lặp
e=7; % Số vị trí tìm kiếm được chọn
m=5; % Số ong trung bình tìm kiếm ở vùng được chọn
rho = 0.01; % Tốc độ suy giảm pheromone
alfa=0.5; % Mũ
beta=1; % Mũ
ngh1=(i1_max-i1_min)/40; % Bán kính tìm kiếm cục bộ
ngh2=(i2_max-i2_min)/40;
ngh3=(i3_max-i3_min)/40;
ngh4=(i4_max-i4_min)/40;
ngh5=(i5_max-i5_min)/40;
ngh6=(i6_max-i6_min)/40;
ngh7=(i7_max-i7_min)/40;
ngh8=(i8_max-i8_min)/40;
ngh9=(i9_max-i9_min)/40;
ngh10=(i10_max-i10_min)/40;
ngh11=(i11_max-i11_min)/40;
ngh12=(i12_max-i12_min)/40;
ngh13=(i13_max-i13_min)/40;
ngh14=(i14_max-i14_min)/40;
load count; % Biến count nhớ số lần lặp
disp(count)
if count==0 % Kiểm tra xem có phải là lần đầu chạy chương trình không ?
disp(' ');
disp('This is THE FIRST time to run the optimization program');
disp(' ');
ph = ones(100,e) % Khởi tạo pheromone cho mỗi vùng
150
fitscore = zeros(100,e)
selpatch=zeros(100,e);
for i=1:e
selpatch(1,i)=m;
end
selpatch(1,i)=m
element=0; % Đếm số ong tìm kiếm
U=X_random(n,i1_max,i2_max,i3_max,i4_max,i5_max,i6_max,i7_max,i8_max,i9_max,i10_m
ax,i11_max,i12_max,i13_max,i14_max,i1_min,i2_min,i3_min,i4_min,i5_min,i6_min,i7_m
in,i8_min,i9_min,i10_min,i11_min,i12_min,i13_min,i14_min)
for i=1:n
Par_Q(i,1)=U(i,1);
Par_Q(i,2)=U(i,2);
Par_Q(i,3)=U(i,3);
Par_Q(i,4)=U(i,4);
Par_Q(i,5)=U(i,5);
Par_Q(i,6)=U(i,6);
Par_Q(i,7)=U(i,7);
Par_Q(i,8)=U(i,8);
Par_Q(i,9)=U(i,9);
Par_Q(i,10)=U(i,10);
Par_Q(i,11)=U(i,11);
Par_Q(i,12)=U(i,12);
Par_Q(i,13)=U(i,13);
Par_Q(i,14)=U(i,14);
temp=fn(U(i,1),U(i,2),U(i,3),U(i,4),U(i,5),U(i,6),U(i,7),U(i,8),U(i,9),U(i,10),U(
i,11),U(i,12),U(i,13),U(i,14));
while temp==-1
U(i,:)=X_random(1,i1_max,i2_max,i3_max,i4_max,i5_max,i6_max,i7_max,i8_max,i9_max,
i10_max,i11_max,i12_max,i13_max,i14_max,i1_min,i2_min,i3_min,i4_min,i5_min,i6_min
,i7_min,i8_min,i9_min,i10_min,i11_min,i12_min,i13_min,i14_min)
Par_Q(i,1)=U(i,1);
Par_Q(i,2)=U(i,2);
Par_Q(i,3)=U(i,3);
Par_Q(i,4)=U(i,4);
Par_Q(i,5)=U(i,5);
Par_Q(i,6)=U(i,6);
Par_Q(i,7)=U(i,7);
Par_Q(i,8)=U(i,8);
Par_Q(i,9)=U(i,9);
Par_Q(i,10)=U(i,10);
Par_Q(i,11)=U(i,11);
Par_Q(i,12)=U(i,12);
Par_Q(i,13)=U(i,13);
Par_Q(i,14)=U(i,14);
temp=fn(U(i,1),U(i,2),U(i,3),U(i,4),U(i,5),U(i,6),U(i,7),U(i,8),U(i,9),U(i,10),U(
i,11),U(i,12),U(i,13),U(i,14));
end
Par_Q(i,15)=temp;
Par_Q(i,16)=FC;
Par_Q(i,17)=HC;
Par_Q(i,18)=CO;
Par_Q(i,19)=NOx;
Par_Q(i,20)=PM;
Par_Q(i,21)=accel1;
Par_Q(i,22)=accel2;
Par_Q(i,23)=accel3;
Par_Q(i,24)=dist;
Par_Q(i,25)=maxAcc;
Par_Q(i,26)=maxSpeed;
151
Par_Q(i,27)=gra;
Par_Q(i,28)=time;
element=element+1;
all_bees(element,:)=[element,U(i,1),U(i,2),U(i,3),U(i,4),U(i,5),U(i,6),U(i,7),U(i
,8),U(i,9),U(i,10),U(i,11),U(i,12),U(i,13),U(i,14),temp,FC,HC,CO,NOx,PM,accel1,ac
cel2,accel3,dist,maxAcc,maxSpeed,gra,time];
disp(' ');
disp(sprintf('The number of evaluated fitness functions:
%02.0f',element));
disp(' ');
end
Par_Q=sortrows(Par_Q,15)
all_inter_val(1,:)=[0,Par_Q(1,:)];
first=Par_Q;
last=first;
save all_bees all_bees;
save first first;
save element element;
save all_inter_val all_inter_val;
save ph ph;
save fitscore fitscore;
save selpatch selpatch;
U
clear U;
clear i; h=0;
else % Thực hiện khi không phải là lần đầu chạy chương trình
disp(' ');
disp('This is NOT the first time to run the optimization program');
disp(' ');
load all_bees;
load last;
Par_Q=last
load all_inter_val
load ph
load fitscore
load selpatch
load element
end
Par_Q1=Par_Q(:,15)'
for k=count+1:count+itr % Bắt đầu vòng lặp
disp(' ');
disp(sprintf('Interation Number: %02.0f',k));
disp(' ');
if k> 1
for h=1:e
fitscore(k,h)=(Par_Q1(1,h) - Par_Q1(1,e+1)) / (sum(Par_Q1(1,1:e)
- Par_Q1(1,e+1))); % Fitness score
selpatch(k,h)=round(((ph(k-
1,h))^alfa*((fitscore(k,h))^beta))/(sum((ph(k-
1,1:e).^alfa.*(fitscore(k,h).^beta))))*m*e); % Tính số ong tìm kiếm
if selpatch(k,h) > 0
ph(k,h) = ph(k-1,h)* rho + (fitscore(k,h)*selpatch(k,h));
% Cập nhật pheromone
else
ph(k,h) = ph(k-1,h)* rho;
end
end
end
for j=1:e % Số lượng vùng tìm kiếm được chọn
for i=1:selpatch(k,j) % Số lượng ong tìm kiếm vùng được chọn
% Tìm kiếm lân cận vùng chọn
152
U=bee_dance(ngh1,ngh2,ngh3,ngh4,ngh5,ngh6,ngh7,ngh8,ngh9,ngh10,ngh11,ngh12,ngh13,
ngh14,Par_Q(j,1),Par_Q(j,2),Par_Q(j,3),Par_Q(j,4),Par_Q(j,5),Par_Q(j,6),Par_Q(j,7
),Par_Q(j,8),Par_Q(j,9),Par_Q(j,10),Par_Q(j,11),Par_Q(j,12),Par_Q(j,13),Par_Q(j,1
4),i1_min,i2_min,i3_min,i4_min,i5_min,i6_min,i7_min,i8_min,i9_min,i10_min,i11_min
,i12_min,i13_min,i14_min,i1_max,i2_max,i3_max,i4_max,i5_max,i6_max,i7_max,i8_max,
i9_max,i10_max,i11_max,i12_max,i13_max,i14_max);
temp=fn(U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10),U(11),U(12),U(13),U(14
));
while temp==-1
U=bee_dance(ngh1,ngh2,ngh3,ngh4,ngh5,ngh6,ngh7,ngh8,ngh9,ngh10,ngh11,ngh12,ngh13,
ngh14,Par_Q(j,1),Par_Q(j,2),Par_Q(j,3),Par_Q(j,4),Par_Q(j,5),Par_Q(j,6),Par_Q(j,7
),Par_Q(j,8),Par_Q(j,9),Par_Q(j,10),Par_Q(j,11),Par_Q(j,12),Par_Q(j,13),Par_Q(j,1
4),i1_min,i2_min,i3_min,i4_min,i5_min,i6_min,i7_min,i8_min,i9_min,i10_min,i11_min
,i12_min,i13_min,i14_min,i1_max,i2_max,i3_max,i4_max,i5_max,i6_max,i7_max,i8_max,
i9_max,i10_max,i11_max,i12_max,i13_max,i14_max);
temp=fn(U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10),U(11),U(12),U(13),U(14
));
end
if temp< Par_Q(j,15)
Par_Q(j,:)=[U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10),U(11),U(12),U(13),
U(14),temp,FC,HC,CO,NOx,PM,accel1,accel2,accel3,dist,maxAcc,maxSpeed,gra,time];
end
element=element+1;
all_bees(element,:)=[element,U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10),U
(11),U(12),U(13),U(14),temp,FC,HC,CO,NOx,PM,accel1,accel2,accel3,dist,maxAcc,maxS
peed,gra,time];
disp(' ');
disp(sprintf('The number of evaluated fitness functions:
%02.0f',element));
disp(' ');
end
end
% ____________________________________________________________________
for i=e+1:n
U=X_random(1,i1_max,i2_max,i3_max,i4_max,i5_max,i6_max,i7_max,i8_max,i9_max,i10_m
ax,i11_max,i12_max,i13_max,i14_max,i1_min,i2_min,i3_min,i4_min,i5_min,i6_min,i7_m
in,i8_min,i9_min,i10_min,i11_min,i12_min,i13_min,i14_min);
temp=fn(U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10),U(11),U(12),U(13),U(14
));
while temp==-1
U=X_random(1,i1_max, i2_max,i3_max, i4_max, i5_max, i6_max,i7_max,
i8_max,i9_max,i10_max,i11_max, i12_max,i13_max,i14_max, i1_min, i2_min,i3_min,
i4_min,i5_min,i6_min,i7_min,i8_min,i9_min,i10_min,i11_min,i12_min,i13_min,i14_min
);
temp=fn(U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10),U(11),U(12),U(13),U(14
));
end
Par_Q(i,:)=[U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10),U(11),U(12),U(13),
U(14),temp,FC,HC,CO,NOx,PM,accel1,accel2,accel3,dist,maxAcc,maxSpeed,gra];
element=element+1;
all_bees(element,:)=[element,U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10),U
(11),U(12),U(13),U(14),temp,FC,HC,CO,NOx,PM,accel1,accel2,accel3,dist,maxAcc,maxS
peed,gra,time];
disp(' ');
153
disp(sprintf('The number of evaluated fitness functions:
%02.0f',element));
disp(' ');
end
Par_Q=sortrows(Par_Q,15)
Par_Q1=Par_Q(:,15)'
all_inter_val(k+1,:)=[k,Par_Q(1,:)]; % Giá trị của ong tốt nhất tại vòng
lặp k'
xlswrite('R_all_inter_val',all_inter_val) % Xuất sang excel
xlswrite('R_all_bees',all_bees) % Xuất sang excel
end
count=count+itr;
first=last
last=Par_Q;
xlswrite('R_last',last)
a=['fc_trq_scale','mc_trq_scale','ess_cap_scale','cs_dl_assist_trq_threshold','cs
_mc_assist_min_frac','cs_mc_assist_slope','cs_mc_assist_max_frac','cs_dl_regen_tr
q_threshold','cs_mc_regen_min_frac','cs_mc_regen_slope','cs_mc_regen_max_frac','c
s_decel_regen_threshold','cs_lo_soc','cs_hi_soc','FC'];
disp(' ');
disp(a);
last
a=['order
','fc_trq_scale','mc_trq_scale','ess_cap_scale','cs_dl_assist_trq_threshold','cs_
mc_assist_min_frac','cs_mc_assist_slope','cs_mc_assist_max_frac','cs_dl_regen_trq
_threshold','cs_mc_regen_min_frac','cs_mc_regen_slope','cs_mc_regen_max_frac','cs
_decel_regen_threshold','cs_lo_soc','cs_hi_soc','FC'];
disp(' ');
disp(a);
all_inter_val
save count count; % Lưu các biến vào bộ nhớ để lần chạy sau
save last last;
save all_inter_val all_inter_val;
save ph ph;
save fitscore fitscore;
save selpatch selpatch;
save element element;
save all_bees all_bees;
plot(all_inter_val(:,1),all_inter_val(:,16)); % Vẽ đồ thị hội tụ
grid on;
% Các hàm “bee_dance”; “X_random”; “fn” tương tự như của BBA nên không trình bày
ở đây
end
4.2. TỐI ƯU CHO Ô TÔ TOYOTA PRIUS 1998
% PHẦN MỀM TỐI ƯU HÓA CHO XE TOYOTA PRIUS 1998 SỬ DỤNG GIẢI THUẬT PBA
% TÁC GIẢ : VŨ THĂNG LONG – KHOA CƠ KHÍ – ĐẠI HỌC NHA TRANG
% SẢN PHẨM CỦA LUẬN ÁN TIẾN SỸ : “NGHIÊN CỨU TỐI ƯU HÓA THIẾT KẾ ĐỘ LỚN VÀ THAM
SỐ ĐIỀU KHIỂN NGUỒN NĂNG LƯỢNG HỆ ĐỘNG LỰC XE HYBRID”
function main_opt
global Par_Q
global i1_min % Giới hạn dưới của 'fc_trq_scale'
global i2_min % Giới hạn dưới của 'mc_trq_scale'
global i3_min % Giới hạn dưới của 'ess_cap_scale'
global i4_min % Giới hạn dưới của 'gc_trq_scale'
global i5_min % Giới hạn dưới của 'cs_electric_launch_spd'
global i6_min % Giới hạn dưới của 'cs_min_pwr'
global i7_min % Giới hạn dưới của 'cs_eng_on_soc'
global i8_min % Giới hạn dưới của 'cs_eng_min_spd'
global i9_min % Giới hạn dưới của 'cs_lo_soc'
154
global i10_min % Giới hạn dưới của 'cs_hi_soc'
global i1_max % Giới hạn trên của 'fc_trq_scale'
global i2_max % Giới hạn trên của 'mc_trq_scale'
global i3_max % Giới hạn trên của 'ess_cap_scale'
global i4_max % Giới hạn trên của 'gc_trq_scale'
global i5_max % Giới hạn trên của 'cs_electric_launch_spd'
global i6_max % Giới hạn trên của 'cs_min_pwr'
global i7_max % Giới hạn trên của 'cs_eng_on_soc'
global i8_max % Giới hạn trên của 'cs_eng_min_spd'
global i9_max % Giới hạn trên của 'cs_lo_soc'
global i10_max % Giới hạn trên của 'cs_hi_soc'
global FC % Tiêu thụ nhiên liệu
global HC % Hàm lượng ô nhiễm
global CO
global NOx
global accel1 % Tính năng động lực học
global accel2
global accel3
global dist
global maxAcc
global maxSpeed
global gra % Khả năng leo dốc
global gra % Thời gian tăng tốc
global fc_mass1 % Khối lượng các bộ phận hệ động lực
global mc_mass1
global ess_mass1
global gc_mass1
global ex_mass1
global total_vehicle_mass
clc; close all; clear all;
input.init.saved_veh_file='PRIUS_JPN_defaults_in';
[a,b]=adv_no_gui('initialize',input);
i1_min=0.388; %Giá trị nhỏ nhất của'fc_trq_scale'
i1_max=0.699; %Giá trị lớn nhất của'fc_trq_scale'
i2_min=0.107; %Giá trị nhỏ nhất của'mc_trq_scale'
i2_max=0.535; %Giá trị lớn nhất của'mc_trq_scale'
i3_min=0.59; %Giá trị nhỏ nhất của'ess_cap_scale'
i3_max=2.95; %Giá trị lớn nhất của'ess_cap_scale'
i4_min=0.221; %Giá trị nhỏ nhất của'gc_trq_scale'
i4_max=1.106; %Giá trị lớn nhất của'gc_trq_scale'
i5_min=5; %Giá trị nhỏ nhất của'cs_electric_launch_spd'
i5_max=20;% Giá trị lớn nhất của'cs_electric_launch_spd'
i6_min=4000; %Giá trị nhỏ nhất của'cs_min_pwr'
i6_max=8000; % Giá trị lớn nhất của'cs_min_pwr'
i7_min=0.41; %Giá trị nhỏ nhất của'cs_eng_on_soc'
i7_max=0.60;% Giá trị lớn nhất của'cs_eng_on_soc'
i8_min=100; %Giá trị nhỏ nhất của'cs_eng_min_spd'
i8_max=150; %Giá trị lớn nhất của'cs_eng_min_spd'
i9_min=0.15; %Giá trị nhỏ nhất của'cs_lo_soc'
i9_max=0.40;% Giá trị lớn nhất của'cs_lo_soc'
i10_min=0.61; %Giá trị nhỏ nhất của'cs_hi_soc'
i10_max=0.95;% Giá trị lớn nhất của'cs_hi_soc'
155
n= 22; % Số lượng ong trinh sát
itr=50; % Số vòng lặp
e=7; % Số lượng vùng được chọn
m=5; % Số ong trung bình tìm kiếm ở vùng được chọn
rho = 0.01; % Tốc độ suy giảm Pheromone
alfa=0.5; % Mũ
beta=1; % Mũ
ngh1=(i1_max-i1_min)/40; % Bán kính vùng tìm kiếm cục bộ
ngh2=(i2_max-i2_min)/40;
ngh3=(i3_max-i3_min)/40;
ngh4=(i4_max-i4_min)/40;
ngh5=(i5_max-i5_min)/40;
ngh6=(i6_max-i6_min)/40;
ngh7=(i7_max-i7_min)/40;
ngh8=(i8_max-i8_min)/40;
ngh9=(i9_max-i9_min)/40;
ngh10=(i10_max-i10_min)/40;
load count;
disp(count)
if count==0 % Kiểm tra xem có phải lần đầu chạy chương trình hay không
disp(' ');
disp('This is THE FIRST time to run the optimization program');
disp(' ');
ph = ones(120,e) % Khởi tạo pheromone
fitscore = zeros(120,e) % Khởi tạo fitscore
selpatch=zeros(120,e); % Khởi tạo selpatch
for i=1:e
selpatch(1,i)=m;
end
selpatch(1,i)=m
element=0;% Khởi tạo số ong bắt đầu
U=X_random(n,i1_max, i2_max,i3_max, i4_max, i5_max, i6_max,i7_max,
i8_max,i9_max,i10_max, i1_min, i2_min,i3_min, i4_min, i5_min,i6_min,
i7_min,i8_min,i9_min,i10_min)
for i=1:n
Par_Q(i,1)=U(i,1);
Par_Q(i,2)=U(i,2);
Par_Q(i,3)=U(i,3);
Par_Q(i,4)=U(i,4);
Par_Q(i,5)=U(i,5);
Par_Q(i,6)=U(i,6);
Par_Q(i,7)=U(i,7);
Par_Q(i,8)=U(i,8);
Par_Q(i,9)=U(i,9);
Par_Q(i,10)=U(i,10);
temp=fn(U(i,1),U(i,2),U(i,3),U(i,4),U(i,5),U(i,6),U(i,7),U(i,8),U(i,9),U(i,10));
while temp==-1 % Nếu không tính được fn
U(i,:)=X_random(1,i1_max,i2_max,i3_max,i4_max,i5_max,i6_max,i7_max,i8_max,i9_max,
i10_max,i1_min,i2_min,i3_min,i4_min,i5_min,i6_min,i7_min,i8_min,i9_min,i10_min)
Par_Q(i,1)=U(i,1);
Par_Q(i,2)=U(i,2);
Par_Q(i,3)=U(i,3);
Par_Q(i,4)=U(i,4);
Par_Q(i,5)=U(i,5);
Par_Q(i,6)=U(i,6);
Par_Q(i,7)=U(i,7);
Par_Q(i,8)=U(i,8);
Par_Q(i,9)=U(i,9);
Par_Q(i,10)=U(i,10);
temp=fn(U(i,1),U(i,2),U(i,3),U(i,4),U(i,5),U(i,6),U(i,7),U(i,8),U(i,9),U(i,10));
end
156
Par_Q(i,11)=temp;
Par_Q(i,12)=FC;
Par_Q(i,13)=HC;
Par_Q(i,14)=CO;
Par_Q(i,15)=NOx;
Par_Q(i,16)=PM;
Par_Q(i,17)=accel1;
Par_Q(i,18)=accel2;
Par_Q(i,19)=accel3;
Par_Q(i,20)=dist;
Par_Q(i,21)=maxAcc;
Par_Q(i,22)=maxSpeed;
Par_Q(i,23)=gra;
Par_Q(i,24)=time;
element=element+1;
all_bees(element,:)=[element,U(i,1),U(i,2),U(i,3),U(i,4),U(i,5),U(i,6),U(i,7),U(i
,8),U(i,9),U(i,10),temp,FC,HC,CO,NOx,PM,accel1,accel2,accel3,dist,maxAcc,maxSpeed
,gra,time];
disp(' ');
disp(sprintf('The number of evaluated fitness functions:
%02.0f',element));
disp(' ');
end
Par_Q=sortrows(Par_Q,11)
all_inter_val(1,:)=[0,Par_Q(1,:)];
first=Par_Q;
last=first;
save all_bees all_bees; % Lưu vào bộ nhớ
save first first;
save element element;
save all_inter_val all_inter_val;
save ph ph;
save fitscore fitscore;
save selpatch selpatch;
U
clear U;
clear i; h=0;
else %% Đây không phải lần đầu chạy chương trình hay không
disp(' ');
disp('This is NOT the first time to run the optimization program');
disp(' ');
load all_bees; % Load dữ liệu từ bộ nhớ
load last;
Par_Q=last
load all_inter_val
load ph
load fitscore
load selpatch
load element;
end
Par_Q1=Par_Q(:,11)'
for k=count+1:count+itr % Bắt đầu vòng lặp
disp(' ');
disp(sprintf('Interation Number: %02.0f',k));
disp(' ');
if k> 1
for h=1:e
fitscore(k,h)=(Par_Q1(1,h) - Par_Q1(1,e+1)) / (sum(Par_Q1(1,1:e)
- Par_Q1(1,e+1))); % Tính Fitness score
selpatch(k,h)=round(((ph(k-
1,h))^alfa*((fitscore(k,h))^beta))/(sum((ph(k-
1,1:e).^alfa.*(fitscore(k,h).^beta))))*m*e); % Tính số ong tìm kiếm cục bộ
157
if selpatch(k,h) > 0
ph(k,h) = ph(k-1,h)* rho + (fitscore(k,h)*selpatch(k,h));
% Cập nhật Pheromone
else
ph(k,h) = ph(k-1,h)* rho;
end
end
end
for j=1:e % Số lượng vùng được chọn
for i=1:selpatch(k,j) % Số lượng ong tìm kiếm vùng được chọn
U=bee_dance(ngh1,ngh2,ngh3,ngh4,ngh5,ngh6,ngh7,ngh8,ngh9,ngh10,
Par_Q(j,1), Par_Q(j,2),Par_Q(j,3),Par_Q(j,4),Par_Q(j,5),
Par_Q(j,6),Par_Q(j,7),Par_Q(j,8),Par_Q(j,9),Par_Q(j,10),i1_min,i2_min,i3_min,i4_m
in,i5_min,i6_min,i7_min,i8_min,i9_min,i10_min,i1_max,i2_max,i3_max,i4_max,i5_max,
i6_max,i7_max,i8_max,i9_max,i10_max);
temp=fn(U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10));
while temp==-1
U=bee_dance(ngh1,ngh2,ngh3,ngh4,ngh5,ngh6,ngh7,ngh8,ngh9,ngh10, Par_Q(j,1),
Par_Q(j,2),Par_Q(j,3),Par_Q(j,4),Par_Q(j,5),
Par_Q(j,6),Par_Q(j,7),Par_Q(j,8),Par_Q(j,9),Par_Q(j,10),i1_min,i2_min,i3_min,i4_m
in,i5_min,i6_min,i7_min,i8_min,i9_min,i10_min,i1_max,i2_max,i3_max,i4_max,i5_max,
i6_max,i7_max,i8_max,i9_max,i10_max);
temp=fn(U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10));
end
if temp< Par_Q(j,11)
Par_Q(j,:)=[U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10),temp,FC,HC,CO,NOx,
PM,accel1,accel2,accel3,dist,maxAcc,maxSpeed,gra,time];
end
element=element+1;
all_bees(element,:)=[element,U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10),t
emp,FC,HC,CO,NOx,PM,accel1,accel2,accel3,dist,maxAcc,maxSpeed,gra,time];
disp(' ');
disp(sprintf('The number of evaluated fitness functions:
%02.0f',element));
disp(' ');
end
end
% ____________________________________________________________________
for i=e+1:n
U=X_random(1,i1_max, i2_max,i3_max, i4_max, i5_max, i6_max,i7_max,
i8_max,i9_max,i10_max, i1_min, i2_min,i3_min, i4_min, i5_min,i6_min,
i7_min,i8_min,i9_min,i10_min);
temp=fn(U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10));
while temp==-1
U=X_random(1,i1_max, i2_max,i3_max, i4_max, i5_max,
i6_max,i7_max, i8_max,i9_max,i10_max, i1_min, i2_min,i3_min, i4_min,
i5_min,i6_min, i7_min,i8_min,i9_min,i10_min);
temp=fn(U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10));
end
Par_Q(i,:)=[U(1), U(2),U(3),U(4),U(5),
U(6),U(7),U(8),U(9),U(10),temp,FC,HC,CO,NOx,PM,accel1,accel2,accel3,dist,maxAcc,m
axSpeed,gra,time];
element=element+1;
all_bees(element,:)=[element,U(1),U(2),U(3),U(4),U(5),U(6),U(7),U(8),U(9),U(10),t
emp,FC,HC,CO,NOx,PM,accel1,accel2,accel3,dist,maxAcc,maxSpeed,gra,time];
disp(' ');
disp(sprintf('The number of evaluated fitness functions:
%02.0f',element));
disp(' ');
158
end
Par_Q=sortrows(Par_Q,11)
Par_Q1=Par_Q(:,11)'
all_inter_val(k+1,:)=[k,Par_Q(1,:)];
xlswrite('R_all_inter_val',all_inter_val)
xlswrite('R_all_bees',all_bees)
end % Kết thúc vòng lặp
count=count+itr;
first=last
last=Par_Q;
xlswrite('R_last',last)
a=['fc_trq_scale' 'mc_trq_scale' 'ess_module_num' 'gc_trq_scale'
'cs_electric_launch_spd' 'cs_min_pwr' 'cs_eng_on_soc' 'cs_eng_min_spd'
'cs_lo_soc' 'cs_hi_soc'];
disp(' ');
disp(a);
last
a=['order ' 'fc_trq_scale' 'mc_trq_scale' 'ess_module_num' 'gc_trq_scale'
'cs_electric_launch_spd' 'cs_min_pwr' 'cs_eng_on_soc' 'cs_eng_min_spd'
'cs_lo_soc' 'cs_hi_soc' 'FC'];
disp(' ');
disp(a);
all_inter_val
save count count;
save last last;
save all_inter_val all_inter_val;
save ph ph;
save fitscore fitscore;
save selpatch selpatch;
save element element;
save all_bees all_bees;
plot(all_inter_val(:,1),all_inter_val(:,12));
grid on;
function
U=bee_dance(ngh1,ngh2,ngh3,ngh4,ngh5,ngh6,ngh7,ngh8,ngh9,ngh10,x1,x2,x3,x4,x5,x6,
x7,x8,x9,x10,x1_min,x2_min,x3_min,x4_min,x5_min,x6_min,x7_min,x8_min,x9_min,x10_m
in,x1_max,x2_max,x3_max,x4_max,x5_max,x6_max,x7_max,x8_max,x9_max,x10_max)
U(:,1)=(x1-ngh1)+(2*ngh1.*rand(size(x1,1),1));
U(:,2)=(x2-ngh2)+(2*ngh2.*rand(size(x2,1),1));
U(:,3)=(x3-ngh3)+(2*ngh3.*rand(size(x3,1),1));
U(:,4)=(x4-ngh4)+(2*ngh4.*rand(size(x4,1),1));
U(:,5)=(x5-ngh5)+(2*ngh5.*rand(size(x5,1),1));
U(:,6)=(x6-ngh6)+(2*ngh6.*rand(size(x6,1),1));
U(:,7)=(x7-ngh7)+(2*ngh7.*rand(size(x7,1),1));
U(:,8)=(x8-ngh8)+(2*ngh8.*rand(size(x8,1),1));
U(:,9)=(x9-ngh9)+(2*ngh9.*rand(size(x9,1),1));
U(:,10)=(x10-ngh10)+(2*ngh10.*rand(size(x10,1),1));
if U(:,1)<x1_min
U(:,1)=x1_min;
end
if U(:,1)>x1_max
U(:,1)=x1_max;
end
if U(:,2)<x2_min
U(:,2)=x2_min;
end
if U(:,2)>x2_max
U(:,2)=x2_max;
end
if U(:,3)<x3_min
U(:,3)=x3_min;
end
if U(:,3)>x3_max
U(:,3)=x3_max;
159
end
if U(:,4)<x4_min
U(:,4)=x4_min;
end
if U(:,4)>x4_max
U(:,4)=x4_max;
end
if U(:,5)<x5_min
U(:,5)=x5_min;
end
if U(:,5)>x5_max
U(:,5)=x5_max;
end
if U(:,6)<x6_min
U(:,6)=x6_min;
end
if U(:,6)>x6_max
U(:,6)=x6_max;
end
if U(:,7)<x7_min
U(:,7)=x7_min;
end
if U(:,7)>x7_max
U(:,7)=x7_max;
end
if U(:,8)<x8_min
U(:,8)=x8_min;
end
if U(:,8)>x8_max
U(:,8)=x8_max;
end
if U(:,9)<x9_min
U(:,9)=x9_min;
end
if U(:,9)>x9_max
U(:,9)=x9_max;
end
if U(:,10)<x10_min
U(:,10)=x10_min;
end
if U(:,10)>x10_max
U(:,10)=x10_max;
end
end
function X=X_random(n, i1_max, i2_max,i3_max, i4_max, i5_max, i6_max,i7_max,
i8_max,i9_max,i10_max, i1_min, i2_min,i3_min, i4_min, i5_min,i6_min,
i7_min,i8_min,i9_min,i10_min)
X=[i1_min+((rand(n,1)).*(i1_max-i1_min)), i2_min+((rand(n,1)).*(i2_max-
i2_min)),i3_min+((rand(n,1)).*(i3_max-i3_min)),i4_min+((rand(n,1)).*(i4_max-
i4_min)),i5_min+((rand(n,1)).*(i5_max-i5_min)), i6_min+((rand(n,1)).*(i6_max-
i6_min)),i7_min+((rand(n,1)).*(i7_max-i7_min)),i8_min+((rand(n,1)).*(i8_max-
i8_min)),i9_min+((rand(n,1)).*(i9_max-i9_min)),i10_min+((rand(n,1)).*(i10_max-
i10_min))];
end
function
result=fn(i1_val,i2_val,i3_val,i4_val,i5_val,i6_val,i7_val,i8_val,i9_val,i10_val)
input.modify.param={'fc_trq_scale','ess_cap_scale'};
input.modify.value={i1_val,i3_val};
[a,b]=adv_no_gui('modify',input);
160
% Tính khối lượng các bộ phận
fc_mass1=round(evalin('base','fc_mass_scale_fun(fc_mass_scale_coef,fc_spd_scale,f
c_trq_scale,fc_base_mass,fc_acc_mass,fc_fuel_mass)'));
mc_mass1=round(i2_val*56.75);
ess_mass1=evalin('base','round(ess_mass_scale_fun(ess_mass_scale_coef,ess_
module_num,ess_cap_scale,ess_module_mass))');
gc_mass1=round(i4_val*32.7);
ex_mass1=round(evalin('base','ex_mass_scale_fun(ex_mass_scale_coef,fc_pwr_
scale,ex_mass)'));
total_vehicle_mass=round(fc_mass1+mc_mass1+ess_mass1+gc_mass1+918+ex_mass1
+136);
input.modify.param={'fc_trq_scale','mc_trq_scale','ess_cap_scale','gc_trq_
scale','cs_electric_launch_spd','cs_min_pwr','cs_eng_on_soc','cs_eng_min_spd','cs
_lo_soc','cs_hi_soc','veh_mass','wh_1st_rrc'};
input.modify.value={i1_val,i2_val,i3_val,i4_val,i5_val,i6_val,i7_val,i8_va
l,i9_val,i10_val,total_vehicle_mass,0.015};
[a,b]=adv_no_gui('modify',input);
input.cycle.param={'test.name'} ;
input.cycle.value={'CYC_CECDC'};
[a,b]=adv_no_gui('drive_cycle',input); % (1)
if a==0
FC=(100*3.78541178)/(b.cycle.mpgge*1.609344); % liter/100km
HC=b.cycle.hc_gpm/1.609344; %g/km
CO=b.cycle.co_gpm/1.609344; %g/km
NOx=b.cycle.nox_gpm/1.609344; %g/km
PM=b.cycle.pm_gpm/1.609344; %g/km
fail=0;
else
result=-1;
fail=-1;
end
input.accel.param={'spds','dist_in_time', ' time _in_ dist
','max_rate_bool','max_speed_bool'};
input.accel.value={[0 60; 40 60;0 85],5,0.2/1.609344,1,1};
[a,b]=adv_no_gui('accel_test',input);
if a==0
if fail==0 % Nếu không có lỗi xuất hiện
accel1=b.accel.times(1);
accel2=b.accel.times(2);
accel3=b.accel.times(3);
if accel1==-1 % Nếu không tính được accel1
accel1=15; % Nhằm tăng fitness function
a1=-1;
else
a1=0;
end
if accel2==-1
accel2=8;
a2=-1;
else
a2=0;
end
if accel3==-1
accel3=26;
a3=-1;
else
a3=0;
end
dist=b.accel.dist*0.3048; % Quãng đường 5s
dist=b.accel.time; % Thời gian tăng tốc
maxAcc=b.accel.max_rate*0.3048; % Gia tốc cực đại
161
maxSpeed=b.accel.max_speed*1.60934; % Tốc độ cực đại
input.grade.param={'speed','duration','add_mass '};
input.grade.value={12.427,1200,0};
[a,b]=adv_no_gui('grade_test',input);
gr=b.grade.grade;
c=length(gr);
if c==0
gra=0;
else
gra=gr
end
re=0.85*FC/6.8829+0.05*HC/1.0039+0.05*CO/1.1315+0.05*NOx/0.21099+3.5*max(0,120-
maxSpeed)/120+3.5*max(0,11-gra)/11+3.5*max(0,time-20.5)/20.5; % Giá trị hàm mục
tiêu
result=re;
disp(' ');
disp(['FC (liter/100km) is: ', num2str(FC)]);
disp(['HC (g/km) is: ', num2str(HC)]);
disp(['CO (g/km) is: ', num2str(CO)]);
disp(['NOx (g/km) is: ', num2str(NOx)]);
disp(['PM (g/km) is: ', num2str(PM)]);
if a1~=-1
disp(['The time to accelerate from (0 - 97)km/h is (Standard
<=12s): ', num2str(accel1)]);
else
disp('The car CAN NOT get the speed range from (0-97)km/h');
end
if a2~=-1
disp(['The time to accelerate from (64 - 97)km/h is (Standard
<=5.3s): ', num2str(accel2)]);
else
disp('The car CAN NOT get the speed range from (64-97)km/h');
end
if a3~=-1
disp(['The time to accelerate from (0 - 137)km/h is (Standard
<=23.4s): ', num2str(accel3)]);
else
disp('The car can not get the speed range from (0-137)km/h');
end
clear a1;
clear a2;
clear a3;
disp(['The distance when running in 5s is (Standard >=42.7m) : ',
num2str(dist)]);
disp(['The max acceleration is (Standard >=5m/s^2 ): ',
num2str(maxAcc)]);
disp(['The max speed is (Standard >=100km/h ): ',
num2str(maxSpeed)]);
if c==0
disp('ADVISOR CAN NOT calculate the grade: ');
else
disp(['The max grade is (Standard >=12%): ', num2str(gra)]);
end
disp(['The value of fitness function is: ', num2str(result)]);
disp(' ');
clear gr;
clear re;
end
else
result=-1;
end
end
end
Các file đính kèm theo tài liệu này:
- 69_vu_thang_long_luan_an_088.pdf