Tải bản đầy đủ (.docx) (20 trang)

BÀI TẬP LỚN CÔNG NGHỆ TÍNH TOÁN MỀM SOFT COMPUTING

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.33 MB, 20 trang )

ĐẠI HỌC QUỐC GIA TP. HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA ĐIỆN – ĐIỆN TỬ
---------------o0o---------------

BÁO CÁO BÀI TẬP
MÔN HỌC: PHƯƠNG PHÁP TÍNH TRONG KỸ THUẬT ĐIỆN
(CƠNG NGHỆ TÍNH TỐN MỀM – SOFT COMPUTING)

HVTH
MSHV
GV

: VÕ VĂN TIÊN
: 2070352
: TS. DƯƠNG HỒI NGHĨA

TP. HỒ CHÍ MINH
NGÀY 04 THÁNG 04 NĂM 2021


Bài tập 1.1. Dùng phương pháp phân nhóm mờ, viết m file phân chia tập dữ liệu X  R2 thành
4 nhóm. (Tự tạo tập dữ liệu gồm 1000 phần tử trong R 2). So sánh với K-means
clustering (dùng hàm kmeans).
Bài làm
a. Chương trình phân nhóm mờ
+ Tạo dữ liệu bằng mơ hình Simulink gồm 1000 phần tử:

+ Phân nhóm:
Mã chương trình file .m
X =


n =
c =
m =
%
U =
for
for
for
for
%
for

XX';
size(X,2); % number of data
4;
% number of partition
2;
initialization
zeros(c,n);
kk =
1: floor(n/4), U(1,kk) = 1;
kk =
floor(n/4)+1:2*floor(n/4), U(2,kk) = 1;
kk = 2*floor(n/4)+1:3*floor(n/4), U(3,kk) = 1;
kk = 3*floor(n/4)+1:
n, U(4,kk) = 1;
compute V
k1 = 1 : c
XX1 = 0; XX2 = [0; 0];
for k2 = 1 : n,

XX1 = XX1 + U(k1,k2)^m;
XX2(1) = XX2(1) + X(1,k2)*(U(k1,k2)^m);
XX2(2) = XX2(2) + X(2,k2)*(U(k1,k2)^m);
end
V(1,k1) = XX2(1)/XX1;
V(2,k1) = XX2(2)/XX1;

end
for kk = 1:50
%
compute U
for k1 = 1 : c,
for k2 = 1 : n,
XX = 0;

end
end
end
end


for k = 1 : c,
XXt(1) = X(1,k2)-V(1,k1);
XXt(2) = X(2,k2)-V(2,k1);
XXm(1) = X(1,k2)-V(1,k);
XXm(2) = X(2,k2)-V(2,k);
XX = XX + (XXt(1)*XXt(1) + XXt(2)*XXt(2))/
(XXm(1)*XXm(1) + XXm(2)*XXm(2));
end
U(k1,k2) = 1/XX;

end
end
%
compute V
for k1 = 1 : c
XX1 = 0; XX2 = [0; 0];
for k2 = 1 : n,
XX1 = XX1 + U(k1,k2)^m;
XX2(1) = XX2(1) + X(1,k2)*(U(k1,k2)^m);
XX2(2) = XX2(2) + X(2,k2)*(U(k1,k2)^m);
end
V(1,k1) = XX2(1)/XX1;
V(2,k1) = XX2(2)/XX1;
end
V
end
clf
for kk = 1:n
k2 = 1;
Um = U(1,kk);
for k1 = 2:c
if Um < U(k1,kk), Um = U(k1,kk); k2 = k1; end
end
if k2 == 1, plot(X(1,kk), X(2,kk), 'rx','LineWidth',1),
if k2 == 2, plot(X(1,kk), X(2,kk), 'g*','LineWidth',1),
if k2 == 3, plot(X(1,kk), X(2,kk), 'k+','LineWidth',1),
if k2 == 4, plot(X(1,kk), X(2,kk), 'bo','LineWidth',1),
hold on
end
plot(V(1,1), V(2,1), 'ms','LineWidth',2)

plot(V(1,2), V(2,2), 'ms','LineWidth',2)
plot(V(1,3), V(2,3), 'ms','LineWidth',2)
plot(V(1,4), V(2,4), 'ms','LineWidth',2)

end
end
end
end


+ Kết quả hiển thị ở figure

b. Chương trình phân nhóm dùng thuật tốn Kmean
+ Mã chương trình file .m
[MyK,V] = kmeans(XX,
NN = size(MyK,1)
figure(2)
for kk = 1:NN
if MyK(kk) == 1,
if MyK(kk) == 2,
if MyK(kk) == 3,
if MyK(kk) == 4,
hold on
end
plot(V(1,1), V(1,2),
plot(V(2,1), V(2,2),
plot(V(3,1), V(3,2),
plot(V(4,1), V(4,2),

+ Kết quả hiển thị ở figure


4);

plot(XX(kk,1),
plot(XX(kk,1),
plot(XX(kk,1),
plot(XX(kk,1),

XX(kk,2),
XX(kk,2),
XX(kk,2),
XX(kk,2),

'ms','LineWidth',2)
'ms','LineWidth',2)
'ms','LineWidth',2)
'ms','LineWidth',2)

'rx','LineWidth',1),
'g*','LineWidth',1),
'k+','LineWidth',1),
'bo','LineWidth',1),

end
end
end
end


c. Kết luận:

+ Các tiêu chuẩn phân nhóm khác nhau cho ra những kết quả khác nhau về phân nhóm đối
tượng. Tuy nhiên, các kết quả cũng tương tự nhau

Bài tập 1.2. Dùng Simulink mô phỏng hệ thống điều khiển mờ Mamdani cho đối tượng có hàm
truyền đạt:
G(s) = , r = 0-100

STT = 9 -> a1 = 2.9; a2 = 3.9; b = 1.9, ta có hàm truyền đạt tương ứng với STT:

G(s) = , r = 0-100

Ta thực hiện điều khiển hàm truyền đạt bằng điều khiển PID theo phương pháp Mandani,
khối mơ phịng dung Simulink như sau :


Bên trong khối PID:

Luật điều khiển Mamdani của các khối FuzzyD, FuzzyP, FuzzyI như sau :
+ FuzzyD:

+ FuzzyI:


+ FuzzyP:

+ Kết quả hiển thị ở figure

Nhận xét:



-

Thời gian quá độ thấp >4s
Độ vọt lố thấp
Sau 16s, hệ thống bị mất ổn định

Bài tập 2.1. Huấn luyện mạng truyền thẳng để phân nhóm các phần tử của tập X  R2 thành
hai nhóm xác định bởi đường thẳng x2 = ax1. (Tự tạo tập dữ liệu gồm 1000
phần tử trong R2):
STT = 9 -> a = 0.7; b = 0.84 ta có mạng truyền thẳng phân nhóm được xác định bởi đường
thẳng x2=0.7x1
+ Tạo dữ liệu bằng mơ hình Simulink gồm 1000 phần tử:

+ Phân nhóm:
Mã chương trình file .m
XX = XYd(:,1:2)';
Yd = XYd(:,3)';
% khai bao mang truyen thang voi 2 tin hieu vao
% [-4 4; -4 4] min, max of 2 inputs
% lop an co 10 neurons voi ham tac dong tansig
% lop ra co 1 neuron voi ham tac dong purelin
myNet = newff([-4 4; -4 4],[10 1],{'tansig' 'purelin'},'trainlm');
myNet.trainParam.epochs = 50; % so epoch max
myNet.trainParam.goal = 0.01; % nguong dung
figure(1)
myNet = train(myNet,XX,Yd); % huan luyen
YY = sim(myNet,XX);


figure(2)

clf
plot(YY,'k'), hold on, plot(Yd,'r')
gensim(myNet,0.1)

+ Kết quả hiển thị ở figure
1.5

1

0.5

0

­0.5

­1

­1.5

0

200

400

600

800

1000


1200

Nhận xét: Kết quả đạt gần như mong đợi

Bài tập 2.2. Dùng Simulink mô phỏng hệ thống rời rạc H(z) = (dùng khối discrete transfer
function với sample time = 0.1) với tín hiệu vào là ồn trắng (dùng khối band
limited white noise với sample time = 1). Lưu các tín hiệu vào và ra của hệ thống
vào tập tin (dùng khối to file với sample time = 0.1). Viết m file để đọc dữ liệu trên
trên tập tin và huấn luyện mạng truyền thẳng. So sánh tín hiệu ra của hệ thống
với tín hiệu ra mơ phỏng và dự báo. Nhận xét.

STT = 9 -> a = 0.7; b = 0.84 ta có hàm truyền rời rạc H(z) = ==

Cấu hình tạo dữ liệu, mô phỏng, dự báo của simulink như sau:


Đoạn chương trình m-file:
N = size(XX,1)
% train Adaline
eta = 0.0001;
W = [0; 0; 0];
Nepoch = 10;
for Kepoch = 1:Nepoch
for k = 1:N
X = [XX(k,2:4)'];
Yd = XX(k,1);
Y = X'*W; % adaline
W = W + eta*(Yd-Y)*X;
end

% 1 epoch
end
W
% simulate adaline
for k = 1:N
X = [XX(k,2:4)'];
YY(k,1) = X'*W;
% adaline
end
clf
subplot(211), plot(XX(:,4),'k'), xlabel('t'), ylabel('x'), axis([0
1000 -2 2])


subplot(212), plot(XX(:,1),'r'), hold on, plot(YY,'k'), xlabel('t'),
ylabel('y'), axis([0 1000 -2 2])

Kết quả bằng Figure:
2

x

1
0
­1
­2

0

100


200

300

400

500
t

600

700

800

900

1000

0

100

200

300

400


500
t

600

700

800

900

1000

2

y

1
0
­1
­2

Kết quả huấn luyện mạng

Kết quả dự báo và mô phỏng
Kết luận:
-

Kết quả ngõ ra training mạng giống với kết quả ngõ ra hệ thống.
Kết quả dự đoán chỉ dự đoán được xu hướng gần đúng kết quả ngõ ra.

Kết quả mơ phỏng vì có tiếp nhận tín hiệu hồi tiếp nên mô phỏng đúng với ngõ ra của
hệ thống


Bài tập 2.3. Dùng Simulink mô phỏng hệ thống rời rạc H(z) = (dùng khối discrete
transfer function với sample time = 0.1) với tín hiệu vào là ồn trắng (dùng khối band
limited white noise với sample time = 1). Lưu các tín hiệu vào và ra của hệ thống vào tập
tin (dùng khối to file với sample time = 0.1). Viết m file để đọc dữ liệu trên trên tập tin và
huấn luyện mạng ANFIS. So sánh tín hiệu ra của hệ thống với tín hiệu ra mơ phỏng và
dự báo. Nhận xét.
Tương tự như bài 2.2 ta có hàm truyền tương ứng với STT H(z)=

N = size(XX,1)
myNet = newff([-60 60; -60 60; -2 2],[10 1],{'tansig'
'purelin'},'trainlm');
myNet.trainParam.epochs = 100;
myNet.trainParam.goal = 0.0001;
myNet = train(myNet, XX(:,2:4)', XX(:,1)');
YY = sim(myNet, XX(:,2:4)');
plot(XX(:,1),'r'), hold on, plot(XX(:,1),'k')
gensim(myNet,0.1)

Kết quả bằng Figure:


Kết quả huấn luyện mạng

Kết quả dự báo và mô phỏng
-


Kết luận:
Kết quả ngõ ra training mạng giống với kết quả ngõ ra hệ thống.
Kết quả dự đoán chỉ dự đoán được xu hướng gần đúng kết quả ngõ ra.
Kết quả mơ phỏng vì có tiếp nhận tín hiệu hồi tiếp nên mô phỏng đúng với ngõ
ra của hệ thống.

Bài tập 3.1. Dùng giải thuật di truyền, tìm đường đi ngắn nhất nối các điểm ABCDEFG.


Theo STT ta có: a = 0.7; b = 0.84; d = 0.9
Ta đoạn chương trình .m:
% my_ga.m
clear all
a = 0.7;
b = 0.84;
d = 0.9;
n = 7;
locations(1,:) = [1
, 1
]; %A
locations(2,:) = [1+a
, 1
]; %B
locations(3,:) = [1+a+b
, 1
]; %C
locations(4,:) = [1+a+b+a, 1
]; %D
locations(5,:) = [1+a
, 1-a ]; %E

locations(6,:) = [1+a+b
, 1-a ]; %F
locations(7,:) = [1+a
, 1+d]; %G
AA = meshgrid(1:n);
distances = reshape(sqrt(sum((locations(AA,:)locations(AA',:)).^2,2)),n,n)
% fitness function
FitnessFcn = @(x)open_traveling_salesman_fitness(x,distances);
% ga option
options = gaoptimset('PopulationType','custom','PopInitRange',[1;n]);
options = gaoptimset(options,'CreationFcn',@create_permutations,...
'CrossoverFcn', @crossover_permutation,'MutationFcn',...
@mutate_permutation, 'PlotFcn', [],'Generations',20000,...
'PopulationSize',60,'StallGenLimit',200,'Vectorized','on');
numberOfVariables = n;
[x,fval,reason,output] = ga(FitnessFcn, numberOfVariables, options);
x{1,1}
axis([0 9 -2 7]);
hold on
plot(locations(:,1),locations(:,2),'bo');
plot(locations(x{1,1},1),locations(x{1,1},2),'r.-');
fval
function pop = create_permutations(NVARS,FitnessFcn,options)
%
This function creates a population of permutations


%
POP = CREATE_PERMUTATION(NVARS,FITNESSFCN,OPTIONS) creates a
population

% of permutations POP each with a length of NVARS.
%
%
The arguments to the function are
%
NVARS: Number of variables
%
FITNESSFCN: Fitness function
%
OPTIONS: Options structure used by the GA
%
%

Copyright 2004 The MathWorks, Inc.
$Revision: 1.1.4.1 $ $Date: 2004/03/26 13:26:06 $

totalPopulationSize = sum(options.PopulationSize);
n = NVARS;
pop = cell(totalPopulationSize,1);
for i = 1:totalPopulationSize
pop{i} = randperm(n);
end
end
function xoverKids = crossover_permutation(parents,options,NVARS, ...
FitnessFcn,thisScore,thisPopulation)
%
CROSSOVER_PERMUTATION Custom crossover function for traveling
salesman.
%
XOVERKIDS = CROSSOVER_PERMUTATION(PARENTS,OPTIONS,NVARS, ...

%
FITNESSFCN,THISSCORE,THISPOPULATION) crossovers PARENTS to produce
%
the children XOVERKIDS.
%
%
The arguments to the function are
%
PARENTS: Parents chosen by the selection function
%
OPTIONS: Options structure created from GAOPTIMSET
%
NVARS: Number of variables
%
FITNESSFCN: Fitness function
%
STATE: State structure used by the GA solver
%
THISSCORE: Vector of scores of the current population
%
THISPOPULATION: Matrix of individuals in the current population
%
%

Copyright 2004 The MathWorks, Inc.
$Revision: 1.1.4.1 $ $Date: 2004/03/26 13:26:06 $

nKids = length(parents)/2;
xoverKids = cell(nKids,1); % Normally zeros(nKids,NVARS);
index = 1;

for i=1:nKids
% here is where the special knowledge that the population is a
cell
% array is used. Normally, this would be
thisPopulation(parents(index),:);
parent = thisPopulation{parents(index)};
index = index + 2;


% Flip a section of parent1.
p1 = ceil((length(parent) -1) * rand);
p2 = p1 + ceil((length(parent) - p1- 1) * rand);
child = parent;
child(p1:p2) = fliplr(child(p1:p2));
xoverKids{i} = child; % Normally, xoverKids(i,:);
end
end
function mutationChildren = mutate_permutation(parents ,options,NVARS,
...
FitnessFcn, state, thisScore,thisPopulation,mutationRate)
%
MUTATE_PERMUTATION Custom mutation function for traveling
salesman.
%
MUTATIONCHILDREN = MUTATE_PERMUTATION(PARENTS,OPTIONS,NVARS, ...
%
FITNESSFCN,STATE,THISSCORE,THISPOPULATION,MUTATIONRATE) mutate the
%
PARENTS to produce mutated children MUTATIONCHILDREN.
%

%
The arguments to the function are
%
PARENTS: Parents chosen by the selection function
%
OPTIONS: Options structure created from GAOPTIMSET
%
NVARS: Number of variables
%
FITNESSFCN: Fitness function
%
STATE: State structure used by the GA solver
%
THISSCORE: Vector of scores of the current population
%
THISPOPULATION: Matrix of individuals in the current population
%
MUTATIONRATE: Rate of mutation
%
%

Copyright 2004 The MathWorks, Inc.
$Revision: 1.1.4.1 $ $Date: 2004/03/26 13:26:06 $

% Here we swap two elements of the permutation
mutationChildren = cell(length(parents),1);% Normally
zeros(length(parents),NVARS);
for i=1:length(parents)
parent = thisPopulation{parents(i)}; % Normally
thisPopulation(parents(i),:)

p = ceil(length(parent) * rand(1,2));
child = parent;
child(p(1)) = parent(p(2));
child(p(2)) = parent(p(1));
mutationChildren{i} = child; % Normally mutationChildren(i,:)
end
end
function scores = traveling_salesman_fitness(x,distances)
%
A custom fitness function.
%
SCORES = TRAVELING_SALESMAN_FITNESS(X,DISTANCES) Calculate the
fitness
%
of an individual. The fitness is the total distance traveled for
an


%
ordered set of cities in X. DISTANCE(A,B) is the distance from the
city
%
A to the city B.
%
%

Copyright 2004 The MathWorks, Inc.
$Revision: 1.1.4.1 $ $Date: 2004/03/26 13:26:06 $

scores = zeros(size(x,1),1);

for j = 1:size(x,1)
% here is where the special knowledge that the population is a
cell
% array is used. Normally, this would be pop(j,:);
p = x{j};
f = distances(p(end),p(1));
for i = 2:length(p)
f = f + distances(p(i-1),p(i));
end
scores(j) = f;
end
end

Ta có được kết quả đường đi ngắn nhất như sau:

Bài tập 3.2. Dùng giải thuật di truyền, tìm thơng số của bộ điều khiển PI cho đối tượng
G(s) = sao cho J = min


Theo STT thì ta có: a = 0.7 ; b = 0.84 từ đó ta có hàm truyền G(s) =
Ta có chương trình .m:
clear all
% Stop condition
max_generation = 200;
max_stall_generation = 50;
epsilon = 0.001;
% Parameter
pop_size = 20;
% population size
npar = 2;

% 2 parameters Kp, Ki
range = [ 0
0
% min value
100 100]; % max value
dec = [2 2];
% posiition of decimal point
sig = [5 5];
% 5 gen
cross_prob = 0.9;
% probability of cross
mutate_prob = 0.1; % -------------- mutation
elitism = 1;
% keep the best individual
% par = range*rand(pop_size, npar);
par = InitPop(pop_size, npar, range);
%
stop_condition = 0;
generation = 0;
stall_generation = 0;
for pop_index = 1:pop_size,
Kp = par(pop_index,1);
Ki = par(pop_index,2);
sim('myGA_PID.mdl');
J = e'*e;
fitness(pop_index) = 1/(J+eps); % min
end
[bestfit0, bestchrom] = max(fitness);
while ~stop_condition,
generation = generation + 1;

pop = EncodeDecimal(par, sig, dec);
parent = SelectLinearRanking(pop, fitness, 0.5, elitism,
bestchrom);
%
child = CrossTwoPoint(parent, cross_prob, elitism, bestchrom);
%
pop = MutateUniform(child, mutate_prob, elitism, bestchrom);
%
par = DecodeDecimal(pop, sig, dec);
%
for pop_index = 1:pop_size,
Kp = par(pop_index,1);
Ki = par(pop_index,2);
sim('myGA_PID.mdl');
J = e'*e;
fitness(pop_index) = 1/(J+eps);


end
[bestfit(generation), bestchrom] = max(fitness);
if generation == max_generation
stop_condition = 1;
elseif generation > 1
if abs(bestfit(generation) - bestfit(generation - 1)) <
epsilon
stall_generation = stall_generation + 1;
if stall_generation == max_stall_generation,
stop_condition = 1;
end
else

stall_generation = 0;
end
end
end
plot(1./bestfit);
Kp = par(bestchrom,1);
Ki = par(bestchrom,2);
sim('myGA_PID.mdl');

Mơ hình Simulink:

Kết quả đầu ra Scope:


Nhận xét:
Tín hiệu ngõ ra đáp ứng theo tín hiệu đặt, sai số xác lập rất thấp, đồng thời thời gian xác
lập ngắn (sau 1s) nhưng vẫn xảy ra tình trạng vọt lố



×