piątek, 11 marca 2011

RoboMind: Wyniki zawodów listopad 2013r.


Autor: Dondu

Poniżej wyniki weekendowych zawodów RoboMind rozegranych w dniach 9-11 listopada 2013r. W zawodach wzięło udział 13 zawodników i jedna zawodniczka :-)

Ogłoszenie o zawodach: Konkurs weekendowy RoboMind (9-10 listopada 2013r,)

Zawody wypełniła dyskusja na temat problemu instrukcji jeść(), której nie było w oficjalnym helpie na stronie producenta programu. W przypadku następnych zawodów, ten problem rozwiążemy pisząc własną instrukcję.

Zawody pokazały także, że w następnych musimy bardzo szczegółowo opracować regulamin. Z drugiej strony pokazały, jak różnie można podchodzić do algorytmów rozwiązania problemów. Zapewne w przyszłych zawodach zamiast jednej trasy będą dwie, by algorytmy były jak najmniej dopasowane do aren zmagań.

Mam więc serdeczną prośbę, by w przyszłości tego typu zawody traktować jak zabawę, a nie ostrą rywalizację. Zawody te prowadzę dla Was hobbystycznie, a poświęcam na to sporo czasu. :)

Wyniki przedstawiają się następująco:



Gratulacje dla zwycięzców!!!

Najbardziej żal nam Łukasza, który miał bardzo fajnie napisany program, ale popełnił malutki błąd - robot zamiast podnieść ostatni beacon, zjadł go :(  Niestety było to niezgodne z wytycznymi mówiącymi że:
  • gdy się zatrzyma przedmiot powinien być we wnętrzu robota,
a nie zjedzony, czyli ulec destrukcji. Niejednoznacznie może być oczywiście zrozumiane określenie "we wnętrzu" skoro robot ma instrukcję podnieś, jednakże patrząc na robota widać, że faktycznie wkłada on przedmiot do środka.

Program Łukasza zamieszczamy poniżej jako dodatkowy.


1 miejsce: Szymczyk Mirosław

# Przemieszczenie robota do pierwszej grupy nadajników
# Sprawdzana jest wolna przestrzeń najpierw po prawej, późnej po lewej
powtórzDopóki(nie zPrzoduNadajnik()) {
    jeżeli(prawoPusto()) { wPrawo() }
    wPrzeciwnymRazie jeżeli(lewoPusto()) { wLewo() }
    naprzód(1)
}
UsuńPrzeszkodę()
# Przemieszczenie robota do drugiej grupy nadajników
powtórzDopóki(nie zPrzoduNadajnik()) {
    jeżeli(zPrzoduPusto() i  prawoPusto()) { wPrawo() }
    wPrzeciwnymRazie jeżeli(zPrzoduPrzeszkoda() i lewoPusto()) { wLewo() }
    naprzód(1)
}
UsuńPrzeszkodę()
# Przemieszczenie robota do miejsca gdzie rozpoczyna się biała ścieżka
powtórzDopóki(nie lewoBiałe()) {
    jeżeli(zPrzoduPrzeszkoda()) { wLewo() }
    naprzód(1)
}
wLewo()
# Przemieszczenie robota po białej ścieżce do jej końca
# Znajdujące się na ścieżce nadajniki sa eliminowane
powtórz {
    jeżeli (prawoBiałe()) { wPrawo() }
    wPrzeciwnymRazie jeżeli (zPrzoduBiałe()) {}   
    wPrzeciwnymRazie jeżeli (lewoBiałe()) { wLewo() }
    wPrzeciwnymRazie jeżeli (nie zPrzoduBiałe()) {
        jeżeli (zPrzoduPusto() ) {wLewo() wLewo()} 
        wPrzeciwnymRazie {
            wPrawo()
            malujBiały()    # rozpoczącie malowania białej ścieżki
            naprzód(1) 
            przerwij        # wyjście z pętli
        }
    }
    jeżeli (zPrzoduNadajnik()) { UsuńPrzeszkodę() }
    naprzód(1)    
}
# Przemieszczenie robota do mety 
powtórz {
    jeżeli (lewoPusto()) {  wLewo() }
    wPrzeciwnymRazie jeżeli (zPrzoduPusto()) { }
    wPrzeciwnymRazie jeżeli (prawoPusto()) { wPrawo() }
    jeżeli (zPrzoduNadajnik()) {
        podnieś()            # pobranie nadajnika do wnętrza robota
        naprzód(1)
        przestańMalować()    # można pominąć
        zakończ              # zakończenie programu  
    }
    naprzód(1)
}
# Usunięcie (zjedzenie) z toru nadajników 
procedura UsuńPrzeszkodę() {
    powtórzDopóki(zPrzoduNadajnik()) {
        jeść()
        naprzód(1)
    }
}



2 miejsce: Kobus Sebastian

powtórz{
    prawaręka
    jeżeli(zPrzoduPrzeszkoda() i lewoPrzeszkoda()){
        przerwij
    }    
}

powtórz{
    lewaręka
    jeżeli(zPrzoduNadajnik()){
        przerwij
    }       
}

powtórz{
    jedznadajnik
    prawaręka
    jeżeli(lewoBiałe){
        przerwij
    }    
}

powtórz{
    pobiałej
    jeżeli(zPrzoduNadajnik()){
        malujBiały
        powtórz{
            jedznadajnik
            lewaręka
        } 
    }      
}

    

procedura jedznadajnik{
    jeżeli(zPrzoduNadajnik()){
        jeżeli(zPrzoduCzarne()){
            podnieś()
            naprzód(1)
            zakończ
        }
        wPrzeciwnymRazie{
            jeść()  
        }       
    }
}

procedura pobiałej{
        jeżeli(lewoBiałe()){
            jeżeli(zPrzoduBiałe()){
                naprzód(1)
                wPrawo()
                wPrawo()
            }    
            wPrzeciwnymRazie{
                wLewo()
                naprzód(1)
            } 
        }     
        jeżeli(prawoBiałe()){
             wPrawo()   
             naprzód(1) 
        }         
        jeżeli(zPrzoduBiałe()){   
             naprzód(1)
        }   
}

procedura prawaręka{
    jeżeli(PrawoPrzeszkoda()){
            jeżeli(zPrzoduPusto()){
                naprzód(1)
            }
            wPrzeciwnymRazie{
                wLewo()
            }
    }
    wPrzeciwnymRazie{
        wPrawo()
        naprzód(1)
    }    
}

procedura lewaręka{
    jeżeli(lewoPrzeszkoda()){
            jeżeli(zPrzoduPusto()){
                naprzód(1)
            }
            wPrzeciwnymRazie{
                wPrawo()
            }
    }
    wPrzeciwnymRazie{
        wLewo()
        naprzód(1)
    }    
}



3 miejsce: Kempny Szymon

szukajTrasy

# Szuka białej trasy
procedura szukajTrasy {
  jeżeli(lewoBiałe) {
    wLewo
    trasaBiała
  }
  ogarnijSie
  szukajTrasy
} # koniec szukajTrasy

# ogarnia robota, żeby dobrze jechał
procedura ogarnijSie {
  jeżeli(zPrzoduPrzeszkoda){
    jeżeli(zPrzoduNadajnik){ jeść }     # pozbądź się wszystkich nadajników
    wPrzeciwnymRazie jeżeli(lewoPusto i prawoPusto)     { wPrawo } 
    wPrzeciwnymRazie jeżeli(lewoNadajnik lub lewoPusto) {
      wLewo
      zwroć
    } wPrzeciwnymRazie                                  { wPrawo }   
  } wPrzeciwnymRazie jeżeli(lewoPusto) {          
      naprzód(2)                        
      jeżeli(prawoPusto i lewoPusto) { # Sprawdź czy to aby nie zły zakręt
        wstecz(2)    # kosztem 2 dodatkowych ruchów - kilka linii kodu mniej
        wLewo
      }
  }
  naprzód(1)
} # koniec ogarnijSie

# jedź po białej trasie
procedura trasaBiała {
  powtórz {
    jeżeli(zPrzoduBiałe) {
      jeżeli(zPrzoduNadajnik)  { jeść }  
      wPrzeciwnymRazie         { naprzód(1) }
    } 
    wPrzeciwnymRazie jeżeli(prawoBiałe)        { wPrawo } 
    wPrzeciwnymRazie jeżeli(lewoBiałe)         { wLewo } 
    wPrzeciwnymRazie jeżeli(zPrzoduPrzeszkoda) {         # koniec białej trasy
      wPrawo                                             # czyli malujemy i
      malujBiały                                         # i szukamy mety
      szukajMety
    } wPrzeciwnymRazie {    # miejsce ze ślepym zaułkiem 
      wstecz(1)
      wLewo
    }
  }
} # koniec trasaBiała

# po przejściu białej trasy - szukaj mety
procedura szukajMety {
  powtórzDopóki(nie(prawoCzarne)) {
    jeżeli(lewoPusto()) { wLewo }
    naprzód(1)
  }
  wPrawo
  naprzód(1)
  podnieś
  naprzód(1)
  zakończ
} # koniec szukajMety


Kresa Łukasz

Szkoda tego błędu z linii 34 - byłoby drugie miejsce :(

# http://mikrokontrolery.blogspot.com/
# Konkurs weekendowy
# Lukasz Kresa
# map: dd_arena.map

ruszajRobocie()
#ruszajRobocie - procedura
procedura ruszajRobocie(){
    # Na początku szukamy białej trasy
    powtórzDopóki(nie lewoBiałe){
        jeżeli(zPrzoduNadajnik){jeść()
            powtórzDopóki(nie (zPrzoduPrzeszkoda lub lewoBiałe)){naprzód(1) gdzieSkrecic()}}
        wPrzeciwnymRazie jeżeli(zPrzoduPrzeszkoda){skrecBoPrzeszkoda}
        wPrzeciwnymRazie jeżeli(lewoPusto){wLewo naprzód(1)}
        wPrzeciwnymRazie{naprzód(1)}}
    wLewo naprzód(1) jedzBialaLinia()}
#
procedura jedzBialaLinia(){
    powtórz{
        jeżeli(prawoBiałe){wPrawo naprzód(1)}
        wPrzeciwnymRazie jeżeli(zPrzoduNadajnik){jeść()}
        wPrzeciwnymRazie jeżeli(zPrzoduBiałe){naprzód(1)}
        wPrzeciwnymRazie jeżeli(lewoBiałe){wLewo}
        wPrzeciwnymRazie jeżeli(zPrzoduPusto i lewoPusto){wLewo wLewo}
        wPrzeciwnymRazie{przerwij}}
    maluj()}
#
procedura maluj(){
    malujBiały
    powtórz{
        jeżeli(lewoPusto){wLewo naprzód(1)}
        wPrzeciwnymRazie jeżeli(zPrzoduPusto){naprzód(1)}
        #BŁĄD w poniższej linii - miało być PODNIEŚ zamiast JEŚĆ!!!
        wPrzeciwnymRazie jeżeli(zPrzoduNadajnik){jeść() naprzód(1) zakończ}
        wPrzeciwnymRazie{wPrawo}}}
#
procedura gdzieSkrecic() {
    jeżeli(zPrzoduPrzeszkoda i (nie zPrzoduNadajnik)){
            jeżeli(PrawoPrzeszkoda){wLewo naprzód(1)}
            wPrzeciwnymRazie jeżeli(lewoNadajnik){wLewo}
            wPrzeciwnymRazie{wPrawo naprzód(1)}}}
#            
procedura skrecBoPrzeszkoda() {
    jeżeli(PrawoPrzeszkoda){wLewo naprzód(1)}
    wPrzeciwnymRazie{wPrawo naprzód(1)}}


4 komentarze:

  1. Zagapiłem się i zmieniając komendy z "podnieś/opuść" na "jeść" zmieniłem także nieopatrznie tę z końca.
    Pomysł z dwoma mapami uważam za ciekawy. Czekam na kolejne zawody.

    OdpowiedzUsuń
    Odpowiedzi
    1. Tak bywa :(
      Co do pomysłu to jutro pojawi się artykuł w tej sprawie z prośbą o dyskusję - zobaczymy co z tego wyjdzie. Jeżeli coś pozytywnego, to będziemy częściej takie zawody organizować.

      Usuń
  2. Kiedy można się spodziewać przesłania wygranych ebooków? ;)

    OdpowiedzUsuń
    Odpowiedzi
    1. Jutro (wtorek) uzyskam odpowiednie kody i prześlę mailowo zwycięzcom. Zapomniałem o tym napisać.

      Usuń