MiniBCC #30 - Autopilot

Übersicht Sonstiges Projekte

Neue Antwort erstellen

Holzchopf

Meisterpacker

Betreff: MiniBCC #30 - Autopilot

BeitragFr, Nov 10, 2017 20:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Es geht weiter! Herzlich willkommen zum

MiniBCC #30

user posted image

Thema
Programmiert einen Autopiloten für einen kleinen lustigen runden Roboter. Der Autopilot soll den Roboter durch eine Strecke führen.

Aufgabe
Ladet euch das Vorlagenpaket herunter. Eure Aufgabe ist es, einen Autopiloten zu schreiben. Also kopiert die Datei "AIs/holzchopf.bmx" oder "AIs/holzchopf.bb", gebt ihr einen eigenen Namen und füllt sie, um dem Roboter mit euren Skills eine bessere Intelligenz einzuhauchen! Ziel ist es, dass der Roboter möglichst schnell die Strecke abfährt. Danach postet ihr eure KI hier oder lasst sie mir per Privatnachricht zukommen. Natürlich müsst ihr nicht alles von Grund auf neu schreiben - ein bisschen tweaken tut's auch Wink

Am Schluss gibt's einen Wettkampf der Autopiloten! Dabei wird jede KI drei mal in die Runde geschickt und diejenige, die dann die beste Rundenbestzeit aufweist, hat gewonnen. Leider keinen Preis, sondern einfach den Wettkampf der Autopiloten.

Der Gewinner des miniBCC wird ganz konservativ per demokratischen Entscheid erkoren.

Hinweise zum Programm
Auf dem Bildschirm seht ihr in der Mitte die Strecke mit dem Roboter und rundherum ganz viel HUD.
Die Richtung des Roboters ist am kleinen schwarzen Punkt zu erkennen.
Die grünen Punkte um den Roboter herum sind die Detektionsorte der Sensoren, auf die ihr zum Steuern zugreifen dürft.
Links und rechts im HUD geben euch Balken über die Geschwindigkeiten der Räder links und rechts auskunft.
Das "Spektogramm" unten zeigt euch, wie weit die einzelnen Sensoren sehen.
Dann ist noch die Linie mit den Angaben für aktuelle Rundenzeit, Runde und Rundenbestzeit.
Mit Escape könnt ihr das Menü öffnen.
Ihr könnt als Steuerungsmethode auch manuell wählen - was euch erlaubt, den Roboter mit der Maus zu steuern.

Für eure Steuerung stehen diese Funktionen zur Verfügung:
GetV1#() und GetV2#()
Gibt die aktuelle Geschwindigkeit des Rades links resp. rechts zurück.

AccelerateRobot(pRobot, pAcc1#, pAcc2#)
Beschleunigt die Räder links und rechts um die angegebenen Werte. Die Beschleunigung wird von der Simulation beschränkt auf ±MAX_ACC, höhere Werte werden begrenzt.

AccelerateRobotTo(pRobot, pVel1#, pVel2#)
Beschleunigt die Räder mit Maximalbeschleunigung auf die angegebenen Zielgeschwindigkeiten. Die Geschwindigkeit wird von der Simulation beschränkt auf ±MAX_VEL, höhere Werte werden begrenzt.

Randbedingungen
(die euch das Leben etwas einfacher machen)
  • Die Strecke bleibt immer dieselbe
  • Der Roboter bleibt immer derselbe (selbe Grösse, Beschleunigung, Maximalgeschwindigkeit)
  • Derselbe Code verhält sich in BB leider anders als in BMax - deshalb wird eure KI auch in der Umgebung getestet, in der ihr sie schreibt. Teilt also beim Einreichen mit, womit ihr gearbeitet habt.


Regeln
(an die ihr euch halten müsst)
  • Bearbeiten dürft ihr lediglich euer Autopilot-File und die Hauptdatei, die Zeile, an der eure KI eingebunden wird Wink
  • Das Autopilot-File darf höchstens 6KiB gross sein
  • Mitmachen könnt ihr mit BB oder BMax
  • Die einzigen "Spiel-Funktionen", die ihr aus eurer KI heraus aufrufen dürft, sind GetV1, GetV2, AccelerateRobot und AccelerateRobotTo
  • Auf die Konstanten dürft ihr ebenfalls zugreifen
  • Schummeleien, wie z.B. auf Felder von anderen Programmteilen zugreifen oder diese gar manipulieren, werden selbstverständlich nicht gestattet Wink


Termin
Sonntagabend, 12.11.2017 um 23:59

Haut in die Tasten!
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
  • Zuletzt bearbeitet von Holzchopf am Di, Nov 14, 2017 20:13, insgesamt 2-mal bearbeitet

Thunder

BeitragFr, Nov 10, 2017 23:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow Very Happy das klingt echt lustig. Hatte mal eine ähnliche Idee, aber du hast das echt wunderbar umgesetzt!

Eine Frage hab ich: Du meintest, die KIs werden in drei Runden geschickt... Jetzt könnte man auf die Idee kommen in der Autopilot funktion daten über die strecke aufzuzeichnen und sie in der nächsten runde wiederzuverwenden. Wäre das erlaubt?
Konkreter: darf ich irgendwelche Informationen von einem Aufruf in den nächsten mitnehmen?

Ich werde mich an der Aufgabe jedenfalls versuchen.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Holzchopf

Meisterpacker

BeitragFr, Nov 10, 2017 23:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das darfst du Smile
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Thunder

BeitragSo, Nov 12, 2017 16:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Leider hat es in meinen Versuchen so ausgesehen, dass man schneller ist, wenn der Roboter nicht sauber die Kurven ausfährt. Hab jetzt daher einen relativ simplen Algorithmus abgegeben (@Holzchopf PN).
Bin schon gespannt auf den Wettkampf Smile
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Holzchopf

Meisterpacker

BeitragSo, Nov 12, 2017 16:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Genial! Ich bin entzückt Smile
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

count-doku

BeitragSo, Nov 12, 2017 18:29
Antworten mit Zitat
Benutzer-Profile anzeigen
So ich habe auch mal meine Version eingesandt.

Hoffe es kommen noch ein paar mehr Einsendungen - sonst wird das ein Duell zwischen uns beiden Thunder Twisted Evil


lg,
Count-Doku

Holzchopf

Meisterpacker

BeitragSo, Nov 12, 2017 18:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Auch sehr schön, danke!

Eigentlich unglaublich, mit wie wenig Code man eine nicht nur zuverlässige sondern auch wettkampffähige Steuerung hinkriegt =)
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

count-doku

BeitragSo, Nov 12, 2017 18:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja ich hatte eigentlich noch den Optimierungsgedanken entweder immer nur direkt um 90° zu drehen,
sobald ich einer Wand zu nahe komme. Nur würde dies eine Kenntnis über die Karte voraussetzen und die habe ich
zwar als Programmierer aber mein Bot nicht, daher habe ich das weggelassen.

Thunder

BeitragSo, Nov 12, 2017 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Jaaaa, Count, lange nichts mehr von dir gehört! Ich glaub ich hatte dich mal auf ICQ ... muss lang her gewesen sein Shocked
Bin froh, dass ich nicht der Einzige im Turnier bin! Very Happy
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Xaymar

ehemals "Cgamer"

BeitragSo, Nov 12, 2017 20:47
Antworten mit Zitat
Benutzer-Profile anzeigen
AI: Xaymars Dummkopf Einsendung BB
Benannt nachdem wie er/sie halt fährt. Kanten werden ignoriert und der absolut kürzeste Weg wird genommen. Auch wenn dies den Roboter beschädigen würde. Wie ein Roomba halt, nur noch weniger Intelligent.

Rundenzeit: 0:16:06 (Bestzeit)

BlitzBasic: [AUSKLAPPEN]
AIName = "Xaymars Dummkopf"

Function GetAngle#(pDists#[SENSORS_VIS_CNT])
Local BigIndex = 0
Local BigNum# = 0

For I = 0 To SENSORS_VIS_CNT - 1
If (pDists[I] > BigNum) Then
BigIndex = I
BigNum = pDists[I]
EndIf
Next

Return (BigIndex / Float(SENSORS_PER_SIDE)) - 1.0
End Function

Function AutoPilotRobot(pRobot.TRobot, pDists#[SENSORS_VIS_CNT])
Local Ang# = GetAngle(pDists)
Local Vec1#, Vec2#
Vec1 = (((Ang + 1.0) - 0.5) * 2.0) * MAX_VEL
Vec2 = (((2.0 - (Ang + 1.0)) - 0.5) * 2.0) * MAX_VEL
AccelerateRobotTo(pRobot, Vec1, Vec2)
End Function


Edit: AI: Der Speedrunner
Dies ist keine Einsendung, da ich ganz sicher bin das dies Schummeln ist. Fährt auch irgendwann einfach rückwärts die Strecke entlang wegen der Floating-Point Probleme.

Rundenzeit: 0:00:62 (Best), 0:01:33 (Avg), 0:03:44 (Worst)

BlitzBasic: [AUSKLAPPEN]
AIName = "SPEEDRUN!!!"
Function AutoPilotRobot(pRobot.TRobot, pDists#[SENSORS_VIS_CNT])
AccelerateRobotTo(pRobot, MAX_VEL, MAX_VEL / 4)
End Function


Edit 2: AI: Xaymars Ausweicher
Ein weiterer Versuch, leider allerdings nicht schneller als der Dummkopf, dafür bleibt er etwas heiler. Keine Einsendung, da langsamer als der Dummkopf.

BlitzBasic: [AUSKLAPPEN]
; Name des Autopilots
AIName = "Xaymars Ausweicher"

Function FEqual(A#, B#, Threshold#=.01)
If (A - B <= Threshold) Then
Return True
EndIf
Return False
End Function

Function GetAngle#(pDists#[SENSORS_VIS_CNT])
Local BigIndex = 0
Local BigNum# = 0

For I = 0 To SENSORS_VIS_CNT - 1
If (pDists[I] > BigNum) Then
BigIndex = I
BigNum = pDists[I]
EndIf
Next

Return ((BigIndex / Float(SENSORS_VIS_CNT - 1)) - 0.5) * 2.0
End Function

Global EvadeStrength# = 0.0
Function GetEvadeAngle#(pDists#[SENSORS_VIS_CNT])
Local Wall = -1
Local WallDistance# = 100.0
For I = 0 To SENSORS_VIS_CNT - 1
If (pDists[I] < WallDistance) Then
Wall = I
WallDistance = pDists[I] - ROBOT_RADIUS
EndIf
Next

If Wall = -1
EvadeStrength = 0
Return SENSORS_PER_SIDE
EndIf

Local WallMatters# = Wall
WallMatters = WallMatters / (SENSORS_PER_SIDE * 2)
WallMatters = WallMatters - 0.5
WallMatters = WallMatters * 2.0
WallMatters = Abs(WallMatters)
WallMatters = Sin(WallMatters * 40)
WallMatters = 1.0 - WallMatters

Local WallInvDistance# = 1.0 - Max(Min(WallDistance / 0.7, 1.0), 0.0)

EvadeStrength = WallInvDistance * WallMatters

Return ((Wall / Float(SENSORS_VIS_CNT - 1)) - 0.5) * 2.0
End Function

Function Blend#(A#, B#, S#)
Local V# = A# * (1.0 - S#)
V = V + B * S
Return V
End Function

; Intelligenz des Autopilots
; pRobot ist der Roboter
; Ihr dürft nicht auf die Felder von pRobot zugreifen!
; pRobot wird lediglich verwendet als Parameter für die Funktionen
; GetV1, GetV2, AccelerateRobot und AccelerateRobotTo
; pDists ein Array mit den Distanzen der Sensoren
; Das Array ist SENSORS_VIS_CNT gross, resp 2 * SENSORS_PER_SIDE + 1
; Index 0 ist der Sensor, der ganz nach rechts zeigt
; Index SENSORS_PER_SIDE zeigt geradeaus
; Index SENSORS_VIS_CNT - 1 zeigt nach links
; Die Distanz ist in Einheiten angeben (1 Einheit = 1 Tile)
Function AutoPilotRobot(pRobot.TRobot, pDists#[SENSORS_VIS_CNT])
; Get Angle
Local AVec1#, AVec2#
Local Ang# = GetAngle(pDists)
AVec1 = (((Ang + 1.0) - 0.5) * 2.0) * MAX_VEL
AVec2 = (((2.0 - (Ang + 1.0)) - 0.5) * 2.0) * MAX_VEL

; Evasion
Local EVec1#, EVec2#
Local EAng# = GetEvadeAngle(pDists)
If EAng < 0 Then
EVec1 = MAX_VEL
EVec2 = -MAX_VEL
Else
EVec1 = -MAX_VEL
EVec2 = MAX_VEL
EndIf

Local Vec1#, Vec2#
Vec1 = Blend(AVec1, EVec1, EvadeStrength)
Vec2 = Blend(AVec2, EVec2, EvadeStrength)

AccelerateRobotTo(pRobot, Vec1, Vec2)
End Function
Warbseite
  • Zuletzt bearbeitet von Xaymar am Mo, Nov 13, 2017 1:09, insgesamt 3-mal bearbeitet

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMo, Nov 13, 2017 0:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo...
Mathe ist nicht gerade meine Stärke aber es geht auch so...

Code: [AUSKLAPPEN]
AIName = "Rallimens Autopilot"

Function AutoPilotRobot(pRobot.TRobot, pDists#[SENSORS_VIS_CNT])
   Links#= pDists[0]+pDists[1]+pDists[2]+pDists[3]+pDists[4]+pDists[5]+pDists[6]
   Mitte#=pDists[8]+pDists[9]+pDists[10]+pDists[11]
   rechts#=pDists[12]+pDists[13]+pDists[14]+pDists[15]+pDists[16]+pDists[17]+pDists[18]
   
   
   If Links# > 8
      AccelerateRobotTo(pRobot, 0.005,0.05)
         
   Else If rechts# > 8
      AccelerateRobotTo(pRobot, 0.05,0.005)
            
   Else If Mitte# > 0 Then
      If links < 2 Then
         If pDists[2] <  1Then    AccelerateRobotTo(pRobot, 0.05,0.02)
         AccelerateRobotTo(pRobot, 0.05, 0.01)
      Else If rechts < 2 Then
         If pDists[17] < 1 Then AccelerateRobotTo(pRobot, 0.02, 0.05)
         AccelerateRobotTo(pRobot, 0.01, 0.05)
      Else
         AccelerateRobotTo(pRobot, 0.05, 0.05)
      EndIf
   EndIf
End Function
[BB2D | BB3D | BB+]

count-doku

BeitragMo, Nov 13, 2017 9:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich kenne ja Thunders Code noch nicht, aber von der Beschreibung her, glaube ich fast,
dass Tunders, Xaymars Dummkopf und mein Bot ziemlich genau das selbe machen...

Aber Rallimens Ansatz sieht auch minimalistisch interessant aus.

Thunder

BeitragMo, Nov 13, 2017 13:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Mein Code ist da drinnen: https://www.blitzforum.de/upload/file.php?id=13322
Ist am ehesten mit dem von Rallimen zu vergleichen, finde ich.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

DAK

BeitragDi, Nov 14, 2017 17:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hach Mist... Kommt mal ein echt genialer MBCC und ich hab's verpasst -.-
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht Sonstiges Projekte

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group