Қарапайым актілерді белгілеп көрсету

Автор работы: Пользователь скрыл имя, 02 Апреля 2014 в 21:38, курсовая работа

Краткое описание

Электронды есептеуіш машинаның шығуымен байланысты жаңа ғылыми-техникалық революция ғылымның жаңа даму бағытын орнатты. Осындай бағыттардың бірі – операцияны зерттеу ғылымы.
Операция дегеніміз – белгілі мақсатқа жеткізетін және нақты ниетпен біріктірілген шаралар жиынтығы. Операциялар: басқарылатын және басқарылмайтын болады.
Операцияны зерттеу дегеніміз – автоматтандырылған басқару жүйесіндегі басқару есептерін шешуге қолданатын ғылыми тәсіл. Операцияны зерттеу методологиясы негізгі мына топтарға бөлінеді:
- анықтамалар, кезеңдер, принциптер, есептер;
- операцияны зерттеудің математикалық әдістері. Оған сызықтық бағдарламалау, транспорттық, дискреттік бағдарламалау, бейсызықтық бағдарламалау, динамикалық бағдарламалау, ойындар теориясы кіреді;
- АБЖ жобалау кезіндегі операцияларды зерттеудің әдістерін қолдану. Онда АБЖ-ң алгоритмін қамтамасыз ету, информациямен АБЖ-ны қамтамасыз ету, техникалық қамтамасыз ету керек.

Содержание

Кіріспе..............................................................................................................................4
1 Қарапайым актілерді белгілеп көрсету.....................................................................5
2 Жалпы математикалық модельді құру, мақсатты функцияны таңдау және негіздеу............................................................................................................................5
3 Алгоритмнің маңызды ойын баяндау.......................................................................5
3.1 Солтүстік-батыс және минималдау әдісі...................................................6
3.2 Потенциалдау әдісі......................................................................................6
4 Оңтайландыру есебінің айқын математикалық өрнегінің өңделіп, жетілдіруі, оның сандық түрдегі шешімі...................................................................................................7
5 Программа листингісі...............................................................................................12
Программаны баяндау бөлімі.......................................................................................22
Қорытынды....................................................................................................................23
Қолданылған әдебиеттер..............................................................................................24
Қосымшалар...................................................................................................................25

Прикрепленные файлы: 1 файл

Паскаль транспортная задача.doc

— 262.00 Кб (Скачать документ)

                         Z_b[j]:=1;

                         betta[j]:=c[i,j]-alfa[i];

                         inc(k);

                         d:=1=2;

                      end;

           for i:=1 to Nb do

               if Z_b[i]=1 then

                  for j:=1 to Na do

                      if (p[j,i]>-1) and (Z_a[j]=0) then begin

                         Z_a[j]:=1;

                         alfa[j]:=c[j,i]-betta[i];

                         inc(k);

                         d:=1=2;

                      end;

     Until (k=Na+Nb) or d;

     if d then begin

        i:=1;

        While Z_a[i]=1 do inc(i);

        j:=1;

        While Z_b[j]=0 do inc(j);

        p[i,j]:=0;

        Print((j+1)*(n1+1)+n2-8,i*3+4,1,p[i,j],7);

     end;

 

     a_b:=d;

End;

 

Procedure W_p;         {Вывод плана распределения}

var i,j,h,l,k:byte;

    c_max:longint;

Begin

     k:=0;

     for i:=1 to Na do begin

         h:=i*3+4;

         for j:=1 to Nb do begin

             l:=j*(n1+1)+n2-5;

             GotoXY(l,h);

             Write(' ':n1);

             if p[i,j]>0 then begin

                inc(k);

                Print(l-trunc(ln(p[i,j])/ln(10))+5,h,1,p[i,j],14);

             end

             else if p[i,j]=0 then begin

                     Print(l+n1-2,h,1,p[i,j],14);

                     inc(k);

             end;

         end;

     end;

 

     While a_b do inc(k);

 

     if k>Na+Nb-1 then PrintS(40,1,'k > n+m-1',12);

End;

 

Function kkk(var ki,kj:byte):integer; {Расчет  коэф. k}

var i,j:byte;                         {в свободных клетках}

    k,k_min:integer;

    b:boolean;

Begin

     b:=1=1;

     for i:=1 to Na do

         for j:=1 to Nb do

             if p[i,j]=-1 then begin

                k:=c[i,j]-alfa[i]-betta[j];

                if b then begin

                   b:=1=2;

                   ki:=i; kj:=j; k_min:=k;

                end else

                    if k<k_min then begin

                       k_min:=k;

                       ki:=i; kj:=j;

                    end;

                TextColor(6);

                GotoXY(j*(n1+1)+n2-5,i*3+4);

                Write('(',k,')');

             end;

     if k_min<0 then PrintS(kj*(n1+1)+n2,ki*3+4,'X',12);

     kkk:=k_min;

End;

 

Procedure div_mod(c:byte; var a,b:byte);   {Перевод}

Begin                                      {одномерного массива}

     b:=c mod Nb; a:=c div Nb +1;          {в  двумерный}

     if b=0 then begin

        b:=Nb; dec(a);

     end;

End;

 

Procedure Rek(Xi,Yi:byte; var z:boolean; var c:byte);

var i,j:byte;

Begin                    {Рекурсивная процедура.}

   z:=1=2;               {Определяет контур перемещения}

   Case c of

1:   for i:=1 to Na do

         if i<>Xi then

            if p[i,Yi]>-1 then begin

               if u[(i-1)*Nb+Yi]=0 then begin

                  u[(Xi-1)*Nb+Yi]:=(i-1)*Nb+Yi;

                  c:=2;

                  Rek(i,Yi,z,c);

                  if z then exit;

               end;

            end

            else if (i=ki) and (Yi=kj) then begin

                    u[(Xi-1)*Nb+Yi]:=(ki-1)*Nb+kj;

                    z:=not z;

                    exit;

            end;

2:   for i:=1 to Nb do

         if i<>Yi then

           if p[Xi,i]>-1 then begin

               if u[(Xi-1)*Nb+i]=0 then begin

                  u[(Xi-1)*Nb+Yi]:=(Xi-1)*Nb+i;

                  c:=1;

                  Rek(Xi,i,z,c);

                  if z then exit;

               end;

            end

            else if (Xi=ki) and (i=kj) then begin

                    u[(Xi-1)*Nb+Yi]:=(ki-1)*Nb+kj;

                    z:=not z;

                    exit;

            end;

   end;

   u[(Xi-1)*Nb+Yi]:=0;

   c:=c mod 2 +1;

End;

 

Procedure kontur;       {Определяет контур перемещения}

var i,j,k,mi,mj,l:byte;

    z:boolean;

    p_m:longint;

Begin

     for i:=1 to N*N do u[i]:=0;

     l:=1;

     Rek(ki,kj,z,l);

     i:=ki; j:=kj;

     k:=u[(i-1)*Nb+j];

     div_mod(k,i,j);

     mi:=i; mj:=j; l:=1;

     Repeat

           inc(l);

           k:=u[(i-1)*Nb+j];

           div_mod(k,i,j);

           if l mod 2=1 then

              if p[i,j]<p[mi,mj] then begin

                 mi:=i; mj:=j;

              end;

     Until (i=ki) and (j=kj);

 

     i:=ki; j:=kj; l:=0;

     p_m:=p[mi,mj];

     Repeat

           if l mod 2=0 then begin

              inc(p[i,j],p_m);

              PrintS((n1+1)*j+n2-1,i*3+3,'(+)',12);

           end else begin

               dec(p[i,j],p_m);

               PrintS((n1+1)*j+n2-1,i*3+3,'(-)',12);

           end;

           if l=0 then inc(p[i,j]);

           k:=u[(i-1)*Nb+j];

           div_mod(k,i,j);

           inc(l);

     Until (i=ki) and (j=kj);

     p[mi,mj]:=-1;

End;

 

Procedure Pauza;

var d:char;

Begin

     TextColor(6);

     GotoXY(40,1);

     Write('press any key');

     d:=ReadKey;

     GotoXY(40,1);

     ClrEOL;

End;

 

BEGIN

    Nul(alfa); Nul(betta);

    Nt:=1;

    ClrScr;

    TextColor(10);

    Repeat

       Write('Vvedite kolichestvo postavshikov (2<=Na<=',N-1,')   ');

       ReadLn(Na);

       Write('Vvedite kolichestvo potrebitelei (2<=Nb<=',N-1,')   ');

       ReadLn(Nb);

    Until (Na>1) and (Na<=N-1) and (Nb>1) and (Nb<=N-1);

    Tabl;

 

(******************* ввод начальных данных ******************)

    PrintS(1,1,'Vvedite kolichestvo produkcii:',3);

    W_W(A,Na,'A');

    W_W(B,Nb,'B');

    TextColor(3);

    GotoXY(1,1); ClrEOL;

    Write('Vvedite stoimost perevozki');

    for i:=1 to Na do

        for j:=1 to Nb do begin

            TextColor(3);

            GotoXY(29,1); ClrEOL;

            Write('A',i,' - B',j,'  ');

            Rid(c[i,j],5);

            Print((n1+1)*j+n2-4,i*3+3,1,c[i,j],11);

        end;

(**********************************************************)

 

    GotoXY(1,1);

    ClrEOL;

    TextColor(14);

    Write('Tablica N1');

 

    for i:=1 to Na do Sa:=Sa+A[i];

    for i:=1 to Nb do Sb:=Sb+B[i];

    if Sa<>Sb then begin     {если задача является открытой}

       PrintS(20,1,'Открытая  задача (Нажмите любую клавишу)',7);

       d:=ReadKey;

       if Sa>Sb then begin

          inc(Nb);

          B[Nb]:=Sa-Sb;

          for i:=1 to Na do c[i,Nb]:=0;

       end else begin

           inc(Na);

           A[Na]:=Sb-Sa;

           for i:=1 to Nb do c[Na,i]:=0;

       end;

       Tabl;

       for i:=1 to Na do

           for j:=1 to Nb do Print((n1+1)*j+n2-4,i*3+3,1,c[i,j],11);

       for i:=1 to Na do

           Print(n2-trunc(ln(A[i])/ln(10)),i*3+4,1,A[i],14);

       for i:=1 to Nb do

           Print(n2+i*(n1+1)-trunc(ln(B[i])/ln(10)),4,1,B[i],14);

       PrintS(20,1,'Otkritaya zadacha',7);

    end

       else PrintS(20,1,'Zakritaya zadacha',7);

 

(************** cоставление опорного  плана ****************)

    for i:=1 to Nb do B_d[i]:=B[i];

    for i:=1 to Na do begin

        for j:=1 to Nb do x[j]:=j;

        for j:=1 to Nb-1 do begin

            x_min:=c[i,x[j]];

            r_min:=j;

            for r:= j+1 to Nb do

                if (x_min>c[i,x[r]]) or

                 ((x_min=c[i,x[r]]) and (B[x[r]]>b[x[r_min]])) then

                begin

                   x_min :=c[i,x[r]];

                   r_min:=r;

                end;

            x_p:=x[r_min];

            x[r_min]:=x[j];

            x[j]:=x_p;

        end;

        Sp:=0;

        for j:=1 to Nb do begin

            p[i,x[j]]:=B_d[x[j]];

            if p[i,x[j]]>A[i]-Sp then p[i,x[j]]:=A[i]-Sp;

            inc(Sp,p[i,x[j]]);

            dec(B_d[x[j]],p[i,x[j]]);

        end;

    end;

(***********************************************************)

 

    for i:=1 to Na do

        for j:=1 to Nb do if p[i,j]=0 then p[i,j]:=-1;

    W_p;

    f:=FF; f0:=F;

 

    While a_b do;

    for i:=1 to Na do Print(l+1,i*3+3,3,alfa[i],14);

    for i:=1 to Nb do Print(i*(n1+1)+n2-4,h,6,betta[i],14);

    Pauza;

(******* постепенное приближение  плана к оптимальному ******)

    While kkk(ki,kj)<0 do begin

          kontur;

          pauza;

          for i:=1 to Na do

             for j:=1 to Nb do PrintS((n1+1)*j+n2-1,i*3+3,'   ',14);

          inc(Nt);

          GotoXY(1,1);

          Write('Tablica N',Nt);

          W_p;

          f0:=f; f:=FF;

          if a_b then Goto l1;

          for i:=1 to Na do Print(l+1,i*3+3,3,alfa[i],14);

          for i:=1 to Nb do Print(i*(n1+1)+n2-4,h,6,betta[i],14);

          Pauza;

    end;

(***********************************************************)

 

    PrintS(40,1,'Reshenie ortimalno',12);

    PrintS(60,1,'(any key)',6);

    for i:=1 to Na do

        for j:=1 to Nb do if p[i,j]=-1 then begin

            h:=i*3+4;

            l:=j*(n1+1)+n2-5;

            GotoXY(l,h);

            Write(' ':n1);

        end;

    GotoXY(40,1);

l1: d:=ReadKey;

END.

 

Программа жұмысы 1-4 – суреттерде көрсетілген.

 

 

 

 

 

 

 

                                                    Программаны баяндау бөлімі

 

Program                             программаның басы

Procedure Nul                    массивті нөлдейді

Procedure Prints                  s-жолын шығарады

Procedure Print                   a-числосын шығарады

Procedure Rid                     x-процедурасын шығарады

Procedure goriz                  Процедуралар goriz,wertic және Tab1 таблицасын шығарады

Procedure W_W                 таблицаны шығарады (өнімнің саны) 

Function  FF:longint;          план бағасын шығару   

Function  a_b:Boolean        потенциялдарды санау (alfa және betta )

Procedure W_p                   пландарды бөліп шығару

Function kkk:integer           бос клеткілерге

Procedure div_mod             бір өлшемді массивтен көп өлшемді массивке аудару

Procedure Rek                    рекурсивті процедура контурдың орналасқанын анықтайды

Procedure kontur                контурдың орналасқанын анықтайды

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                                                                    Қорытынды

 

Транспорт есебін шығару, көптеген қаржы мөлшерін үнемдеуге мүмкіншілік береді, ал есепті ЭЕМ көмегімен шығарған уақытты үнемдейді. Қазіргі кезде транспорт есебі өндірістің ең маңызды есептерінің бірі болып табылады. 

Информация о работе Қарапайым актілерді белгілеп көрсету