Построение квазиразверток на основе энергетических функций, страница 6

file3<<"\n"<<list_p[g].x<<"     "<<list_p[g].y<<"     "<<0;

g++;

}

flag_s=1;

}

}

// Завершение минимизации

printf("\nEnd.\nPress any key...");

getch();

file2.close();

exit(0);

}

float f(float x, float y, float z, int i, point *list_p)

{

float f, s, r, s_p, r_p;

int j;

// Подсчет энергии отталкивания и энергии соединения

float w1, w2, w3, ws, g;

r=0;

s=0;

for (j=1; j<=num_s[i]; j++)

{

// Расчет расстояния до соседа

w1=pow((x-list_p[sos[i][j]-1].x), 2);

w2=pow((y-list_p[sos[i][j]-1].y), 2);

ws=sqrt(w1+w2);

w1=pow((w[i][j]-ws),5);

w2=pow(((ws-w[i][j])/(w[i][j])),5);

if (ws<=w[i][j])

{

r_p=c*(w1/ws);

s_p=0;

}

else

{

r_p=0;

s_p=c*w2;

}

r=r+r_p;

s=s+s_p;

}

//Подсчет составляющей энергии сдвига

float r1, r2, r3, p_p, u1, t, trellis;

trellis=0;

for (j=1; j<=num_s[i]; j++)

{

if ((((num_s[i]==4)&&((j==1)||(j==2)))||((num_s[i]==2)&&(j==1))||((num_s[i]==3)&&

(type_s[i]==1)&&((j==1)||(j==2)))||((num_s[i]==3)&&(type_s[i]==2)&&(j==1)))&&

(list_p[sos[i][j]-1].y==y))

{

//Обработка ситуации, когда верхний или нижний сосед четко лежат на вертикали

u1=0;

}

else

{

if ((((num_s[i]==4)&&((j==3)||(j==4)))||((num_s[i]==2)&&(j==2))||((num_s[i]==3)&&

(type_s[i]==1)&&(j==1))||((num_s[i]==3)&&(type_s[i]==2)&&((j==2)||(j==3))))&&

((list_p[sos[i][j]-1].x==x)))

{

//Обработка ситуации, когда левый или правый сосед четко лежат на горизонтале

u1=0;

}

else

{

// Расчет расстояния до соседа

w1=pow((x-list_p[sos[i][j]-1].x), 2) ;

w2=pow((y-list_p[sos[i][j]-1].y), 2) ;

ws=sqrt(w1+w2);

//cout<<"\n  r1="<<ws;

r1=ws;

if (((num_s[i]==4)&&((j==1)||(j==2)))||((num_s[i]==2)&&(j==1))||((num_s[i]==3)&&

(type_s[i]==1)&&((j==1)||(j==2)))||((num_s[i]==3)&&(type_s[i]==2)&&(j==1)))

{

//Расчет х-вой составляющей до соседа

w1=pow((x-list_p[sos[i][j]-1].x), 2);

w2=0;

}

else

{

//Расчет у-вой составляющей до соседа

w1=0;

w2=pow((y-list_p[sos[i][j]-1].y), 2);

}

ws=sqrt(w1+w2);

r2=ws;

if (((num_s[i]==4)&&((j==1)||(j==2)))||((num_s[i]==2)&&(j==1))||((num_s[i]==3)&&

(type_s[i]==1)&&((j==1)||(j==2)))||((num_s[i]==3)&&(type_s[i]==2)&&(j==1)))

{

w1=0;

w2=pow((list_p[sos[i][j]-1].y-y), 2);

}

else

{

w1=pow((list_p[sos[i][j]-1].x-x), 2) ;

w2=0;

}

ws=sqrt(w1+w2);

r3=ws;

p_p=(r1+r2+r3)/2;

u1=2*asin(sqrt((p_p-r1)*(p_p-r3)/(r1*r3)));

}

}

t=w[i][j]*k1*(u1*sin(u1)+cos(u1));

trellis=trellis+t;

}

//Подсчет общей энергии (целевая функция)

f=r+s+trellis;

return f;

}

Приложение 2.

Содержимое входных и выходных файлов с тестовой моделью.

coords.dat

36

0   0   8 

0   1   7.937254 

0   2   7.745967 

0   3   7.416198 

0   4   6.928203 

0   5   6.244998 

1   0   7.937254 

1   1   7.874008 

1   2   7.681146 

1   3   7.34847 

1   4   6.855655 

1   5   6.164414 

2   0   7.745967 

2   1   7.681146 

2   2   7.483315 

2   3   7.141428 

2   4   6.63325 

2   5   5.91608 

3   0   7.416198 

3   1   7.348469 

3   2   7.141428 

3   3   6.782330 

3   4   6.244998 

3   5   5.477226 

4   0   6.928203 

4   1   6.855654  

4   2   6.63325 

4   3   6.244998 

4   4   5.656854 

4   5   4.795832 

5   0   6.244998 

5   1   6.164414 

5   2   5.91608 

5   3   5.477226 

5   4   4.795832 

5   5   3.741657 

num_s.dat

2

3

3

3

3

2

3

4

4

4

4

3

3

4

4

4

4

3

3

4

4

4

4

3

3

4

4

4

4

3

2

3

3

3

3

2

sosedi.dat

2 7

1 3 8

2 4 9

3 5 10

4 6 11

5 12

8 1 13

7 9 2 14

8 10 3 15

9 11 4 16

10 12 5 17

11 6 18

14 7 19

13 15 8 20

14 16 9 21

15 17 10 22

16 18 11 23

17 12 24

20 13 25

19 21 14 26

20 22 15 27

21 23 16 28

22 24 17 29