From 133c386a5d9c83700690d63298a437ccf52cefa8 Mon Sep 17 00:00:00 2001 From: localhorst Date: Wed, 8 May 2019 00:18:30 +0200 Subject: [PATCH] get best path --- src/routing4SITA | Bin 21288 -> 21336 bytes src/routing4SITA.c | 58 ++++++++++++++++++++- src/routing4SITA.c.orig | 113 ++++++++++++++++++++++++++++++++++++++++ src/routing4SITA.h | 25 ++++++--- 4 files changed, 189 insertions(+), 7 deletions(-) create mode 100644 src/routing4SITA.c.orig diff --git a/src/routing4SITA b/src/routing4SITA index cb3de3d1094f6ced8dc324aae13072d9f6e31b04..d80bc30d891f802e2473c68a22787ff169b485b9 100755 GIT binary patch delta 3816 zcmZ`+Yj6|S6~4QYuq2aMvLz&ihu4i=8yZV~;0P0fSJ*O(v8e)9$qzT!_z^p8Z2~r- zsX=xW8ZV0*!R@5(OlJa_mT{WSRE#q%q!i1Ji}1v>xap+OXTnvOlOL;v|D50YM8B^P6JZOkR2NPVXZ^^ zTvtaYHEA0P2v0QZN8rp84t|9Y+ysXJN6#Z2FbfT7pog^CTmwC>{lP=4L=g}u0FM!m z?mNcArX7KJ-nfg9b}bmM9Er!{#n(2-)6YoqM^f4Bgx~E;+>UbpB`mY#Lf_Qi5KijQbfICLYwTfjM~8(dy@r9x)!hyidYaOkUgH% z0#VVT#_-QdgWi}VPrvi+Oqd!o%F)YKEHC0uhgT?;!nZeln`!zausO zUa1Oc;5MYV4fnVO z3JK1|d!8HZ1~gWBA0R3Iu(H`CW9zXHXfqfxVG*L-c2_<>UL>M`g_a_8oO{sdWD*f8>AVkIc&- z*_O&5N#&39o?~l!<$9tstXraXf27AUdX#klDo`o!&8OgAli!z`&r88iI7#*o(}qlE z;56Q_?_f33XSbwpL`>512}z!jf{`?7ET)mhW;C#tN21;dD5{{m(zdxsLu z&@284s8>?z&+EZ7l-Lo_T_1KC^<=k`)Zn;Y30OiH0D8#bZWxk%CKL)8^x>R`WK-08 z7BgRE-irS$CJByfmHLpDG3&s>R!y!SfTcQ{YSr1^b3nl5g@XJ;O6Fh<$5w3UK8Jwf zosfp4LCbG23Gk0dgKKyUEXiZ{c3bS&=eRv4Snx#4%e@mB2l0sz^-i%0v(a7gPq8*= z&!=|fPnqx3eBY_wX7g{2?&y`+q@##Tc2v!kTO)L1~FxDss?w;uv9fTQ-+1A zAunb4;x@~&BxU$SHDm=+mW!&z2nI>fX+T5?zDq#4wHy=?o_I`~L5)4(0eXKP^lJt! zPdy9+cLfk$M3vw>3zTo6lFGQ1L6{$)nt9Ml25D3% zUxgAG9iTzR)hN`AX$%(<>>CA`A6{%M?8m5y+649iXyE&I6sqq8!-aH}{R5y3nK`UNE~*5KeVXC9f{KSh z`}(_W@K&bF7A>+B1@dnDgkB~Y3tYt%w1jI z?CI|4>Qr&k+4_R89b?b8Q%P7-vg4oecnHcp53&*D8?)*|aq>ny{s+)KH{)?^J(-Kg z1(1z%^fh4x*G|U-m+r!KaH2PbM;Ckq?)e;Dma}NnHHfeW?+nkwrtk8V4=t#BRr5XV zpzh#;V49{)voK9h$P$1L!cqQdJbn_}o#blX=8;eZrk}xa;TC-3AD<0=YrgPp) zH~8Rd2Zum!7iM#X)ZxtLEe^Wc`Ao5>Q6U{807a|nxWjNXCUB#wk{9Ttvx3`04X$jn zT_-YYS^|sFa+ix6rX8+qZipUVn?-%PR>~E*x!tt5Xsh`#;9=c_?RrA`=+UBW1`B+c z;n32fYZhC1f{lgQ!oY7e98J{2+o-QtFxV4Z9kYarO@`!`@LTlF;t(IU(?INc-2?xJEczHEGcEn-g2EnNa4xT)W={z>hM<+clIN$bcGe0egjHLFIkV)FV&PMyz>CNpA zAb+IC0SN=L=KGRaFCNvdYCt^mdgC8^6NqbR2oWV-`JNj(zlbug!78s>Wkm z0RnH~@s9(vi5~UZtoVVCBOiQlv;dk3%a&!>2Ulj^4!mh^e&zwRLrnbg#j!_2jnz|Y z%G{*MSyJ}+O0peADQQMgLRwH1lU5W(qzyz_Ie8YvD$?4?(6W)t_1ihej_&rItxYZ4 z@V|~IuCLv&u5w$6v&308vP&A_XhF>kw~`t*x(vx32shA1w>i1r8u4KOBSPhkE^~5M z3hWI@a2JAgD6v^v6)Vd7A3F|QR)Vk@3S`!_pElTZGdt#&Sp_8=%xJjS#WYLDY zC8>XueI_;UAw4}%=QJkodAK#l>#Dh*Q^O{g;ojdw&nCBFP7s;P+(`eX^&B1WndpVD u3Iz7p`bdEkxp)Qb0;acCI7$c(O7!` delta 2984 zcmZ8jeQZMT<75mJaqM*KIAD)LJxM{AmG~@;m#91pKJ`_Uze@nlyXH-0Aj5Bk!z( zxKgBMqLB(V(`wL76_8~vfPSAD-Za^%7tWcSbQAB@J!qvtK*^))xel7y1-0hJRSGeQ zAHkmDPeVH^x5ekk(}ye^-w9J@H{A)d=AXqjt{lxiZ|w^E{#h5f(aIwCSnuEGLQQqk zlPB|a!ltJ*A*Q$3bYeJmdkJ}*>#iYWl<7!s;{D;gQ4CJl>B+;E2@V){JNmD5ba-;z zr#L}!-8vZ;_C22pF|}Y~kvTRMuVVBnyRmTC28K1~IqAFD^W-KUW+g|Q%`9?1e!?(} ztEwByZAD@0gc(a3f3RQ}6MT+w1xXeO&WrKHKf^^~k;^O^oM#a$7t?wc9}kN*&$GVZ z9E;qzG=TFO7hq&MejX!zvcU5MUI^?CGzXd*S?>eJBF8VV$Xyn>fNB+j@;?|jygl~1hJrLD@*O2qlcYCdwF0_}D4>B%GZ zi8?-0Q`$mB3&#@^cJMmu{g|>y^C*f{yRKNUO zlxipyqj`oM{D4K9u4f@KBJbZl-|` zB=Gw*FeQP@X<%3aV`<0xYVYMKMkImO-V5E4o?E zRQ-;i_)$fw^-B~J6u%#k+8`-hEv~IajYS>nxxn%vvYhi_T}wt%xk~s&gWUXcU(9%q zYlP=V>Q7&yCIn@Y)Vq>OX8bj3nDIR>WXAJ?*OJ!9xE3ag^!={j%t>xPcZxb*=0f`J z6ug!rtpk$(rsVN}sb0Ys6-&NQ@>?WdfPAjt*CZ>NK)Y$YqDYue=>gYtb8;kqLk)9( z#D&Z~BX})W#vYgaA0^Lozb*Kp<&ys?*YGcoqDBOj3jKZV6LlQpLWbUONEm2Ln(vVY zZPI|pt`mHbCixAhed|hxyxriPf_&%bYC@V>-&!sk>%Vp%FO95tED`%l!K%#IfZDH| z*KAO!Jqvp^2MlVR#v{Yvm3jZ)hM}Qc^B?$B zE2hKXD)g!)=p2HE!e_S?qgyMQlfY8z50&bt_@-Nf&pv!!L~fk#f)v;AW7Ao4pL!;v zH`DYsU6P5bumb5b_$)kxONGxU1CQZOVXZp)*f40!w{ju}2Gll-jyEK4R!FRMQw>}m zw{j{UzTs*0RhT4|d@~YamU{B#NLrG7HuuNY3D-PTbRSr}Zd*KQ%XdC+qfqJf(xY(5 z>!zJBvN;cvw*xKl1FKpBA;k=#65So3Xd$5*BkLO#v%MiNm4((kicQm_4Az;Av1ik1%>N@tam`S46x0oN+Z+LeZU zc&lucyFKY^r_IW7Vy8{Y3G8<%Va()c$d7$k=1^!CB+7rzEA{63SGoTZ|BUiRe(a9_ zs+yA;C=LSCJ798?mXjJ#A7bZJAFSBiMk}Cavy--9?=WGZuq;kd9EZt5j>0Tzqlh_7 zIV8>{e6^|+^9HIM=3IiAU#{|?^I(;e4q)$qKUBSjA$_{T1>HfXt2Ix?8&hP|MwC{9WrD$=)5gDk zcoT;WWg9%Kal(8MzZKDrN8#TQyp2;>Sv#|FT_xG?DJ?HwPY!TVP7ZRhjA=nkj zgEI{)(%-~gR*{g{GT>5!Cp)!~akG8aP)lEc${k+IlMmhQ9e&GzrVE#W*vO8p6jvs( u6Q`p~5O-t9Z%HjCgYHljWwDV^rb4YS_PpO>t(Ez{2Z`tX^mXtxuKqvhW*|iX diff --git a/src/routing4SITA.c b/src/routing4SITA.c index f736a66..41543b7 100644 --- a/src/routing4SITA.c +++ b/src/routing4SITA.c @@ -10,14 +10,31 @@ void *Search(void* arguments); int main() { printf("hello world!\n"); + + + pthread_t startThread; THREAD_DATA_t* data; data = (THREAD_DATA_t*) malloc(sizeof(THREAD_DATA_t)); data->node = getStartNode(); data->cost = 0; + data->depth = 0; + data->predecessors[0] = data->node->id; + data->bestpath = (BESTPATH_t*) malloc(sizeof(BESTPATH_t)); + data->bestpath->lowestCost = -1; + data->bestpath->depth = 0; pthread_create(&startThread, NULL, Search, data); + pthread_join(startThread, NULL); + + printf("\nBest Path: "); + + for(int i = 0; i < data->bestpath->depth; i++){ + printf("%i --> ", data->bestpath->predecessorsBestPath[i]); + } + printf("\nWith cost of: %i\n", data->bestpath->lowestCost); + for(;;) { } @@ -34,7 +51,34 @@ void *Search(void* arguments) { printf("Cost to this node: %i\n", data->cost); if(data->node->id == 8) { - printf("End found! Cost: %i\n", data->cost); + printf("!!!End found! Cost: %i\n", data->cost); + + //critical section start + + if(data->bestpath->lowestCost == -1) { + //first solution found + printf("first solution found\n"); + data->bestpath->lowestCost = data->cost; + data->bestpath->depth = data->depth; + for(int j = 0; j < data->depth; j++) { + data->bestpath->predecessorsBestPath[j] = data->predecessors[j]; + } + } else { + + if(data->bestpath->lowestCost > data->cost) { + //new best solution found + printf("new best solution found\n"); + data->bestpath->lowestCost = data->cost; + data->bestpath->depth = data->depth; + for(int j = 0; j < data->depth; j++) { + data->bestpath->predecessorsBestPath[j] = data->predecessors[j]; + } + } + } + + + //critical section end + return NULL; } @@ -49,9 +93,21 @@ void *Search(void* arguments) { THREAD_DATA_t* nextdata; nextdata = (THREAD_DATA_t*) malloc(sizeof(THREAD_DATA_t)); nextdata->node = (data->node->nodesnext[i]); + nextdata->bestpath = data->bestpath; nextdata->cost = data->node->nodescost[i] + data->cost; + nextdata->depth++; + + for(int j = 0; j < data->depth; j++) { + nextdata->predecessors[j] = data->predecessors[j]; + } + nextdata->predecessors[(nextdata->depth)+1] = data->node->id; + pthread_create(&threads[i], NULL, Search, nextdata); } + + for(int i = 0; i < data->node->nodescount; i++) { + pthread_join(threads[i],NULL); + } return NULL; } diff --git a/src/routing4SITA.c.orig b/src/routing4SITA.c.orig new file mode 100644 index 0000000..19fd204 --- /dev/null +++ b/src/routing4SITA.c.orig @@ -0,0 +1,113 @@ +#include +#include +#include + +#include "routing4SITA.h" + + +void *Search(void* arguments); + +int main() { + printf("hello world!\n"); + + + + + pthread_t startThread; + THREAD_DATA_t* data; + data = (THREAD_DATA_t*) malloc(sizeof(THREAD_DATA_t)); + data->node = getStartNode(); + data->cost = 0; + data->depth = 0; + data->predecessors[0] = data->node->id; + data->bestpath = (BESTPATH_t*) malloc(sizeof(BESTPATH_t)); + data->bestpath->lowestCost = -1; + + pthread_create(&startThread, NULL, Search, data); + + for(;;) { + + } + + return 0; +} + + +void *Search(void* arguments) { + + THREAD_DATA_t *data = (THREAD_DATA_t*) arguments; + + printf("Number: %i\n", data->node->id); + printf("Cost to this node: %i\n", data->cost); + + if(data->node->id == 8) { + printf("End found! Cost: %i\n", data->cost); + + //critical section + + if(data->bestpath->lowestCost == -1){ + //first solution found + data->bestpath->lowestCost = data->cost; + for(int j = 0; j < data->depth; j++){ + nextdata->predecessors[j] = data->predecessors[j]; + } + }else{ + + if(data->bestpath->lowestCost > data->cost){ + //new best solution found + data->bestpath->lowestCost = data->cost; + for(int j = 0; j < data->depth; j++){ + nextdata->predecessors[j] = data->predecessors[j]; + } + + } + + + } + + + + return NULL; + } + + if(data->node->nodescount == 0) { + printf("No next nodes\n"); + return NULL; + } + + pthread_t threads[data->node->nodescount]; + + for(int i = 0; i < data->node->nodescount; i++) { + THREAD_DATA_t* nextdata; + nextdata = (THREAD_DATA_t*) malloc(sizeof(THREAD_DATA_t)); + nextdata->node = (data->node->nodesnext[i]); + nextdata->cost = data->node->nodescost[i] + data->cost; + nextdata->depth++; + + for(int j = 0; j < data->depth; j++){ + nextdata->predecessors[j] = data->predecessors[j]; + } + nextdata->predecessors[nextdata->depth] = data->node->id; + + pthread_create(&threads[i], NULL, Search, nextdata); + } + + return NULL; +} + + + + + + + + + + + + + + + + + diff --git a/src/routing4SITA.h b/src/routing4SITA.h index 338dd04..400816a 100644 --- a/src/routing4SITA.h +++ b/src/routing4SITA.h @@ -2,23 +2,36 @@ #define ROUTING4SITA_H #define MAX_CHILDREN 3 +#define MAX_DEPTH 4 typedef struct node NODE_t; typedef struct threadData THREAD_DATA_t; +typedef struct bestPath BESTPATH_t; + extern NODE_t* getStartNode(); struct node { - int id; - int nodescount; - NODE_t* nodesnext[MAX_CHILDREN]; - int nodescost[MAX_CHILDREN]; + int id; //identifier for this node + int nodescount; //how many children nodes + NODE_t* nodesnext[MAX_CHILDREN]; //array of children nodes + int nodescost[MAX_CHILDREN]; //array of cost per children node }; struct threadData { - NODE_t* node; - int cost; + int depth; //depth of the next node, e.g. start --> 0 + NODE_t* node; //next node to go + int cost; //cost for the next node + int predecessors[MAX_DEPTH]; // array with all predecessor + BESTPATH_t* bestpath; +}; + + +struct bestPath { + int lowestCost; + int predecessorsBestPath[MAX_DEPTH]; // array with all predecessor of the best path + int depth; //depth of the best path, aka. how many nodes }; #endif /* ROUTING4SITA_H */