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

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ố;

pdf162 trang | Chia sẻ: toanphat99 | Lượt xem: 2427 | Lượt tải: 0download
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:

  • pdf69_vu_thang_long_luan_an_088.pdf
Luận văn liên quan