>Wirtschaftl.Prozesse> für Spiele/KI interessant

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

>Wirtschaftl.Prozesse> für Spiele/KI interessant

Beitrag von Xaby »

Hallo Fans,

damit ich auch mal was gutes tu.
Hier meine Idee:

Die Wirtschaft bietet hier und da einige interessante Aufgaben, die ein bisschen kniffelig sind. Spiele haben natürlich auch ihren Reiz, aber hin und wieder mag ich die mathematische und logische Herausforderung.

Mein Vorschlag ist, dass wir hier einige CODE--Schnippsel (aber ausführbar) zusammentragen und damit ein spezialisiertes CODEARCHIVE schaffen.

Die Fachbereiche kann ja jeder selbst bestimmen. So haben wir dann auch das Publikum der Studentenscharr :D

Naja, wie auch immer. Hier mal ein Beispiel:

Wiki fragen: Johnson-Allgorithmus.

Code: Alles auswählen

Structure JA
  P.s  ; Bezeichnung des Autrags
  M1.l ; Zeit auf Erster Stufe
  M2.l ; Zeit auf Zweiter Stufe
  
EndStructure



Global Dim JAM.JA(1)
Global Dim SO.JA(1)
Global maxJAM.l

Procedure LoadList(F.s)
  Dim A.s(2)  
  If ReadFile(0,F)
    
  For i=0 To 2
    A(i) = ReadString(0)
    Debug A(i)
  Next 
  CloseFile(0)
  c=CountString(A(0),";")
  Debug c
  Redim JAM.JA(c)
  
  For i=1 To c
    JAM(i)\P=StringField(A(0),i,";")
    JAM(i)\M1=Val(StringField(A(1),i,";"))
    JAM(i)\M2=Val(StringField(A(2),i,";")) 
  Next 
  maxJAM=c
EndIf

EndProcedure

Procedure JAMToListGadget(Gad.l)
  T.s="M1 (t in s)"
  S.s="M2 (t in s)"
  For i=1 To maxJAM
    AddGadgetColumn(Gad,i,JAM(i)\P,30)
    T+Chr(10)+Str(JAM(i)\M1)
    S+Chr(10)+Str(JAM(i)\M2)
  Next
  ;RemoveGadgetColumn(Gad,0)
  Debug T
  Debug S
  AddGadgetItem(Gad,0,T)
  AddGadgetItem(Gad,1,S) 
  
  
EndProcedure


Procedure SOToListGadget(Gad.l)
  T.s="M1 (t in s)"
  S.s="M2 (t in s)"
  For i=1 To maxJAM
    AddGadgetColumn(Gad,i,SO(i)\P,30)
    T+Chr(10)+Str(SO(i)\M1)
    S+Chr(10)+Str(SO(i)\M2)
  Next
  ;RemoveGadgetColumn(Gad,0)
  Debug T
  Debug S
  AddGadgetItem(Gad,0,T)
  AddGadgetItem(Gad,1,S) 
  
  
EndProcedure



Procedure Johnson()
  Dim JAB.JA(maxJAM)
   
  Redim SO.JA(maxJAM)

  If maxJAM>1
  
  For i=1 To maxJAM ; Kopie erzeugen
    
    JAB(i)\P=JAM(i)\P
    JAB(i)\M1=JAM(i)\M1
    JAB(i)\M2=JAM(i)\M2
    
  Next  

  Q=-1
  
  PV=0
  PH=maxJAM+1
  
  Repeat
  
    Q+1 
    PX=0
    
    P1=1
    P2=1
    PB=1
    
    For i=2 To maxJAM-Q  
      If JAB(P1)\M1>JAB(i)\M1
        P1=i 
      EndIf
      If JAB(P2)\M2>JAB(i)\M2
        P2=i 
      EndIf
    Next
    
    If JAB(P1)\M1<JAB(P2)\M2
      PX=1
      PV+1 
      Debug "vorn"
    Else ; Wenn gleich groß egal
      PX=2
      PH-1
      Debug "hinten"
    EndIf
    
    If PX=1
      SO(PV)\P=JAB(P1)\P
      SO(PV)\M1=JAB(P1)\M1
      SO(PV)\M2=JAB(P1)\M2
      ;JAB(P1)\M1-1
      PB=P1
      
    ElseIf PX=2
      SO(PH)\P=JAB(P2)\P
      SO(PH)\M1=JAB(P2)\M1
      SO(PH)\M2=JAB(P2)\M2 
      ;JAB(P2)\M1-1
      PB=P2
      
    EndIf 
    
    For i=PB To maxJAM-Q-1
      Swap JAB(i)\P, JAB(i+1)\P
      Swap JAB(i)\M1, JAB(i+1)\M1
      Swap JAB(i)\M2, JAB(i+1)\M2
      
    Next
    
 Until Q+1=maxJAM

 EndIf
  
EndProcedure  



If OpenWindow(0,100,100,500,600,"# Folker Linstedt : Johnson-Algorithmus #")
  If CreateGadgetList(WindowID(0))
    ButtonGadget(0,10,10,100,20,"Tabelle laden")
    GadgetToolTip(0,"Tabelle laden")
    ButtonGadget(3,120,10,100,20,"Sortieren")
    GadgetToolTip(0,"Nach Johnson-Schema sortieren")
    
    ListIconGadget(1,10,40,480,60,"Auftrag",100,#PB_ListIcon_GridLines)
    ListIconGadget(2,10,120,480,60,"Aufatrag",100,#PB_ListIcon_GridLines) ;HeaderDrag ...
    
    
  EndIf
  
  
  
  Repeat
    Event=WaitWindowEvent()
    
    If Event=#PB_Event_Gadget
      GadgetNr=EventGadget()
      
      If GadgetNr=0
        LoadList(OpenFileRequester("Tabelle laden","Johnson.csv","*.csv",0))
        JAMToListGadget(1)
      
      EndIf
      
      If GadgetNr=3
        Johnson()
        SOToListGadget(2)
        
      EndIf    
      
      
    EndIf  
    
    
  Until Event=#PB_Event_CloseWindow
  
EndIf
Test: Johnson.csv

1;2;3;4;5;6;7;8;9;10;
5;9;7;9;4;3;5;10;6;8;
6;3;7;5;2;3;5;4;2;10;

>> Was noch anzufügen ist, wäre nun ein Gantt-Diagramm
und eine Erweiterung auch für 3 Maschinen.

Falls sich jemand mit dem Johnson-Algorithmus auskennt, bitte mal überprüfen, ob mein Programm richtig handelt.

>> Beispiele für andere Code-Schnippsel/kleinere Programme:

- Buchungssätze und T-Konten mit integriertem Rechner.
- Kostenrechnung
- Zinsrechnung, Abschreibungen ...
- Umrüstproblem
- Statistik ...
- Geometrie : Analysis, Vektoren (im Raum) ...
- Hausaufgabenheft (... :roll: ...)

Eine Art Sammlung für Schüler, Lehrer und Studenten.

Damit vielleicht PB auch mal in Schulen zur Anwendung kommt und dort beigebracht wird.

Könnt natürlich auch gleich schreiben, dass euch diese Idee missfällt. :cry:


Hoffe jemandem hilf der CODE.
Es geht sicherlich auch mit LinkedLists. Aber immer ruhig mit den Pferden.
Oder so ähnlich.

Gruß, Folker :allright:
Zuletzt geändert von Xaby am 09.04.2007 10:32, insgesamt 2-mal geändert.
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Interessant, ich hab aber leider keine Verwendung dafür.
Themenbezogene Codearchive find ich spitze, werde auch gleich mal schauen, ob ich nicht ein anderes eröffne.
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

yo supi, ein dutzend neue codearchive mit jeweils drei quellcodes, da kommt freude auf.

....bittet lieber André, spezifische neue Kapitel zum vorhandenen Codearchiv hinzuzufügen....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Ja, so schlimm wie du es schreibst, war es gar nicht gemeint.

Ich meinte es auch eher im groberen Sinne spezifisch.

Zum Beispiel:

- 2D - Spiele
- 3D - Spiele
- FensterAnwendungen

Und da vielleicht unterteilen:
- 2D: Jump'n'Run
- Strategie

aber das hätte auch wenig Sinn. Denn die meisten Dinge braucht man ja doch irgendwie immer.
Zum Beispiel Menu im Grafikmodus, Benutzer-Profilverwaltung, Netzwerk ...


Ich denke, es kann zu mindest nicht schaden, wenn es hier Beiträge gibt, die spezieller sind, aber dennoch einer breiten Masse eine Menge bringen.

So dass das Codearchive für Anfänger und Fortgeschrittene interessant ist, wird, bleibt ...

...

>> Übrigens ist mir grad was eingefallen.

Code: Alles auswählen

; (c) Folker Linstedt (xaby) 2007
; Erstellt am 08/09.04.2007

Structure JA
  P.s  ; Bezeichnung des Autrags
  M1.l ; Zeit auf Erster Stufe
  M2.l ; Zeit auf Zweiter Stufe
  
EndStructure

Global Dim JAM.JA(1)
Global maxJAM.l
Global SummeM1.l
Global SummeM2.l

Procedure LoadList(F.s)
  Dim A.s(2)  
  If ReadFile(0,F)
    
  For i=0 To 2
    A(i) = ReadString(0)
    Debug A(i)
  Next 
  CloseFile(0)
  c=CountString(A(0),";")
  Debug c
  Redim JAM.JA(c)
  
  For i=1 To c
    JAM(i)\P=StringField(A(0),i,";")
    JAM(i)\M1=Val(StringField(A(1),i,";"))
    JAM(i)\M2=Val(StringField(A(2),i,";")) 
  Next 
  maxJAM=c
EndIf

EndProcedure

Procedure JAMToListGadget(Gad.l)
  T.s="M1 (t in s)"
  S.s="M2 (t in s)"
  
  SummeM1=0
  SummeM2=0 
  
  For i=1 To maxJAM
    AddGadgetColumn(Gad,i,JAM(i)\P,30)
    T+Chr(10)+Str(JAM(i)\M1)
    S+Chr(10)+Str(JAM(i)\M2)
    SummeM1+JAM(i)\M1
    SummeM2+JAM(i)\M2
  Next
  ;RemoveGadgetColumn(Gad,0)
  Debug T
  Debug S
  AddGadgetItem(Gad,0,T)
  AddGadgetItem(Gad,1,S)  
  
EndProcedure


Procedure Johnson()
  Dim JAB.JA(maxJAM)
  Dim SO.JA(maxJAM)
   
  If maxJAM>1 
    
    
  For i=1 To maxJAM ; Kopie erzeugen
    
    JAB(i)\P=JAM(i)\P
    JAB(i)\M1=JAM(i)\M1
    JAB(i)\M2=JAM(i)\M2 
     
  Next  

  Q=-1
  
  PV=0
  PH=maxJAM+1
  
  Repeat
  
    Q+1 
    PX=0
    
    P1=1
    P2=1
    PB=1
    
    For i=2 To maxJAM-Q  
      If JAB(P1)\M1>JAB(i)\M1
        P1=i 
      EndIf
      If JAB(P2)\M2>JAB(i)\M2
        P2=i 
      EndIf
    Next
    
    If JAB(P1)\M1<JAB(P2)\M2
      PX=1
      PV+1 
      Debug "vorn"
    Else ; Wenn gleich groß egal
      PX=2
      PH-1
      Debug "hinten"
    EndIf
    
    If PX=1
      SO(PV)\P=JAB(P1)\P
      SO(PV)\M1=JAB(P1)\M1
      SO(PV)\M2=JAB(P1)\M2
      ;JAB(P1)\M1-1
      PB=P1
      
    ElseIf PX=2
      SO(PH)\P=JAB(P2)\P
      SO(PH)\M1=JAB(P2)\M1
      SO(PH)\M2=JAB(P2)\M2 
      ;JAB(P2)\M1-1
      PB=P2
      
    EndIf 
    
    For i=PB To maxJAM-Q-1
      Swap JAB(i)\P, JAB(i+1)\P
      Swap JAB(i)\M1, JAB(i+1)\M1
      Swap JAB(i)\M2, JAB(i+1)\M2
      
    Next
    
  Until Q+1=maxJAM
  
  For i=1 To maxJAM ; Kopie erzeugen ... doppelt, wirklich sinnvoll?
    
    JAM(i)\P=SO(i)\P
    JAM(i)\M1=SO(i)\M1
    JAM(i)\M2=SO(i)\M2
    
  Next  
  
  EndIf

EndProcedure  


Procedure GanttDiagramm(Gad.l)
  G2=100*Gad/10
  Raster=5
  Breite=(Raster+1)*(SummeM1+SummeM2)+30 ; BreitenErmittlung!
  
  CreateImage( G2,Breite,80)
  
  StartDrawing(ImageOutput(G2))
  Box(0,0,Breite,80,#White)
  ;Box(1,1,Breite-2,78,#White)
  Box(2,38,Breite-4,4,#Black)
  
  PA=0
  PE=0
   
  br1=0
  br2=0
  
  Wartezeit=0
  Stillstand=0
  Gesamtzeit=0
  
  Farbe=RGB(150,100,200)
  
  For i=0 To maxJAM
    If i<maxJAM
      br1=JAM(i+1)\M1
    EndIf
      
    If i>0
      br2=JAM(i)\M2
    EndIf  
       
    If br1>br2 ; PA+br1>PB+Q3 ... irgendwie so muss es sein ;-)
      
        PE=PA+br1
         
      Else  
        
        PE=PA+br2
         
      EndIf 
      
    If i<maxJAM  
      Box(PA*Raster ,10,br1*Raster ,25,0)
      Box(PA*Raster+1,11,br1*Raster-2,23,Farbe+20*Asc(Right(JAM(i+1)\P,1)))
    EndIf
    If i>0
      Box(PA*Raster,45,br2*Raster,25,0) 
      Box(PA*Raster+1,46,br2*Raster-2,23,Farbe+20*Asc(Right(JAM(i)\P,1)))
    EndIf
  
    PA=PE 
    
  Next 
   
  StopDrawing() 
   
  SetGadgetAttribute(Gad,#PB_ScrollArea_InnerWidth,Breite+10)
  OpenGadgetList(Gad.l)
  ImageGadget(G2,2,2,100,80,ImageID(G2))
  
  CloseGadgetList()
EndProcedure


If OpenWindow(0,100,100,500,550,"# Folker Linstedt : Johnson-Algorithmus #")
  If CreateGadgetList(WindowID(0))
    ButtonGadget(0,10,4,100,20,"Tabelle laden")
    GadgetToolTip(0,"Tabelle laden")
    ButtonGadget(3,120,4,100,20,"Sortieren")
    GadgetToolTip(3,"Nach Johnson-Schema sortieren")
    
    ListIconGadget(1,10,30,480,90,"Auftrag",97,#PB_ListIcon_GridLines)
    ListIconGadget(2,10,290,480,90,"Aufatrag",97,#PB_ListIcon_GridLines) ;HeaderDrag ...
    
    ButtonGadget(6,10,120,100,20,"Liste kopieren")
    GadgetToolTip(6,"unsortierte Liste in Zwischenablage kopieren")
    DisableGadget(6,1)
    
    ButtonGadget(7,10,260,100,20,"Bild kopieren")
    GadgetToolTip(7,"Bild des Gantt-Diagramms in Zwischenablage kopieren")
    DisableGadget(7,1)
    
    ButtonGadget(8,10,380,100,20,"Liste kopieren")
    GadgetToolTip(8,"sortierte Liste in Zwischenablage kopieren")
    DisableGadget(8,1)
    
    ButtonGadget(9,10,520,100,20,"Bild kopieren")
    GadgetToolTip(9,"Bild des Gantt-Diagramms in Zwischenablage kopieren")
    DisableGadget(9,1)
    
    ScrollAreaGadget(10,10,150,480,110,465,85,10,#PB_ScrollArea_Single)
    
    CloseGadgetList()
    SetGadgetColor(10, #PB_Gadget_BackColor,#White)
    ScrollAreaGadget(20,10,410,480,110,465,85,10,#PB_ScrollArea_Single)
    
    CloseGadgetList()
    SetGadgetColor(20, #PB_Gadget_BackColor, #White)
  EndIf
   
  
  Repeat
    Event=WaitWindowEvent()
    
    If Event=#PB_Event_Gadget
      GadgetNr=EventGadget()
      
      If GadgetNr=0
        LoadList(OpenFileRequester("Tabelle laden","Johnson.csv","*.csv",0))
        JAMToListGadget(1)
        GanttDiagramm(10) 
      EndIf
      
      If GadgetNr=3
        Johnson()
        JAMToListGadget(2)
        GanttDiagramm(20)
      EndIf
      
      
    EndIf 
    
  Until Event=#PB_Event_CloseWindow
  
EndIf
http://de.wikipedia.org/wiki/Johnson-Algorithmus

Versucht mal die Beispiel Tabelle aus Wiki:

A1;A2;A3;A4;A5;
14;12;7;13;11;
3;27;8;9;30;

Ihr könnt die Länge alle Balken vergleichen und werdet sehen, dass es mit Sortierung kürzer ist. :o

!!! Wozu braucht man das?

Jetzt kommt's! Stellt euch mal vor, ihr habt einige Einheiten wie Sammler, Reperaturwerkstättenfahrzeuge ... etc.
Und die müssen alle zu einem Sammelpunkt (Mineralienfeld, Schlachtfeld ...) und wieder zurück zur Basis.
Die Einheiten sind unterschiedlich schnell. Möglicherweise ist eine langsamer, wenn sie beladen ist und schneller, wenn sie leer ist.
Oder der Kämpfer kann schnell in die Schlacht, aber mit 90% Wahrscheinlichkeit humpelt er zurück ins Dorf ...

Die Frage ist natürlich, wie stark sowas bei einem ,,Echtzeit-Strategie,,-Spiel eine Rolle spielt ...

Aber zum Beispiel bei Spielen wie Jagged Alliance, Risiko oder Civilization.
Da kann es entscheidend für die Computer KI sein, welche Dinge sie zuerst tut. Natürlich in Betracht, dass alle Aufträge gleich wichtig sind, weil sie den gleichen Nutzen bringen.

Denn Zeit ist Geld. Bzw. Zugpunkte ... je nach dem, was ihr bei euren Spielen vergebt.

:roll:

>> Wo kann es noch nützlich sein?
Bei der Bildbearbeitung. 10 Bilder. Jedes der Bilder ist unterschiedlich groß und hat verschiedene Farben. Die Bearbeitungszeit wird Anfangs überschlagen. Statt unserer Zwei Maschinen haben wir zwei Threads.
In einem wird das Bild in der Größe angepasst und im nächsten dann die Farbe geändert (nur Beispiel).
Damit es möglichst wenig Zeit in Anspruch nimmt für alle 10 Bilder, wird optimal sortiert.

>> Oder aus Speichergründen kann man nur 2 Threads machen oder wegen sowieso nur zwei Kernen lohnt sich mehr nicht.
Jedes der Bilder hat andere Bearbeitungskriterien. Es läuft aber in einem Stapel. SW-Bilder machen dauert vielleicht weniger lang als Farbrauschen zu entfernen. Beide Prozesse können nicht auf ein Bild angewandt werden.

Die ganze Sache wird natürlich quatsch, wenn man eh ein lineares Programm hat und gleichzeitig nur eine "Maschine" laufen kann. :freak:


Könntet ihr euch vorstellen, dass es doch ganz nützlich ist, wenn man solche Dinge in ,,normale,, Programme einbaut, um mehr Performance zu erlangen, oder die KI ,,schlauer,, zu machen?
:allright:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

yo supi, ein dutzend neue codearchive mit jeweils drei quellcodes, da kommt freude auf.

....bittet lieber André, spezifische neue Kapitel zum vorhandenen Codearchiv hinzuzufügen....
Ich zumindest habe hierbei an einen Forumthread gedacht, an nicht mehr. Vorteile sind: André hat Themenspezifische-Codes gesammelt an einer Stelle, man kann aber trotzdem noch drüber diskutieren und Verbesserungen bringen.
Könntet ihr euch vorstellen, dass es doch ganz nützlich ist, wenn man solche Dinge in ,,normale,, Programme einbaut, um mehr Performance zu erlangen, oder die KI ,,schlauer,, zu machen?
Natürlich, nur hab ich wie gesagt, momentan keine Verwendung dafür. Ich hab eben bis jetzt keine nicht-lineare Anwendung.
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Antworten