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

Zasoby - Program do tytanun

Kempior - 22-06-2009, 14:03
Temat postu: 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 - 25-06-2009, 12:57
Temat postu: 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.

adiblol - 25-06-2009, 16:28

Niezłe wyjaśnienia, gratuluję profesjonalnego podejścia do tematu :)
DemoLisH - 25-06-2009, 18:23

hehe, zrobił taki mini artykuł ;-)
pipok - 25-06-2009, 18:46

Lubię pisać :)

Powered by phpBB modified by Przemo & WRIM © 2003 phpBB Group