Синтез СППР для оптимізації парку транспортних засобів та оптимізації маршрутів вантажних перевезень в умовах невизначеності

Автор: Пользователь скрыл имя, 23 Февраля 2013 в 16:00, курсовая работа

Описание работы

В даній курсовій роботі на прикладі розглянуто cинтез системи підтримки прийняття рішень (СППР) для оптимізації парку транспортних засобів та оптимізації маршрутів вантажних перевезень в умовах невизначеності. Для досліджень та аналізу в курсовій роботі було використано різні алгоритми формування маршрутів та різні критерії для прийняття рішень, для оптимізації парку транспортних засобів. Всі розрахунки проводились в декілька етапів :
Формування saving таблиці
Формування маршрутів на основі Saving алгоритму;

Работа содержит 1 файл

КР(Гнатовский В. 501м).doc

— 4.13 Мб (Скачать)

        switch get(handles.step10pm,'Value')

            case 1

                figure('MenuBar','None','Name','Step10 R1','NumberTitle','Off');

                PlotRoute( handles.rout1, handles.x, handles.y, handles.x0, handles.y0, handles.n0, 1 );

            case 2

                figure('MenuBar','None','Name','Step10 R2','NumberTitle','Off');

                PlotRoute( handles.rout2, handles.x, handles.y, handles.x0, handles.y0, handles.n0, 2 );

            case 3

                figure('MenuBar','None','Name','Step10 R3','NumberTitle','Off');

                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,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))

    set(hObject,'BackgroundColor','white');

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,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))

    set(hObject,'BackgroundColor','white');

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','10','11','12','13','14','15'};

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','P','BLM','BLS'};

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-алгоритм','Модифікований Saving-алгоритм','Sweeping-алгоритм','Модифікований Sweeping-алгоритм'};

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(hObject, eventdata, handles)

 

% --- 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,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))

    set(hObject,'BackgroundColor','white');

end

 

% --- Executes on key press with focus on popupmenu8 and none of its controls.

function popupmenu8_KeyPressFcn(hObject, eventdata, handles)

 

% --- 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

Информация о работе Синтез СППР для оптимізації парку транспортних засобів та оптимізації маршрутів вантажних перевезень в умовах невизначеності