Одновременно с заменой значения элемента массива Vdlin при выполнении условия
Lтек<Vdlin(i+1,j2,k2,l2,m2) |
(3.140) |
рассчитывается Rodтек – код текущей вершины-родителя si1 для вер-
шины-преемника sj1. |
|
помощи |
|
Кодирование вершины-родителя осуществляется при |
|||
4-разрядного целого числа в десятичной системе счисления: |
|
||
Rodтек=1000∙((j–j2)+2)+100∙((k–k2)+2)+10∙((l–l2)+2)+ |
(3.141) |
||
|
+((m–m2)+2). |
||
Если условие (3.140) выполняется, то происходит замена верши- |
|||
ны-родителя для вершины-преемника sj1: |
|
||
ìRodтек |
|
||
ï |
при Lтек <Vdlin(i +1,j2,k2,l2,m2); |
||
Vrod(i +1,j2,k2,l2,m2) = íï |
|||
|
(3.142) |
||
ïVrod(i +1,j2,k2,l2,m2) |
|
||
îпри Lтек ³Vdlin(i +1,j2,k2,l2,m2).
5.4.Данный пункт алгоритма выполняется, если вершина-
преемник sj1 еще ни разу не просматривалась, что формализуется условием ï
Vfront(i+1,j2,k2,l2,m2)=0. (3.143)
По (3.141) рассчитывается Rodтек – код текущей вершиныродителя si1 для вершины-преемника sj1, который заносится в элемент массива Vrod:
Vrod(i+1,j2,k2,l2,m2)=Rodтек. (3.144)
По (3.138) рассчитывается стоимость перемещения Lтек от начальной вершины до вершины-преемника sj1=(i+1,j2,k2,l2,m2) через текущую вершину si1=(i,j,k,l,m) , которая заносится в элемент массива
Vdlin:
Vdlin(i+1,j2,k2,l2,m2)=Lтек. (3.145)
В элементе массива Vfront с индексами (i+1,j2,k2,l2,m2) сохраняется информация о том, что вершина-преемник sj1 уже просматрива-
150
лась, т.е. выполняется присваивание данному элементу единичного значения по (3.137).
5.5. Данный пункт выполняется после того, как завершились вложенные циклы по (j,k,l,m), на текущей итерации цикла по i, т.е. после того, как все возможные вершины-преемники для всех вершин со значением индекса i были посещены. Перед увеличением значения i на единицу выполняется следующая последовательность действий.
Используя вложенные циклы по j,k,l,m, где j [1; jmax]; k [1; kmax]; l [1; lmax]; m [1; mmax], для каждого сочетания индексов (i+1), j, k, l, m проверяется выполнение условия
Vfront(i+1,j,k,l,m)=1. (3.146)
При выполнении данного условия вершины следующего за текущим ряда с одинаковыми значениями координаты x [с индексом (i+1)] закрываются, т.е. соответствующая вершина помечается как пройденная и закрытая:
Vfront(i+1,j,k,l,m)=2. (3.147)
Таким образом, помечаются не все вершины ряда с индексом (i+1), а только свободные и при этом просмотренные на текущей итерации цикла i. Вершины, занятые препятствиями, а также не вошедшие в множество проверяемых вершин в массиве Vfront, остаются непомеченными как закрытые (сохраняются старые значения соответствующих элементов). Это позволяет исключить их из рассмотрения как вершины-родители на следующей итерации цикла i.
Множество проверяемых вершин на каждой итерации i формируется в пространстве состояний объекта-груза, представляющем собой равномерную решетку линейных (x, y, z) и угловых (γ, ω) координат, по принципу развертывания-свертывания дерева поиска. Дерево поиска развертывается из единственной начальной вершины sнач по принципу рассмотрения всех возможных вершин-преемников для множества вершин, рассмотренных на предыдущей итерации i [координаты x, по условиям (3.133), (3.146), (3.147)], и свертывается в единственную конечную вершину sкон по граничным условиям (3.135). Двухмерная иллюстрация развертывания-свертывания дерева поиска (движения фронта волны) приведена на рис. 3.35.
6. После завершения всех вложенных циклов по i, j, k, l, m (прохождения фронта волны) происходит восстановление найденной оп-
151
тимальной по значению целевой функции траектории по кодам вер- шин-родителей.
6.1. В качестве первой вершины-преемника назначается sкон, для которой из массива Vrod восстанавливается код вершины-родителя:
Rodтек=Vrod(imax,jкон,kкон,lкон,mкон), |
(3.148) |
где |
|
jкон= yк0/ l ; kкон= zк0/ l ; lкон= (γк0–γmin)/ |
u ; |
mкон= (ωк0–ωmin)/ u . |
(3.149) |
6.2. Восстанавливаются индексы вершины-родителя si1=(i,j,k,l,m)
по коду Rodтек и индексам вершины-преемника sj1=(i2,j2,k2,l2,m2). При рассмотрении конечной вершины, с которой начинается восста-
новление траектории, i2=imax; j2=jкон; k2=kкон; l2=lкон; m2=mкон. В символах программирования с использованием операции получения це-
лочисленного остатка от деления (%) зависимости выглядят следующим образом:
dm=Rodтек % 10; Rodтек= Rodтек – dm; |
|
dl=(Rodтек % 100)/10; Rodтек= Rodтек – dl∙10; |
|
dk=(Rodтек % 1000)/100; Rodтек= Rodтек – dk∙100; |
|
dj=Rodтек % 1000; |
(3.150) |
dj= dj–2; dk= dk–2; dl= dl–2; dm=dm–2; |
|
i=i2–1; j=j2+dj; k=k2+dk; l=l2+dl; m=m2+dm. |
(3.151) |
С использованием традиционной математической формы записи выражения (3.150) будут иметь следующий вид:
dm=(Rodтек – Rodтек/10 ∙10); Rodтек= Rodтек – dm; dl=(Rodтек – Rodтек/100 ∙100)/10; Rodтек= Rodтек – dl∙10; dk=(Rodтек – Rodтек/1000 ∙1000)/100; Rodтек= Rodтек – dk∙100;
dj= Rodтек/1000 . |
(3.152) |
После восстановления индексов i,j,k,l,m пересчитывается код |
|
Rodтек по (3.148) с подстановкой значений индексов |
|
i2=i; j2=j; k2=k; l2= l; m2=m. |
(3.153) |
Последовательность действий пункта 6.2 алгоритма выполняется в цикле imax раз. В результате формируется траектория S* из точек вида (3.50) с использованием зависимостей (3.100).
152
Пуск |
1 |
2 |
|
|
|
Ввод исходных данных: sнач=(xн0, yн0, zн0, γн0, ωн0); |
sкон=(xк0, yк0, zк0, γк0, ωк0); |
|
{ Rig }; imax; jmax; kmax; lmax; mmax; [YПР]; cγω; |
u; δopt; lзап_г; lзап_в |
|
3
Построение массива гиперповерхности [Ymin] по методике раздела 3.4
i4
i=1; i≤imax; i=i+1
j5
j=1; j≤jmax; j=j+1
|
|
6 |
|
|
y=j∙Δl |
7 |
|
|
|
||
|
k |
|
|
|
|
|
|
k=1; k≤kmax; k=k+1 |
|
||
|
l |
|
8 |
||
|
|
|
|
||
|
l=1; l≤lmax; l=l+1 |
|
|
||
|
m |
|
9 |
||
|
|
|
|
||
|
m=1;m≤mmax;m=m+1 |
||||
Нет |
|
|
10 |
Да |
|
|
y<min(j,k,l,m) |
|
|
||
|
11 |
|
12 |
||
|
|
|
|
|
|
Vfront(i,j,k,l,m)=0 |
|
Vfront(i,j,k,l,m)=–1 |
|||
|
|
|
|
|
13 |
|
Vrod(i,j,k,l,m)=0 |
|
|||
|
|
14 |
|||
|
|
|
|
|
|
|
Vdlin(i,j,k,l,m)=∞ |
|
|||
|
|
|
|||
|
m |
|
15 |
||
|
|
|
|
||
|
l |
|
16 |
||
|
|
|
|
||
k 17
18
j
i 19
|
|
20 |
jнач= yн0/ l ; kнач= zн0/ l |
; lнач= (γн0–γmin)/ u ; |
|
mнач= (ωн0–ωmin)/ u ; |
|
|
Vfront(1,jнач,kнач,lнач,mнач)=2; |
|
|
Vdlin(1,jнач,kнач,lнач,mнач)=0 |
|
|
i |
21 |
|
i=1; i≤(imax–1); i=i+1 |
22 |
|
|
|
|
jдmin=i–(imax–jmax); jдmax=(imax+jmax)–i; kдmin=i–(imax–kmax); kдmax=(imax+kmax)–i; lдmin=i–(imax–lmax); lдmax=(imax+lmax)–i; mдmin=i–(imax–mmax); mдmax=(imax+mmax)–i;
|
|
j |
23 |
|
|
|
j=max(1; jдmin); |
|
|
|
|
j≤min(jдmax; jmax); |
|
|
|
|
j=j+1 |
|
|
|
|
k |
24 |
|
|
|
|
|
|
|
|
k=max(1; kдmin); |
|
|
|
|
k≤min(kдmax; kmax); |
|
|
|
|
k=k+1 |
|
|
|
|
l |
25 |
|
|
|
l=max(1; lдmin); |
|
|
|
|
l≤min(lдmax; lmax); |
|
|
|
|
l=l+1 |
|
|
|
|
m |
26 |
|
|
|
m=max(1; mдmin); |
|
|
|
|
m≤min(mдmax; mmax); |
|
|
|
|
m=m+1 |
|
|
2 |
Нет |
27 |
Да |
1 |
|
Vfront(i,j,k,l,m)=2 |
|
Рис. 3.36. Блок-схема модифицированного волнового алгоритма для пяти учитываемых обобщенных координат груза (начало)
153
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
|
|
j2 |
|
28 |
|
Вычисление Li1,j1 (СВД) между вершинами |
||||||||||||
|
|
|
|
si1=(i,j,k,l,m) и sj1=(i+1,j2,k2,l2,m2) по (3.18) |
|||||||||||||
|
j2=(j–1); j2≤(j+1); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
34 |
|
||||
|
j2=j2+1 |
|
|
|
|
|
|
|
Lтек=Vdlin(i, j, k, l, m)+Li1,j1 |
|
|
|
|
|
|
||
|
k2 |
29 |
|
Нет |
35 |
|
|
|
Да |
||||||||
|
|
|
|
|
|
|
|||||||||||
|
k2=(k–1); k2≤(k+1); |
|
|
|
|
|
|
|
Lтек<Vdlin(i+1,j2,k2,l2,m2) |
|
|
|
|
|
|
||
|
k2=k2+1 |
|
|
|
|
|
|
|
36 |
|
|
|
|
|
|
|
|
|
l2 |
|
30 |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
Vdlin(i+1, j2, k2, l2, m2)=Lтек |
||||||||
|
l2=(l–1); l2≤(l+1); |
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
37 |
|
|
|
l2=l2+1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
31 |
|
|
|
|
|
Rodтек=1000∙((j–j2)+2)+ |
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
m2 |
|
|
|
|
+100∙((k–k2)+2)+10∙((l–l2)+2)+((m–m2)+2) |
|||||||||||
|
|
|
|
|
|
||||||||||||
|
m2=(m–1); m2≤(m+1); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m2=m2+1 |
|
|
|
|
|
|
|
Vrod(i+1, j2, k2, l2, m2)=Rodтек |
||||||||
Нет |
32 |
|
Да |
|
|
|
|
|
|
|
|
|
|
|
|
38 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
Vfront(i+1,j2,k2,l2,m2)=1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Нет |
39 |
Да |
|
|
|
|
|
|
|
|
|
|
|
|
40 |
|
|
|
|
|
|
|
Rodтек=1000∙((j–j2)+2)+ |
|
|
|
|
|
|
||||||
|
Vfront(i+1,j2,k2,l2,m2)=0 |
|
|
|
|
+100∙((k–k2)+2)+10∙((l–l2)+2)+((m–m2)+2) |
|
||||||||||
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
41 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
46 |
|
|
|
Vrod(i+1, j2, k2, l2, m2)=Rodтек |
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m2 |
|
|
|
Вычисление Li1,j1 (СВД) между вершинами |
||||||||||||
|
|
47 |
|
si1=(i,j,k,l,m) и sj1=(i+1,j2,k2,l2,m2) по (3.18) |
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
43 |
|
|||||
|
l2 |
|
|
|
|
|
|
|
Lтек=Vdlin(i, j, k, l, m)+Li1,j1 |
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
44 |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
48 |
|
|
|
|
|
Vdlin(i+1, j2, k2, l2, m2)=Lтек |
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
|
||
|
|
|
|
|
|
|
|
|
Vfront(i+1,j2,k2,l2,m2)=1 |
|
|
|
|
|
|||
|
k2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
49 |
|
|
|
|
|
|
m |
50 |
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
j2 |
|
|
|
|
|
|
|
|
l |
51 |
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
k |
52 |
|
|
j |
53 |
|
|
3 |
|
Рис. 3.36. Блок-схема модифицированного волнового алгоритма для пяти учитываемых обобщенных координат груза (продолжение)
154