Ищем оптимальную трассу на 1С

Для  оптимизации нам понадобится алгоритм поиска кратчайшего пути реализованный в среде  1С

  Рассмотрим пример нахождение кратчайшего пути погрузчика для оптимизации размещения грузов.  Дан план склада в секторах по которым проезжает автопогрузчик по заданным трассам. Некоторые сектора закрыты грузом. Найти кратчайшие пути от любой точки склада до каждого сектора для размещения товара ( Или определить, что после выгрузки груза в определенный сектор некий груз станет недоступным для автопогрузчика).  Для решения указанной задачи по оптимизации можно использовать алгоритм Дейкстры

Склад состоит из квадратного помещения 9 на 9 секторов. Двигаться по диагонали из сектора в сектор погрузчик не может. Создадим матрицу 10х10 где в ячейке сектора: 1 - флаг размещения груза, 0 - свободный проезд.

Функция вернет 1 если трасса существует.

 

==============

Функция    Findpath()
XY_R   = XY_S;
A_R.Clear();
A_C.Clear();

A_R.add(XY_R);
A_C.add(XY_R);

I=0;


///==============================
While (I)<A_R.Count()   
    do
    XY_R=A_C[I];
    X = Int(XY_R/10);
    Y = XY_R-(X*10);
    
    //BPaint(XY_R,1,1);
If Y > 1
        Then
        XY_C = XY_R-1;        
        IF  (A_C.Find(XY_C)=Undefined AND GPole[X-1][Y-2]=0) OR (XY_C=XY_E)        
            then
            A_R.add(XY_R);
            A_C.add(XY_C);
            //BPaint(XY_C,1,0);
            If XY_C=XY_E then Возврат(1) endIf;
        EndIf;
EndIf;
If Y < 9
        Then
        XY_C=XY_R+1;
        IF  (A_C.Find(XY_C)=Undefined AND GPole[X-1][Y]=0) OR (XY_C=XY_E)
            then
            A_R.add(XY_R);
            A_C.add(XY_C);
            //BPaint(XY_C,1,0);

            If XY_C=XY_E then Возврат(1) endIf;
        EndIf;
    EndIf;
    
If X > 1
        Then
        XY_C=XY_R-10;    
        IF  (A_C.Find(XY_C)=Undefined AND GPole[X-2][Y-1]=0) OR (XY_C=XY_E)
            then
            A_R.add(XY_R);
            A_C.add(XY_C  );
            //BPaint(XY_C,1,0);

            If XY_C=XY_E then Возврат(1) endIf;
        EndIf;
EndIf;
If X < 9
        Then
        XY_C=XY_R+10;    
        IF  (A_C.Find(XY_C)=Undefined AND GPole[X][Y-1]=0)  OR (XY_C=XY_E)
            then
            A_R.add(XY_R);
            A_C.add(XY_C  );
            //BPaint(XY_C,1,0);

            If XY_C=XY_E then Возврат(1) endIf;
        EndIf;
EndIf;
    I=I+1;
    EndDo;
    Возврат(0)
КонецФункции