Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Evolutionäres Programm für das Programmierspiel Core Wars

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Fiz



Anmeldungsdatum: 10.02.2010
Beiträge: 2
Wohnort: München

BeitragVerfasst am: 10.02.2010, 00:51    Titel: Evolutionäres Programm für das Programmierspiel Core Wars Antworten mit Zitat

Hi Leute,

ich bin neu hier und möchte hiermit mein erstes FreeBASIC Programm vorstellen welches ich für das Programmierspiel COREWAR geschrieben und veröffentlicht habe.

"Core War (in deutsch: Krieg der Kerne) ist ein Programmierspiel, bei dem zwei (oder mehr) Programme, die in einer simplen, assemblerartigen Sprache namens Redcode geschrieben sind, im selben Speicherraum gegeneinander antreten. Gewinner ist das Programm, das sein gegnerisches Programm (oder Programme) überlebt."

Mein FreeBASIC Programm Maezumo generiert diese in Redcode geschriebene "Krieger" genannten Programme und lässt sie in einer Arena (dem virtuellen Arbeitspeicher MARS) gegeneinander antreten. Nur die besten Programme überleben in der Liga, dem sogenannten "Hill". Evolution erfolgt u.a. durch Mutation der erfolgreichsten Krieger auf dem Hill.

Das Programm ist wohl zu groß um es hier rein zu posten. Ihr findet eine zip-Daitei mit dem Source-Code inklusive einer für Windows Compilierten exe-Datei hier:

http://www.corewar.info/maezumo/

Maezumo ist nach dem entpacken der zip-Datei praktisch "Ready-to-Use". Ein FAQ ist enthalten.

Eine experimentelle Linux Version gibt es von Terry Newton hier:

http://www.infionline.net/~wtnewton/corewar/evol/index.html#Maezumo

Falls ihr mehr über Corewar wissen wollt schaut euch einfach mal das Corewar Handbuch als pdf von Sascha Zapf an:

http://www.mynetcologne.de/~nc-zapfsa/

oder klickt euch einfach durch meine Homepage:

http://www.corewar.info/

Über Feedback würde ich mich sehr freuen.

Christian
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 10.02.2010, 15:08    Titel: Antworten mit Zitat

Nur ein Kommentar zum Code bzw. ein paar Tipps wie es an einigen Stellen einfacher zu machen ist.
Code:
   IF LEFT(ReadOut,12)="name       :" THEN WarriorSeed=Right(ReadOut,Len(ReadOut)-12)
   IF LEFT(ReadOut,12)="evo rounds :" THEN BattleEvoRounds=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="hill rounds:" THEN BattleRounds=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="threshold  :" THEN BattleThreshold=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="advance    :" THEN BattleAdvance=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="spl        :" THEN ProbSpl=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="mov        :" THEN ProbMov=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="add        :" THEN ProbAdd=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="sne        :" THEN ProbSne=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="seq        :" THEN ProbSeq=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="djn        :" THEN ProbDjn=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="jmn        :" THEN ProbJmn=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="jmz        :" THEN ProbJmz=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="jmp        :" THEN ProbJmp=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="hill freeze:" THEN HillFreeze=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="No of koth :" THEN KothNumber=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="Mutation   :" THEN EnableMutation=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="MutSelect  :" THEN MutationSelect=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="MinChanges :" THEN MinChanges=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="MutRate    :" THEN MutationRate=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="InstrRate  :" THEN InstrRate=Val(Right(ReadOut,Len(ReadOut)-12))*MutationRate
   IF LEFT(ReadOut,12)="AddrRate   :" THEN AddrRate=Val(Right(ReadOut,Len(ReadOut)-12))*MutationRate
   IF LEFT(ReadOut,12)="DataRate   :" THEN DataRate=Val(Right(ReadOut,Len(ReadOut)-12))*MutationRate
   IF LEFT(ReadOut,12)="InsertRate :" THEN InsertRate=Val(Right(ReadOut,Len(ReadOut)-12))*MutationRate
   IF LEFT(ReadOut,12)="DeleteRate :" THEN DeleteRate=Val(Right(ReadOut,Len(ReadOut)-12))*MutationRate
   IF LEFT(ReadOut,12)="DupLine    :" THEN DupLineChance=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="IncDec     :" THEN IncDecChance=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="BigNum     :" THEN BigNumChance=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="MutByProb  :" THEN MutateByProbability=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="dat        :" THEN ProbDat=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="SoupIter   :" THEN SoupIterations=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="SaveSoup   :" THEN SaveSoup=Val(Right(ReadOut,Len(ReadOut)-12))
   IF LEFT(ReadOut,12)="ShowExtra  :" THEN ShowExtra=Val(Right(ReadOut,Len(ReadOut)-12))  '1.01e1
   IF LEFT(ReadOut,12)="SoupRounds :" THEN SoupRounds=Val(Right(ReadOut,Len(ReadOut)-12)) '1.01e1
   IF LEFT(ReadOut,12)="EnableSeed :" THEN EnableSeed=Val(Right(ReadOut,Len(ReadOut)-12)) '1.02x3
   IF LEFT(ReadOut,12)="SoupDisplay:" THEN SoupDisplay=Val(Right(ReadOut,Len(ReadOut)-12)) '1.02x3
   IF LEFT(ReadOut,12)="SwapRate   :" THEN SwapRate=Val(Right(ReadOut,Len(ReadOut)-12))*MutationRate '1.02x3
   IF LEFT(ReadOut,12)="SW Display :" THEN EnableSW=Val(Right(ReadOut,Len(ReadOut)-12))    '1.02x4
   IF LEFT(ReadOut,12)="SDcustom   :" THEN SDcustom=Right(ReadOut,Len(ReadOut)-12)         '1.03x5
   IF LEFT(ReadOut,12)="SoupWins   :" THEN SoupWins=Val(Right(ReadOut,Len(ReadOut)-12))    '1.02x6
   IF LEFT(ReadOut,12)="hint-pur   :" THEN HintProb (0)=Val(Right(ReadOut,Len(ReadOut)-12))'1.04cs
   IF LEFT(ReadOut,12)="hint-pap   :" THEN HintProb (1)=Val(Right(ReadOut,Len(ReadOut)-12))'1.04cs
   IF LEFT(ReadOut,12)="hint-sca   :" THEN HintProb (2)=Val(Right(ReadOut,Len(ReadOut)-12))'1.04cs
   IF LEFT(ReadOut,12)="hint-fra   :" THEN HintProb (3)=Val(Right(ReadOut,Len(ReadOut)-12))'1.04cs
   IF LEFT(ReadOut,12)="hint-sto   :" THEN HintProb (4)=Val(Right(ReadOut,Len(ReadOut)-12))'1.04cs

Select Case ... End Select würde hier denke ich den Code spürbar aufräumen. Und ein Makro, dass einen Case-Zweig erzeugt.

Code:
If IniHintMode = 7 Then
   CounterA=Int(Rnd*(HintProb (0)+HintProb (1)+HintProb (2)+HintProb (3)+HintProb (4)))
   CounterB=HintProb (0)+HintProb (1)+HintProb (2)+HintProb (3)+HintProb (4)
   If CounterA<=HintProb (0) Then HintMode =0 'pure
   If CounterA>HintProb (0) And CounterA<=(HintProb (0)+HintProb (1)) Then HintMode =1 'paper
   If CounterA>(HintProb (0)+HintProb (1)) And CounterA<=(HintProb (0)+HintProb (1)+HintProb (2)) Then HintMode =2 'scanner
   If CounterA>(HintProb (0)+HintProb (1)+HintProb (2)) And CounterA<=(CounterB-HintProb (4)) Then HintMode =3 'fragment
   If CounterA>(CounterB-HintProb (4)) Then HintMode =4 'stone
EndIf

Hier würden Leerzeichen zwischen den Operatoren und den jeweiligen Argument und ein paar Zeilenumbrüche über einen Unterstrich den Code auch besser lesbarer machen.

Code:
Dim WarriorFile (1 to 1000) as string
Dim WarriorName (1 to 1000) as string
Dim WarriorAuthor (1 to 1000) as string
Dim WarriorType (1 to 1000) as string
Dim WarriorResult (1 to 1000) as Integer
Dim WarriorScoring(1 to 1000) As Single

Eine Liste würde diesen Dienst (denke) ich einfacher machen. Sowas wie einen STL Vector oder eine STL Liste wird es auch sicher für Freebasic geben.

Code:
Dim PathSym As String  '1.01e1 - all usages of PathSym and UseWin
PathSym = "/" : If UseWin Then PathSym = "\"

Einfacher für den Benutzer:
Code:
#ifdef __FB_WIN32__
#define PathSym  "\"
#else
#define PathSym "/"
#endif


Der Code hat auch keine Funktionen oder Makros, alle Variablen sind daher implizit als global deklariert.

Zum Programm kann ich nichts sagen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fiz



Anmeldungsdatum: 10.02.2010
Beiträge: 2
Wohnort: München

BeitragVerfasst am: 12.02.2010, 18:30    Titel: Antworten mit Zitat

Hey cool!!!

Vielen Dank für die Tipps. Werde die im nächsten Release mit einbauen.

Grüße,

Christian
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz