Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:miw:miw08_mindstormsdesign:labirynt [2008/05/20 16:32] miw |
pl:miw:miw08_mindstormsdesign:labirynt [2019/06/27 15:50] (aktualna) |
==== Implementacja w Prologu ==== | ==== Implementacja w Prologu ==== |
<code prolog> | <code prolog> |
| messured_nodes(node_no). |
| node(node_no,messure_no,next_node,ultrasonic_val,messured). |
| current_node(node_no,messure_no). |
| |
| current_messure(number). |
| %---------------------- |
| % dokonywanie pomiarów |
| %---------------------- |
| start :- |
| current_node(X,_), |
| node(X,Y,_,_), |
| messured_nodes(Q), |
| X \= Q, |
| nxt_ultrasonic_sensor(port,Value1), |
| assert(node(X,1,0,Value1), |
| |
| nxt_turn(speed,45), |
| nxt_ultrasonic_sensor(port,Value2), |
| assert(node(X,2,0,Value2), |
| |
| nxt_turn(speed,45), |
| nxt_ultrasonic_sensor(port,Value3), |
| assert(node(X,3,0,Value3), |
| |
| nxt_turn(speed,45), |
| nxt_ultrasonic_sensor(port,Value4), |
| assert(node(X,4,0,Value4), |
| |
| nxt_turn(speed,45), |
| nxt_ultrasonic_sensor(port,Value5), |
| assert(node(X,5,0,Value5), |
| |
| nxt_turn(speed,45), |
| nxt_ultrasonic_sensor(port,Value6), |
| assert(node(X,6,0,Value6), |
| |
| nxt_turn(speed,45), |
| nxt_ultrasonic_sensor(port,Value7), |
| assert(node(X,7,0,Value7), |
| |
| nxt_turn(speed,45), |
| nxt_ultrasonic_sensor(port,Value8), |
| assert(node(X,8,0,Value8) |
| assert(messured_nodes(X)). |
| |
| |
| %--------------------------- |
| % szukanie najlepszej drogi |
| %--------------------------- |
| |
start :- | start :- |
ultrasonic_sensor(Value), | current_node(X,M), |
Value > number, | node(X,Y,Next,U), |
go(0,speed,force). | messured_nodes(X), |
| Next = 0, |
| U <= number, % wartość progowa, ponad którą dokonywane jest przeszukiwanie |
| retract(node(X,Y,_,_)), |
| assert(node(X,Y,1000,U), % blokowanie połączenia |
| current_messure(A), |
| B is A + 1, |
| retractall(current_messure(_)), |
| assert(current_messure(B)). |
start :- | start :- |
ultrasonic_sensor(Value), | current_node(X,M), |
Value =< number, | node(X,Y,Next,U), |
turn(90,speed). | messured_nodes(X), |
| Next = 0, |
| U > number, % wartość progowa, ponad którą dokonywane jest przeszukiwanie |
| retract(node(X,Y,_,_)), |
| nxt_ultrasonic_sensor(port,Value), |
| assert(node(X,Y,X+1,Value), |
| abs(M-Y,N), |
| nxt_turn(speed,45*N), % przemieszczenie do nowego punktu |
| nxt_go(1), |
| retractall(current_node(X,_)), |
| W is X + 1, |
| assert(current_node(W,1)), |
| assert(current_messure(1)). |
start :- | start :- |
go(0,0,0). | current_node(X,M), |
| node(X,Y,Next,U), |
| messured_nodes(X), |
| Next > 0, |
| U > number, % wartość progowa, ponad którą dokonywane jest przeszukiwanie |
| current_messure(D), |
| D <= 8, % pominięcie punktu, zwiększenie licznika o 1 |
| B is A + 1, |
| retractall(current_messure(_)), |
| assert(current_messure(B)). |
| |
| start :- |
| current_node(X,M), |
| node(X,Y,Next,U), |
| messured_nodes(X), |
| Next > 0, |
| U > number, % wartość progowa, ponad którą dokonywane jest przeszukiwanie |
| current_messure(D), |
| D > 8, |
| abs(M-Y,N), |
| nxt_turn(speed,45*N), % przejscie do punktu, który już był wcześniej badany |
| nxt_go(1), |
| node(Next,P,X,U2), |
| retractall(current_node(X,_)), |
| assert(current_node(Next,P)), |
| retractall(node(Next,P,_,_)), |
| assert(node(Next,P,1000,U2)). % zablokowanie powrotu do poprzedniego punktu |
| |
| start :- |
| go(0). |
</code> | </code> |
| |
| |
==== XTT ==== | |
{{:pl:miw:miw08_mindstormsdesign:alg11.png|XTT}} | |
| |
| |
| ==== XTT ==== |
| {{:pl:miw:miw08_mindstormsdesign:labirynt222.png|XTT}} |
| |
| FIXME |
| * przy większych algorytmach pojawia się problem z zapętlaniem |
| * podział na atrybuty, nie jest taki oczywisty, zwłaszcza w przypadku, gdy argumentami jest tablica argumentów |
| * ponadto, nie jest oczywiste jak odczytywać argumenty. W tym algorytmie założyłem, że wszystkie atrybuty są odwzorowaniem jednego rekordu z tablicy atrybutów. Atrybuty zmieniają się w przypadku zwiększenia atrybutu current_node |
| * nie jest jasne wykorzystanie akcji assert i retract. I pobieranie z nich wartości. |