.


:




:

































 

 

 

 





. 6 , . , , : , . .

, :

 

,

 

( ) ;

.

 

 

, , .

. : . :

 

,

 

;

.


, , , .

 

, 37%. , , .


, .

, , , .

n- .

, . , .

.

( 05-08-01199-, ..).


1. . ( ): / . ., . ., . . .. 2- , . .: , 2001. 319.

2. . . . . : . .: -, 2003.- 188.

3. .., .. (2000) . : . . : - , 2000.

4. .. (2004) []: / .. , .. . - 2- ., . . : - , 2004.- 480: ().

5. .. . .- : 1995.-334.

6. .., .. : . . . / .. , .. .- : , 2002.-124. ().

7. .. . . . . 2004 ( ).

8. . : . . .: ,1988. 334 ., .

9. . . . .- .: , 1973.

10. Barraquand J., Latombe J.-C. Robot Motion Planning: A Distributed Representation Approach // Int. J. of Rob. Res., Vol. 10, No. 6, December 1991. Pp. 628649.

11. S.M.LaValle, Planning Algorithms, 1999-2003. http://msl.cs.uiuc.edu/planning.

12. Lopatin . . Algorithm of a manipulator movement amidst unknown obstacles. Proceedings of the 10th International Conference on Advanced Robotics (ICAR 2001), August 22-25, 2001, Hotel Mercure Buda, Budapest, Hungary. pp. 327-331.

13. N.J.Nilsson, Problem-Solving Methods in Artificial Intelligence. McGraw-Hill Book Company, New York, 1971.

 

14.


1

 

..

() . (. 1). q 0=(1.57;0.8)() q T=(3.2;0.8)(). xOy. 60 . : O1, O2 O3. , , :

1) :

(1)

 

2) :

(2)

 

 

3) :

(3)

 

 

2 , , :

 

(1.1.3)

(4)

 

 

( ).

(5)

 

 

. 1 . 1,2,3. q 0=(1.57;0.8)(), q T=(3.2;0.8)().

 

. . , . delta qi, i=1,2, :

 

delta = (0+6.28)/ (6)

 

 

i- , i- (i=1,2) . delta (. 1).

1

 

delta, ˚ ,
       
       
       
       
  4.5    
       
       
       
  1.5    

 

Microsoft Visual C++ 6.0 Intel Pentium Celeron 1.3 GHz. , , delta.


2

.

 

//------------------------------------------------------------------------------

/*

* Finish_optimized.cpp

*

* .

*

* : q0 -

* qT -

* mZap[] -

* z -

* border -

* delta -

* qL qH -

*

*

* : mRez[] -

* n -

*/

//------------------------------------------------------------------------------

 

#include<iostream.h>

#include <except.h>

#include<stdlib.h>

#include<math.h>

#define NUM 2000

#include<systdate.h>

 

//------------------------------------------------------------------------------

// .

//------------------------------------------------------------------------------

 

Word MillisecondsBetween (TDateTime a,TDateTime b)

{

Word A1,B1,C1,D1,E1;

Word A2,B2,C2,D2,E2;

 

DecodeTime(a,A2,B2,C2,D2);

DecodeTime(b,A1,B1,C1,D1);

 

E1=D1+C1*1000+B1*60*1000+A1*60*60*1000;

E2=D2+C2*1000+B2*60*1000+A2*60*60*1000;

 

return E2-E1;

}

TDateTime T1,T2;

 

class point

{

public:

int x;

int y;

 

public:

 

float Distance(point a,point b);

 

float Normal(point t1,point t2,point t);

 

point Best_point(point qi,point qT,int delta);

 

void Liberation(point **data, int m);

 

void Route(point q0,point qT,

point mZap[],int z,int border,

point *mRez,int &n,

int delta,

point qL,point qH,Word Time);

 

};

 

//------------------------------------------------------------------------------

//

//------------------------------------------------------------------------------

 

float point:: Distance(point a,point b)

{

return sqrt(pow(b.x-a.x,2)+pow(b.y-a.y,2));

}

 

//------------------------------------------------------------------------------

//

//------------------------------------------------------------------------------

 

float point:: Normal(point t1,point t2,point t)

{ // t1 -

// t2 -

int A = t2.y - t1.y; // t -

int B = t1.x - t2.x;

int C = -t1.x*A - t1.y*B; // Ax+By+C=0

float M = 1/sqrt(pow(A,2)+pow(B,2));

 

(C <= 0)? M:-M;

 

return A*M*t.x + B*M*t.y + C*M;

}

 

//------------------------------------------------------------------------------

//

//------------------------------------------------------------------------------

 

point point:: Best_point(point qi,point qT,int delta)

{

point best; // best -

 

float p=0; // p -

float d=0; // d -

float sum=NUM; // sum = p + d

 

point neighbor[8]; //

 

neighbor[0].x = qi.x - delta; // [0] [1] [2]

neighbor[0].y = qi.y + delta;

// [3] qi [4]

neighbor[1].x = qi.x;

neighbor[1].y = qi.y + delta; // [5] [6] [7]

 

neighbor[2].x = qi.x + delta;

neighbor[2].y = qi.y + delta;

 

neighbor[3].x = qi.x - delta;

neighbor[3].y = qi.y;

 

neighbor[4].x = qi.x + delta;

neighbor[4].y = qi.y;

 

neighbor[5].x = qi.x - delta;

neighbor[5].y = qi.y - delta;

 

neighbor[6].x = qi.x;

neighbor[6].y = qi.y - delta;

 

neighbor[7].x = qi.x + delta;

neighbor[7].y = qi.y - delta;

for (int i=0;i<8;i++)

{

d=Distance(neighbor[i],qT); // d > 0

p=Normal(qi,qT,neighbor[i]); // p > < 0

 

 

if (fabs(p)+d < sum)

{

best = neighbor[i];

sum = fabs(p)+d;

}

}

 

return best;

}

 

//------------------------------------------------------------------------------

//

//------------------------------------------------------------------------------

 

void point:: Liberation (point **data, int e)

{

for (int i = 0; i < e; i++)

delete[] data[i];

 

delete[] data;

}

 

//------------------------------------------------------------------------------

//------------------------------------------------------------------------------

//

//------------------------------------------------------------------------------

//------------------------------------------------------------------------------

 

void point:: Route(point q0, point qT, point mZap[], int z, int border,

point *mRez, int &n, int delta, point qL, point qH,Word Time)

{

T1=Now();

 

int i=0; // for

int j=0;

int k=0;

int v=0;

int u=0;

int r=0;

 

// int f=0;

// int g=0;

// int w=0;

 

bool flag = false;

bool Flag = false;

 

n=0;

 

//------------------------------------------------------------------------------

// 1. mPr[]

//------------------------------------------------------------------------------

 

point qi;

qi=q0;

 

int s=1; // s -

 

point *mPr;

mPr = new point [(int)Distance(q0,qT)+10];

if(mPr == NULL)

{

cout << " ";

exit(7);

}

 

mPr[0]=q0; // mPr[] -

 

while (qi.x!= qT.x || qi.y!= qT.y) //

{ //

qi=Best_point(qi,qT,delta);

mPr[s++] = qi;

}

 

//------------------------------------------------------------------------------

// 2.

//

//------------------------------------------------------------------------------

 

int temp=0;

int a=0; // a -

int aa=0; // a!= aa,

 

point mTemp[30]; // mTemp[] - mCol[] mEnd[]

point mCol[30]; // mCol[] -

point mEnd[30]; // mEndE[] -

 

for (i=1;i<s;i++)

for (j=border;j<z;j++)

if (mPr[i].x == mZap[j].x && mPr[i].y == mZap[j].y)

mTemp[temp++]=mPr[i];

 

for (i=1;i<s;i++)

for (j=0;j<temp;j++)

{

 

if(mPr[i].x == mTemp[j].x && mPr[i].y == mTemp[j].y &&

(mPr[i-1].x!= mTemp[j-1].x || mPr[i-1].y!= mTemp[j-1].y))

 

mCol[a++] = mPr[i];

 

if(mPr[i].x == mTemp[j].x && mPr[i].y == mTemp[j].y &&

(mPr[i+1].x!= mTemp[j+1].x || mPr[i+1].y!= mTemp[j+1].y))

 

mEnd[aa++] = mPr[i+1];

}

 

if (a!= 0)

{

 

//------------------------------------------------------------------------------

// 3.

//------------------------------------------------------------------------------

 

point qj; // qj -

 

point **zap; // zap[i][j] -

// i -

zap = new point* [a]; // j -

 

if(zap == NULL)

{

cout << " ";

exit(1);

}

for(i=0;i<a;i++)

{

zap[i] = new point[(z - border)*2]; // *2

 

if(zap[i] == NULL)

{

cout << " ";

exit(2);

}

}

 

for(i=0;i<a;i++)

{

zap[i][0] = mCol[i];

}

 

//------------------------------------------------------------------------------

 

int b=1; // b -

 

int *B; // B[i] -

B = new int [(z - border)*2]; // i -

if(B == NULL)

{

cout << " ";

exit(6);

}

 

point neighborZap[8]; // ()

 

flag = false;

 

for (i=0;i<a;i++)

{

for (v=0;v<b;v++)

{

qj = zap[i][v];

 

neighborZap[0].x = qj.x - delta; // [0] [1] [2]

neighborZap[0].y = qj.y + delta;

// [3] qj [4]

neighborZap[1].x = qj.x;

neighborZap[1].y = qj.y + delta; // [5] [6] [7]

 

neighborZap[2].x = qj.x + delta;

neighborZap[2].y = qj.y + delta;

 

neighborZap[3].x = qj.x - delta;

neighborZap[3].y = qj.y;

 

neighborZap[4].x = qj.x + delta;

neighborZap[4].y = qj.y;

 

neighborZap[5].x = qj.x - delta;

neighborZap[5].y = qj.y - delta;

 

neighborZap[6].x = qj.x;

neighborZap[6].y = qj.y - delta;

 

neighborZap[7].x = qj.x + delta;

neighborZap[7].y = qj.y - delta;

 

for (j=0;j<8;j++)

for (k=border;k<z;k++)

{

if (neighborZap[j].x == mZap[k].x && neighborZap[j].y == mZap[k].y)

{

for (u=0;u<b;u++)

if (mZap[k].x == zap[i][u].x && mZap[k].y == zap[i][u].y)

{

flag = true;

break;

}

 

if (flag == false)

zap[i][b++]=mZap[k];

 

flag = false;

}

 

}

}

B[i]=b;

}

 

// ,

//------------------------------------------------------------------------------

 

for (i=0;i<a;i++)

for (j=0;j<B[i];j++)

for (k=i+1;k<a;k++)

if (zap[i][j].x == mCol[k].x && zap[i][j].y == mCol[k].y)

{

mEnd[i]=mEnd[k];

}

 

//------------------------------------------------------------------------------

// 4.

//

//------------------------------------------------------------------------------

 

point **raz;

 

raz = new point* [a];

 

if(raz == NULL)

{

cout << " ";

exit(3);

}

for(i=0;i<a;i++)

{

raz[i] = new point [(z - border)*4];

 

if(raz[i] == NULL)

{

cout << " ";

exit(4);

}

}

 

for(i=0;i<a;i++)

{

raz[i][0] = mEnd[i];

}

 

//------------------------------------------------------------------------------

 

int c=1; // c -

 

int *C; // C[i] -

C = new int [(z - border)*4]; // i -

if(C == NULL)

{

cout << " ";

exit(5);

}

point qk;

 

flag = false;

 

point neighborRaz[4];

 

for (i=0;i<a;i++)

{

 

for (j=0;j<B[i];j++)

{

qk = zap[i][j];

 

neighborRaz[0].x = qk.x; //... [0]...

neighborRaz[0].y = qk.y + delta;

// [1] qk [2]

neighborRaz[1].x = qk.x - delta;

neighborRaz[1].y = qk.y; //... [3]...

 

neighborRaz[2].x = qk.x + delta;

neighborRaz[2].y = qk.y;

 

neighborRaz[3].x = qk.x;

neighborRaz[3].y = qk.y - delta;

 

for (k=0;k<4;k++)

{

for (v=0;v<z;v++)

if (neighborRaz[k].x == mZap[v].x && neighborRaz[k].y == mZap[v].y)

{

flag = true;

break;

}

 

for (u=0;u<c;u++)

if (raz[i][u].x == neighborRaz[k].x && raz[i][u].y == neighborRaz[k].y)

{

flag = true;

break;

}

 

if (flag == false)

raz[i][c++]=neighborRaz[k];

 

flag = false;

 

}

}

C[i]=c;

}

 

//

//------------------------------------------------------------------------------

 

for (i=0;i<a;i++)

for (j=0;j<B[i];j++)

{

if (raz[i][j].x == qT.x && raz[i][j].y == qT.y)

mEnd[i]=qT;

}

 

//------------------------------------------------------------------------------

// 5.

// - mRez[]

//------------------------------------------------------------------------------

 

int number=0; // number - M[L]

int H,h; // H - m

point **m; // h - m

point qim; // m -

// qim -

bool T[NUM]; // T[i] = true, i- mEnd[j]

// T[i] = false, i-

 

int M[NUM]; // M[i] -

M[0]=0;

int L; // L - m

 

point neighbor[8]; // neighbor[] -

 

qi=q0;

 

for (i=0;i<s;i++)

{

qi= mPr[i];

 

flag = false;

 

for (j=0;j<a;j++)

if (qi.x == mCol[j].x && qi.y == mCol[j].y)

{

flag = true;

break;

}

if (flag == true)

{

m = new point* [C[j]*100];

 

if(m == NULL)

{

cout << " ";

exit(8);

}

 

H=0;

h=0;

L=0;

 

for (r=0;r<NUM;r++)

{

T[r]=true;

}

 

qi=mPr[i-1];

 

m[H] = new point [C[j]]; // m[0] = new point [C[j]];

 

if(m[H] == NULL)

{

cout << " ";

exit(9);

}

 

m[H][h] = qi; // m[0][0] = qi;

 

qim=qi;

 

while (1)

{

 

while (qim.x!= mEnd[j].x || qim.y!= mEnd[j].y)

{

 

neighbor[0].x = qim.x - delta; // [0] [1] [2]

neighbor[0].y = qim.y + delta;

// [3] qim [4]

neighbor[1].x = qim.x;

neighbor[1].y = qim.y + delta; // [5] [6] [7]

 

neighbor[2].x = qim.x + delta;

neighbor[2].y = qim.y + delta;

 

neighbor[3].x = qim.x - delta;

neighbor[3].y = qim.y;

 

neighbor[4].x = qim.x + delta;

neighbor[4].y = qim.y;

 

neighbor[5].x = qim.x - delta;

neighbor[5].y = qim.y - delta;

 

neighbor[6].x = qim.x;

neighbor[6].y = qim.y - delta;

 

neighbor[7].x = qim.x + delta;

neighbor[7].y = qim.y - delta;

 

// ?

//------------------------------------------------------------------------------

 

flag = false;

 

for (v=0;v<8;v++)

{

for (u=0;u<C[j];u++)

{

if (neighbor[v].x == raz[j][u].x && neighbor[v].y == raz[j][u].y)

 

flag=true;

 

for (k=0;k<=M[H];k++)

if (neighbor[v].x == m[H][k].x && neighbor[v].y == m[H][k].y)

{

flag=false;

break;

}

if (flag == true) break;

}

if (flag == true) break;

}

//

//------------------------------------------------------------------------------

 

if (flag == true)

{

Flag = false;

flag = false;

 

h++;

 

for (v=0;v<8;v++)

for (u=0;u<C[j];u++)

{

if (neighbor[v].x == raz[j][u].x && neighbor[v].y == raz[j][u].y)

Flag = true;

 

for (k=0;k<=M[H];k++)

if (neighbor[v].x == m[H][k].x && neighbor[v].y == m[H][k].y)

{

Flag = false;

break;

}

 

if (Flag == true)

{

if (flag == true)

{

 

M[++L]=h;

m[L] = new point [C[j]];

if(m[H] == NULL)

{

cout << " ";

exit(10);

}

 

for (r=0;r<h;r++)

m[L][r]=m[H][r];

 

m[L][h] = raz[j][u];

 

}

if (flag == false)

{

M[H]=h;

m[H][h]=raz[j][u];

qim=raz[j][u];

 

flag = true;

}

Flag=false;

}

}

}

else

{

T[H]=false;

break;

}

}

if (H < L)

{

H++;

h=M[H];

qim=m[H][h];

}

else break;

 

}

 

// M[L]

//------------------------------------------------------------------------------

 

int min = 9999;

 

for (k=0;k<=L;k++)

if (T[k]==true && M[k] < min)

{

number = k;

min = M[k];

}

if (min!= 9999)

{

for (k=1;k<=M[number];k++)

mRez[n++]=m[number][k];

}

 

qi=mEnd[j];

 

Liberation(m,L+1);

 

for (k=0;k<s;k++)

if (qi.x == mPr[k].x && qi.y == mPr[k].y) i=k;

 

} //if close

else

{

mRez[n++] = mPr[i];

qi = mPr[i];

}

} // for s close

 

 

Liberation(zap,a);

Liberation(raz,a);

 

delete [] mPr;

delete [] B;

delete [] C;

 

}

 

else

for(i=0;i<s;i++)

mRez[n++] = mPr[i];

T2=Now();

 

Time=MillisecondsBetween (T1,T2);

}

 

//------------------------------------------------------------------------------


[1]





:


: 2017-03-12; !; : 207 |


:

:

, , .
==> ...

1851 - | 1722 -


© 2015-2024 lektsii.org - -

: 0.453 .