Автор: Пользователь скрыл имя, 23 Февраля 2013 в 16:00, курсовая работа
В даній курсовій роботі на прикладі розглянуто cинтез системи підтримки прийняття рішень (СППР) для оптимізації парку транспортних засобів та оптимізації маршрутів вантажних перевезень в умовах невизначеності. Для досліджень та аналізу в курсовій роботі було використано різні алгоритми формування маршрутів та різні критерії для прийняття рішень, для оптимізації парку транспортних засобів. Всі розрахунки проводились в декілька етапів :
Формування saving таблиці
Формування маршрутів на основі Saving алгоритму;
switch get(handles.step10pm,'Value')
case 1
figure('MenuBar','None','Name'
PlotRoute( handles.rout1, handles.x, handles.y, handles.x0, handles.y0, handles.n0, 1 );
case 2
figure('MenuBar','None','Name'
PlotRoute( handles.rout2, handles.x, handles.y, handles.x0, handles.y0, handles.n0, 2 );
case 3
figure('MenuBar','None','Name'
PlotRoute( handles.rout3, handles.x, handles.y, handles.x0, handles.y0, handles.n0, 3 );
end
end
% --- Executes on selection change in step10pm.
function step10pm_Callback(hObject, eventdata, handles)
% Hints: contents = get(hObject,'String') returns step10pm contents as cell array
% contents{get(hObject,'Value')} returns selected item from step10pm
% --- Executes during object creation, after setting all properties.
function step10pm_CreateFcn(hObject, eventdata, handles)
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'
set(hObject,'BackgroundColor',
end
% --- Executes on button press in pushbutton8.
function pushbutton8_Callback(hObject, eventdata, handles)
disp(handles.ei);
disp('------------------------
disp('------------------------
disp(handles.eij);
% --- Executes on button press in pushbutton9.
function pushbutton9_Callback(hObject, eventdata, handles)
disp(handles.z);
disp('------------------------
disp('------------------------
% --- графік ефективності
function pushbutton10_Callback(hObject, eventdata, handles)
rb4Value = get(handles.step4rb,'Value');
rb5Value = get(handles.step5rb,'Value');
rb78Value = get(handles.step78rb,'Value');
rb8Value
= get(handles.popupmenu,'Value')
if rb4Value == 1
figure(1);
PlotE(handles.ee, 'Ефективність реалізації кожної з програм для saving-алгоритму');
elseif rb5Value == 1
figure(1);
PlotE( handles.em, 'Ефективність реалізації кожної з програм для модифікованого saving-алгоритму');
elseif rb78Value == 1
figure(1);
PlotE( handles.esw, 'Ефективність маршрутів sweeping-алгоритму');
elseif rb8Value == 1
figure(1);
PlotE( handles.emsw, 'Ефективність маршрутів для модифікованого saving-алгоритму');
end;
guidata(hObject, handles);
% --- Executes on selection change in popupmenu.
function popupmenu_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function popupmenu_CreateFcn(hObject, eventdata, handles)
% Hint: popupmenu controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'
set(hObject,'BackgroundColor',
end
% --- Executes on button press in pushbutton11.
function pushbutton11_Callback(hObject, eventdata, handles)
f1 = figure('Position', [200 200 800 550]);
title('Таблиця оптимізації');
cnames = {'F1','F2','F3'}
rnames = {'Загальна довжина до оптимізації','Загальна довжина після оптимізації','Величина оптимізації'}
dataO = [
handles.ltotal1 handles.ltotal2 handles.ltotal3
handles.totallengthrout11 handles.totallengthrout12 handles.totallengthrout13
handles.d1 handles.d3 handles.d2
];
t3 = uitable('Parent',f1, 'Data', dataO, 'ColumnName', cnames, 'RowName', rnames, 'Position', [20 20 760 500]);
guidata(hObject, handles);
% --- Executes on button press in pushbutton12.
function pushbutton12_Callback(hObject, eventdata, handles)
f1 = figure('Position', [200 200 800 550]);
title('Таблиці матриці рішень');
cnames1 = {'F1','F2','F3'};
rnames = {'3','4','5','6','7','8','9','
dataE = handles.eij;
t3 = uitable('Parent',f1, 'Data', handles.eij, 'ColumnName', cnames1, 'RowName', rnames, 'Position', [20 20 760 500]);
f2 = figure('Position', [200 200 800 550]);
title('Результати застосування критеріїв');
cnames2 = {'MM','BL','S','HW','HL','G','
t4 = uitable('Parent',f2, 'Data', handles.es, 'ColumnName', cnames2, 'RowName', rnames, 'Position', [20 20 760 500]);
guidata(hObject, handles);
% --- Executes on button press in pushbutton13.
function pushbutton13_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton13 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
f = figure('Position', [200 200 800 550]);
title('Таблиці порівняння програм за загальною довжиною маршрутів та ефективністю');
dataL = [
handles.ltotal1 handles.ltotal2 handles.ltotal3;
handles.ltotalm1 handles.ltotalm2 handles.ltotalm3;
handles.ltotalsw1 handles.ltotalsw2 handles.ltotalsw3;
handles.ltotalmsw1 handles.ltotalmsw2 handles.ltotalmsw3;
];
dataE = [
handles.e1,handles.e2 handles.e3;
handles.em1 handles.em2 handles.em3;
handles.esw1 handles.esw2 handles.esw3;
handles.emsw1 handles.emsw2 handles.emsw3;
];
cnames = {'F1','F2','F3'};
rnames = {'Saving-алгоритм','
t1 = uitable('Parent',f, 'Data', dataL, 'ColumnName', cnames, 'RowName', rnames, 'Position', [20 20 760 500]);
t2 = uitable('Parent',f, 'Data', dataE, 'ColumnName', cnames, 'RowName', rnames, 'Position', [20 20 760 380]);
guidata(hObject, handles);
% --- Executes when entered data in editable cell(s) in uitable1.
function uitable1_CellEditCallback(
% --- Executes on selection change in popupmenu8.
function popupmenu8_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function popupmenu8_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'
set(hObject,'BackgroundColor',
end
% --- Executes on key press with focus on popupmenu8 and none of its controls.
function popupmenu8_KeyPressFcn(
% --- Executes during object creation, after setting all properties.
function uipanel5_CreateFcn(hObject, eventdata, handles)
% --- Executes on button press in pushbutton14.
function pushbutton14_Callback(hObject, eventdata, handles)
close();
% --- Executes on button press in pushbutton15.
function pushbutton15_Callback(hObject, eventdata, handles)
function MainForm_OpeningFcn(hObject, eventdata, handles, varargin)
N0 = 28 - 1;
X = [35 52 43 31 22 26 50 55 54 60 47 30 30 12 15 16 21 50 51 50 48 12 15 29 54 55 67 10 6 65];
Y = [16 26 26 76 53 29 40 50 10 15 66 60 50 17 14 19 48 30 42 15 21 38 56 39 38 57 41 70 25 27];
% X та Y - матрицы координат вузлів
output = [
35 16;
52 26;
43 26;
31 76;
22 53;
26 29;
50 40;
55 50;
54 10;
60 15;
47 66;
30 60;
30 50;
12 17;
15 14;
16 19;
21 48;
50 30;
51 42;
50 15;
48 21;
12 38;
15 56;
29 39;
54 38;
55 57;
67 41;
10 70;
6 25;
65 27;]
X0 = 40;
Y0 = 40;
% (X0, Y0) - координати базового (нульового) вузла
DMax = 14.5;
% DMax - максимальна вантажмісткість транспорту
% F1 F2 F3
Q = [
2.14 3.34
7.00;
2.39 3.72
7.79;
0.28 0.52
1.09;
2.39 3.72
7.79;
1.66 2.60
5.44;
0.26 0.40
0.84;
0.73 1.13
2.37;
1.44 2.25
4.70;
2.53 3.93
8.23;
2.54 3.96 8.30;
0.42 0.65 1.35;
2.56 3.99 8.34;
2.53 3.93 8.23;
1.28 1.99 4.17;
2.11 3.29 6.88;
0.37 0.58 1.22;
1.11 1.73 3.63;
2.42 3.76 7.87;
2.09 3.25 6.81;
2.53 3.94 8.25;
1.73 2.69 5.64;
0.09 0.15 0.31;
2.24 3.49 7.30;
2.46 3.84 8.03;
1.79 2.79 5.83;
1.99 3.11 6.51;
1.96 3.05 6.39;
1.03 1.61 3.37;
1.73 2.69 5.64;
0.45 0.70 1.47;
];
Coef = [ 10100, 35, 2800, 4500, 3000 ];
QP = [ 0,27330 0,21685 0,50985 ];
%% ===[ Етап 2 ]===
[L, L0] = DistMatrix(X, Y, X0, Y0)
S = SavingMatrix(X, Y, X0, Y0, N0)
[G, GX, GY] = GamiltonCycle(S, X, Y, X0, Y0, N0)
%% ===[ Етап 4 ]===
E=[];
[R1, Data1, LTotal1, E(1)] = GetRoutes(G, Q(:,1), L, L0, DMax, N0)
[R2, Data2, LTotal2, E(2)] = GetRoutes(G, Q(:,2), L, L0, DMax, N0)
[R3, Data3, LTotal3, E(3)] = GetRoutes(G, Q(:,3), L, L0, DMax, N0)
%% ===[ Етап 5 ]===
EM=[];
[ RM1, DataM1, LTotalM1, EM(1) ] = GetModRoute( S, X, Y, X0, Y0, Q(:,1), L, L0, DMax, N0)
[ RM2, DataM2, LTotalM2, EM(2) ] = GetModRoute( S, X, Y, X0, Y0, Q(:,2), L, L0, DMax, N0)
[ RM3, DataM3, LTotalM3, EM(3) ] = GetModRoute( S, X, Y, X0, Y0, Q(:,3), L, L0, DMax, N0)
%% ===[ Етап 6 ]===
[ SW, SWX, SWY ] = SweepingMatrix( X, Y, X0, Y0, N0 )
%% ===[ Етапи 7 ]===
ESW=[]
[ RSW1, DataSW1, LTotalSW1, ESW(1) ] = GetRoutes( SW, Q(:, 1), L, L0, DMax, N0 )
[ RSW2, DataSW2, LTotalSW2, ESW(2) ] = GetRoutes( SW, Q(:, 2), L, L0, DMax, N0 )
[ RSW3, DataSW3, LTotalSW3, ESW(3) ] = GetRoutes( SW, Q(:, 3), L, L0, DMax, N0 )
% 8 етап
[ MSW, MSWX, MSWY ] = GetModifiedSweepingMatrix( X, Y, X0, Y0, N0 )
EMSW = [];
[ RMSW1, DataMSW1, LTotalMSW1, EMSW(1) ] = GetRoutes( MSW, Q(:, 1), L, L0, DMax, N0 )
[ RMSW2, DataMSW2, LTotalMSW2, EMSW(2) ] = GetRoutes( MSW, Q(:, 2), L, L0, DMax, N0 )
[ RMSW3, DataMSW3, LTotalMSW3, EMSW(3) ] = GetRoutes( MSW, Q(:, 3), L, L0, DMax, N0 )
%% ===[ Етап 10 ]===
TotalLengthROut = zeros(1, 5)
%RM1
LTotalM1
[ ROut1, LengthROut1, TotalLengthROut(1, 1) ] = OptimizeRoutes( RM1, L, L0, N0 )
d1 = LTotalM1 - TotalLengthROut(1, 1)
%RM2
LTotalM2
[ ROut2, LengthROut2, TotalLengthROut(1, 2) ] = OptimizeRoutes( RM2, L, L0, N0 )
d2 = LTotalM2 - TotalLengthROut(1, 2)
%R3
LTotal3
[ ROut3, LengthROut3, TotalLengthROut(1, 3) ] = OptimizeRoutes( R3, L, L0, N0 )
d3 = LTotal3 - TotalLengthROut(1, 3)
TotalLengthROut(1, 3)=LTotal3
%% ===[ Етап 11 ]===
F = sum(Q, 1);
[rc1, nothing] = size(RM1)
[rc2, nothing] = size(RM2)
[rc3, nothing] = size(R3)
RC = [rc1 rc2 rc3];
LL = TotalLengthROut;
%
[ EI, EIJ ] = GetResultMatrix( F, RC, LL, DMax, Coef )
%% ===[ Етап 12 ]===
[ Z, ES ] = Criterians( EIJ, QP, 0.5, 0.5 )
function [res] = generateOrderSize(random, Dmax)
res = size(random);
n = length(random);
res(1) = 3*Dmax*(1+random(1));
for i = 2:n
res(i) = res(i-1)*(1+random(i));
end
end
function [Q] = generateQ(randomX, Fi, Dmax)
sumRandomX = 0;
normParametr = size(randomX);
m = length(randomX);
n = length(Fi);
for i = 1:m
sumRandomX = sumRandomX+randomX(i);
end
disp('sumRandomX')
sumRandomX
for i = 1:m
normParametr(i) = randomX(i)/sumRandomX;
end
disp('normParametr')
normParametr
for i = 1:m
for j = 1:n
Q(i,j)=normParametr(i)*Fi(j);
end
end
Qmax = max(Q(:));
if (Qmax>=Dmax)
Dmax = Qmax + rand(0,1*Qmax);
end
disp('Dmax')
Dmax
disp('Qmax')
Qmax
end
function [ L, L0 ] = GetDistanceMatrix( X, Y, X0, Y0 )
n = length(X);
L = zeros(n, n);
L0 = zeros(1, n);
for i = 1:n
dx = X0 - X(i);
dy = Y0 - Y(i);
L0(1, i) = sqrt(dx^2 + dy^2);
for j = (i+1):n
dx = X(i) - X(j);
dy = Y(i) - Y(j);
L(i, j) = sqrt(dx^2 + dy^2);
L(j, i) = L(i, j);
end
end
end
А.4 Saving-алгоритм
function [ S ] = GetSavingMatrix(X, Y, X0, Y0, N0)
n = length(X);
l = (1 + n) * n / 2 - n;
S = zeros(l, 3); % Столбцы: | i | j | Sij |
k = 0;
for i = 1:n
for j = (i+1):n
L0i = sqrt((X0 - X(i))^2 + (Y0 - Y(i))^2);
L0j = sqrt((X0 - X(j))^2 + (Y0 - Y(j))^2);
Lij = sqrt((X(i) - X(j))^2 + (Y(i) - Y(j))^2);
k = k + 1;
S(k, 1) = i + N0;
S(k, 2) = j + N0;
S(k, 3) = L0i + L0j - Lij;
end
end
S = sortrows(S, -3);
End
function [ G, GX, GY ] = GetGamiltonCicle( S, X, Y, X0, Y0, N0 )
n1 = S(1, 1);
n2 = S(1, 2);
[l, nothing] = size(S);
s = 2;
while s <= l
if (n1 == S(s, 1))
G(1, 1) = n2;
G(1, 2) = n1;
G(1, 3) = S(s, 2);
break
elseif (n1 == S(s, 2))
G(1, 1) = n2;
G(1, 2) = n1;
G(1, 3) = S(s, 1);
break
elseif (n2 == S(s, 1))
G(1, 1) = n1;
G(1, 2) = n2;
G(1, 3) = S(s, 2);
break
elseif (n2 == S(s, 2))
G(1, 1) = n1;
G(1, 2) = n2;
G(1, 3) = S(s, 1);
break
end
s = s + 1;
end
if s > l
G(1, 1) = n1;
G(1, 2) = n2;
end
m = length(X);
for k = 4:m
s = 2;
while s <= l
if G(1, k - 1) == S(s, 1)
c = 1;
while c < k
if (G(1, c) == S(s, 2))
break
end
c = c + 1;
end;
if (c == k)
G(1, k) = S(s, 2);
break
end
elseif G(1, k - 1) == S(s, 2)
c = 1;
while c < k
if (G(1, c) == S(s, 1))
break
end
c = c + 1;
end;
if (c == k)
G(1, k) = S(s, 1);
break
end
end
s = s + 1;
end
if s > l
break
end
end
[ nothing, gColsCount ] = size(G);
GX = zeros(1, gColsCount + 2);
GY = zeros(1, gColsCount + 2);
GX(1, 1) = X0;
GY(1, 1) = Y0;
GX(1, gColsCount + 2) = X0;
GY(1, gColsCount + 2) = Y0;
for i = 1:gColsCount
g = G(1, i) - N0;
GX(1, i + 1) = X(1, g);
GY(1, i + 1) = Y(1, g);
end
end
function [ ] = PlotGamiltonCicle( GX, GY, X, Y, X0, Y0, N0 )
H(1, :) = plot(GX, GY, 'Marker', 'Diamond', 'MarkerSize', 5, 'MarkerFaceColor', 'Cyan', 'MarkerEdgeColor', 'Blue');
M(1, :) = cellstr('Гамільтонів цикл');
hold all
H(2, :) = plot(X0, Y0, 'Marker', 'Square', 'MarkerSize', 8, 'MarkerFaceColor', 'Red', 'MarkerEdgeColor', 'Black', 'LineStyle', 'None');
M(2, :) = cellstr('Базовий вузол');
text(X0, Y0, '-0', 'FontSize', 11, 'FontName', 'Consolas', 'Color', [1.0, 0.2, 0.2], 'FontWeight', 'Bold');
[nothing, m] = size(X);
for i = 1:m
text(X(i), Y(i), strcat('-', num2str(i + N0)), 'FontSize', 9, 'FontName', 'Consolas', 'Color', [0.2, 0.2, 0.2], 'FontWeight', 'Bold');
end
text(GX(2) - 1, GY(2) + 2, 'G');
legend(H, M, 'Location', 'NorthEastOutside');
grid on
axis([0, 80, 0, 80]);
xlabel('X');
ylabel('Y');
title('Гамільтонів цикл ');
end
function [ R, Data, LTotal, E ] = GetRouteMatrix( G, F, L, L0, Dmax, N0)
i = 1;
j = 1; % Индекс для R
n = length(G);
while i <= n
l = 0; % Текущее пройденое растояние
qr = 0; % Текущее количество згруженого товара
dr = 0; % Текущая остача
R(j, 1) = 0;
r = 2; % Индекс для RI
while i <= n
g = G(i) - N0;
f = F(g);
if qr + f <= Dmax
R(j, r) = g + N0;
qr = qr + f;
if (r == 2)
l = l + L0(1, g);
else
l = l + L(R(j, r - 1) - N0, R(j, r) - N0);
end