Oryginalna strona colobot.cba.pl umarła, gdy cba.pl przestało oferować darmowy hosting. To jest statyczny mirror, pobrany w 2018. ~krzys_h
 Polski Portal COLOBOTa - COLOBOT Polish Portal
Forum - Polski Portal COLOBOTa
Strona głównaStrona główna UżytkownicyUżytkownicy GrupyGrupy StatystykiStatystyki


Poprzedni temat «» Następny temat
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
Kod:
wait(0.01);
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
Wysłany: 25-06-2009, 16:28   

Niezłe wyjaśnienia, gratuluję profesjonalnego podejścia do tematu :)
_________________
1Tbps Project && Telecomix Network

 
 
     
DemoLisH
Zbanowany


Wiek: 24
Dołączył: 20 Kwi 2008
Posty: 273
Skąd: Poznań
Wysłany: 25-06-2009, 18:23   

hehe, zrobił taki mini artykuł ;-)
_________________
Compiling [Gość.exe]...

Zapraszam na grę zwaną League of Legends:
http://signup.leagueofleg...e98cec278372604
 
 
     
pipok 


Dołączył: 24 Cze 2009
Posty: 53
Wysłany: 25-06-2009, 18:46   

Lubię pisać :)
 
     
Wyświetl posty z ostatnich:   
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

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Polski Portal COLOBOTa © 2008 - 2012