Oryginalna strona colobot.cba.pl umarła, gdy cba.pl przestało oferować darmowy hosting. To jest statyczny mirror, pobrany w 2018. ~krzys_h
|
Forum - Polski Portal COLOBOTa |
|
|
Przesunięty przez: Abadon 20-02-2010, 14:26 |
Program do tytanun |
Autor |
Wiadomość |
Kempior
Twoja ulubiona misja: Krystalia: Ziemska Strategia
Wiek: 23 Dołączył: 19 Cze 2009 Posty: 15 Skąd: Bielsko-Biała
|
Wysłany: 22-06-2009, 14:03 Program do tytanun
|
|
|
Program powstał parę minut temu, z testów wynika że można go włączyć naraz nawet na kilku transporterach, oprócz latających gdyż przy dwóch transporterach było tak, jeden leci już do huty drugi trochę zanim, gdy pierwszy czekał na tytan drugi chciał na nim wylądować popchnął go i pierwszy tytanu nie wykrył a drugi poleciał odłożyć rudę tytanu .
W przypadku transporterów nie latających program zadziałał bez zarzutu, nawet przy trzech transporterach.
Kod: |
{
object item;
errmode(0);
while(true)
{
while( load == null )
{
item = radar(TitaniumOre);
while(item == null)
{
wait(0.01);
}
while(goto(item.position) != 0 )
{
wait(0.01);
}
goto(item.position);
grab();
}
item = radar(Converter);
while ( item == null );
while(goto(item.position) != 0 )
{
wait(0.01);
}
goto(item.position);
drop();
move(-2.5);
do
{
item = radar(Titanium, 0, 45, 0, 5);
}
while ( item == null );
goto(item.position);
grab();
item=radar(RedFlag);
goto(item.position);
goto(space(position, 3, 25, 3));
drop();
if ( energyCell.energyLevel < 0.5 )
{
item = radar(PowerStation);
if ( item != null )
{
while(goto(item.position) != 0)
{
wait(0.01);
}
goto(item.position);
while ( energyCell.energyLevel < 1 )
{
wait(0.01);
}
}
}
if ( shieldLevel < 0.5 )
{
item = radar(RepairCenter);
if ( item != null )
{
while(goto(item.position) != 0);
{
wait(0.01);
}
goto(item.position);
while ( shieldLevel < 1 )
{
wait(0.01);
}
}
}
}
}
|
|
|
|
|
|
pipok
Dołączył: 24 Cze 2009 Posty: 53
|
Wysłany: 25-06-2009, 12:57 Re: Program do tytanun
|
|
|
Kod: | if ( energyCell.energyLevel < 0.5 )
{
item = radar(PowerStation);
if ( item != null )
{
while(goto(item.position) != 0)
{
wait(0.01);
}
goto(item.position);
while ( energyCell.energyLevel < 1 )
{
wait(0.01);
}
}
}
}
| Ten kod jest daleki od optymalnego.
1. Wewnętrzny opóźniacz drugiej pętli ma zbyt mały czas, przez co wykonywanie pętli zabierze sporo więcej czasu procesora niż to uzasadnione. Lepiej użyć oczekiwania rzędu dziesiętnych części sekundy.
2. Podładowywanie akumulatorów, kiedy są w połowie wyczerpane
Kod: | if ( energyCell.energyLevel < 0.5 ) | to kiepski pomysł. Transporter bedzie zbyt często i niepotrzebnie udawał się do elektrowni. Przyjętym w wielu skryptach bezpiecznym limitem jest 0.3, ale można usprawnić rozwiązanie problemu podładowania przed wyczerpaniem się akumulatorów.
Kiedy wysłać bota na podładowanie akumulatorów?
Weźmy typowy przypadek: bot transportowy ze zwykłymi ogniwami, które może podładować w elektrowni (PowerStation). Możemy wyróżnić trzy podejścia do problemu:
1. Stały na sztywno zakodowany limit zapasu energii.
Jeśli poziom na ładowania akumulatorów spadnie poniżej tego limitu, bot powinien udać się do elektrowni.
Kod: | if ( energyCell.energyLevel < 0.3 ) { obsluga(); } |
2. Limit stały, obliczony.
Jeśli bot porusza się po stałej trasie (np. kopalnia-huta i z powrotem), to jednokrotne przebycie tej trasy pozwala ustalić energię, jaką na nią zużywa. Podobnie jednokrotny w cyklu pracy przejazd do elektrowni pozwala na ustalenie energii potrzebnej na dojazd w celu podładowania. Po uzyskaniu tych dwóch wartości, w dalszej pracy bot może kierować się wyliczonym, ale od tej pory stałym limitem:
Kod: | if ( energyCell.energyLevel < enNaStalaTrase ) { obsluga(); } |
Taki limit można również ustalić poza skryptem, doświadczalnie, a w gotowej wersji skryptu, przeznaczonego dla wykonującego konkretną trasę konkretnego typu bota w konkretnej misji wpisać stałą liczbę, jak w wariancie 1.
3. Limit obliczany na bieżąco.
Jeśli robot nie porusza się po stałej trasie, na przykład ma zbierać bliżej i dalej położone bryły rudy i transportować je do huty, to wariant 2 nie zdaje egzaminu. Możliwe rozwiązanie jest następujące.
W jakim celu badamy poziom energii i po co wysyłamy bota do elektrowni? Żeby nie utknął z powodu wyczerpania się akumulatorów. Jeśli na niski poziom energii zareaguje zbyt późno, nie wystarczy mu na dojazd do elektrowni, trzeba będzie wysłać kogoś do pomocy. Z drugiej strony, jeżeli będzie na wszelki wypadek uzupełniał energię nawet przy znacznym jej zapasie, to zamiast wykonywać swoją pracę, zużyje mnóstwo czasu na ustawiczne wizyty w elektrowni. Powinien pilnować, by mieć bezpieczny zapas, ale nie nazbyt duży.
Zanim w ogóle wyruszy gdziekolwiek, zanim z punktu A, w którym się znajduje, ruszy do punktu B, za każdym razem powinien upewnić się, że wystarczy mu energii, że nie utknie. Będzie potrzebował energii na dotarcie do punktu B, ale również na dotarcie stamtąd do elektrowni (punkt E), w razie potrzeby. Można bez trudu policzyć odległość od A do B oraz od B do E. Można również empirycznie ustalić przeciętne dla danego typu bota zużycie energii na trasie o zadanej długości. Wówczas znając odległość, znamy potrzebną energię. Dodajemy do tego niewielki zapas na szczególnie trudny teren i nieprzewidziane przeszkody po drodze. W ten sposób problem bezpiecznego zapasu energii sprowadzamy do problemu bezpiecznej energetycznie trasy. Można bezpiecznie wyruszyć w drogę do celu B, jeśli po dotarciu na miejsce wystarczy jeszcze energii na dojazd stamtąd do elektrowni:
Kod: | enKonieczna = enNaOdl(odl(position, pktB)) + enNaOdl(odl(pktB, pktE)) + enZapas;
if ( energyCell.energyLevel < enKonieczna ) { obsluga(); } |
Jeżeli energii nie wystarczy, bot wykona funkcję obsluga() i podładuje się w elektrowni. Możliwe naturalnie, że punkt B jest poza bezpiecznym dla bota zasięgiem. Możliwe także, że jest w ogóle poza jego zasięgiem (nie wystarczy energii nawet jeśli bot świeżo podładował akumulatory do maksimum).
W ogólniejszym przypadku bot może mieć do dyspozycji więcej niż jedną elektrownię i powinien w swoich szacunkach analizować różne warianty i wybierać najlepszy. |
Ostatnio zmieniony przez pipok 25-06-2009, 17:00, w całości zmieniany 2 razy |
|
|
|
|
adiblol
Administrator forum FLOSS FTW!
Twoja ulubiona misja: porównywanie formatów audio
Pomógł: 18 razy Dołączył: 21 Kwi 2008 Posty: 1313 Skąd: pokój odsłuchowy
|
|
|
|
|
DemoLisH
Zbanowany
Wiek: 24 Dołączył: 20 Kwi 2008 Posty: 273 Skąd: Poznań
|
|
|
|
|
pipok
Dołączył: 24 Cze 2009 Posty: 53
|
Wysłany: 25-06-2009, 18:46
|
|
|
Lubię pisać |
|
|
|
|
|
Nie możesz pisać nowych tematów Możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Możesz ściągać załączniki na tym forum
|
Wersja do druku
|
|
| |
|
|
|
|
Polski Portal COLOBOTa © 2008 - 2012 |
|
|