Beiträge von Mars

    Vor Jahren hieß es mal, dass Windows 10 ARM auf zahlreichen Geräten installierbar ist. Habe eben mal gegoogelt: Sieht nicht so aus als könnte man das "einfach so" installieren. Habe eigentlich erwartet, dass inzwischen geht, scheint aber nicht so zu sein :|

    Andy : Danke, ich dachte schon bei mir spinnt etwas. Dachte eigentlich ich hätte 6 Kerne und nur einen Browser nebenbei offen (ohne Videoplayback) und <5% cpu Last während dem Test, da war ich irgendwie in der Annahme, dass das Skript einen eigenen Kern bekommt und dementsprechend immer gleichschnell abläuft... Hatte (mit Last auf der CPU) jetzt auch Durchläufe die mehr als 10x länger gebraucht haben (Da stand dann nicht mehr 5000ns, sondern 50000ns...)


    Dann schätze ich, dass der Thread abgehandelt ist. Fazit: AutoIt verlangsamt ne nach Zustand des restlichen PCs willkürlich ausgewählte Funktionen um willkürliche Faktoren.


    Oscar: Auch hier vielen Dank, die Version ist für meinen Anwendungsfall sogar noch besser, da die Daten bereits vorab in einer Struct liegen und damit der SetData Schritt entfällt :thumbup:

    Ja, das sind die Ergebnisse, die ich bei mir auch erwartet hätte (Racer, Musashi, Bitnugger). Also, dass BitShift & BitAnd immer am schnellsten sind. Aus irgendwelchen Gründen ist BitShift + BitAnd bei mir (wenn man die Schleife auskommentiert) mit einer gewissen Wahrscheinlichkeit (klappt nicht immer, aber oft... 50% chance auf das "schlechte" Ergebnis) wesentlich langsamer als es sein sollte. Die Operationen werden mehrere zehntausendmal ausgeführt, beste/schlechteste Ergebnisse werden verworfen und das "gemittelte Drittel in der Mitte" ergibt das Timingergebnis. Stochastische Aussetzer sind damit mehr oder weniger ausgeschlossen.

    Dann steht es jetzt 3:1 dafür, dass mein PC seltsam ist ^^

    Moin,


    Im Zuge von Optimierungen (ja... aus irgendwelchen Gründen macht es mir Spaß AutoIt für Sachen zu verwenden für die es nicht geeignet ist) habe ich mal wieder ein paar Zeiten gestoppt.


    Beim Timing kommen aber aus irgendwelchen Gründen sehr verschiedene Ergebnisse heraus (ich öffne kein Windows Fenster/Msgbox, es ist also nicht der Skriptverlangsamungsbug der damit zusammenhängt).


    Diese beiden Ergebnisse tauchen beide bei mir reproduzierbar (mit einer gewissen Chance) auf.

    Ergebnis 1: Wenn ich im Skript Zeile 82 und 84 auskommentiere taucht vermehrt Ergebnis 1 auf.
    Ergebnis 2: Wenn ich im Skript Zeile 82 und 84 einkommentiere taucht vermehrt Ergebnis 2 auf.

    (Obwohl diese Zeilen (also eine For-Schleife von 0 bis 0) ansich keinen Einfluss haben sollten)


    Der Unterschied ist hier die Ausführungsgeschwindigkeit von BitOperationen, die brauchen plötzlich 2-3x so lange. Alle anderen Operationen laufen ähnlich schnell ab.


    Entweder sehe ich meinen offensichtlichen Fehler nicht, oder da ist irgendwas im Gange was ich nicht verstehe...

    Deshalb möchte ich in die Runde fragen ob dasselbe Verhalten noch bei anderen Leuten auftritt.



    PS: Ich verwende AutoIt Version 3.3.14.5, habe noch keine anderen Versionen getestet.

    lg

    M

    Ja ich hab auch biontech bekommen. Wirklich anmelden musste ich mich auch nicht (also nicht besonders lange vorher). Habe einfach beim Hausarzt gesagt: Ich hab bock. Und 2 Tage später hatte ich den ersten Termin. Also vollkommen problemlos ohne alles.


    Windows 11 ist auch witzig, weil mein PC angeblich die Anforderungen nicht unterstützt (dabei ist er wirklich gut). Deshalb lasse ich das jetzt auch erstmal ruhen^^

    Habe das hier garnicht geschrieben, aber inzwischen (seit 1 Monat) bin ich 2x geimpft.

    Ich hatte das mit mir selbst so ausgemacht, dass ich mich impfen lasse, sollten die Fallzahlen nach dem Juli (wo sie am Tiefpunkt waren) wieder sehr stark ansteigen. Weil ich davon ausgegangen bin, wenn ja so viele leute geimpft sind, vielleicht steigt die Fallzahl "nicht" wieder an. War aber nicht so. Und im Endeffekt war es mir zu blöd und ich habs einfach gemacht...^^

    Guten Tag,


    ich weiß, dass dieses Thema inzwischen fast eine Dekade alt ist, aber da ich durch Zufall beim Basteln wieder auf diese UDF gestoßen bin dachte ich: vielleicht gibt es ja eine neuere Version (neuer als 05.10.14), die ihren Weg in die Öffentlichkeit nur nicht gefunden hat. Insgesamt ist die UDF schon ziemlich nützlich, ein paar Sachen wurden aber noch nicht gewrappt die man ansich schon braucht (z.B. für Lines: StartCap, EndCap, LineJoin etc. Wenn man will, dass etwas "gut" aussieht kann man nicht immer mit flach abgeschnittenen Linien arbeiten). Ich bin recht zuversichtlich, dass ich die fehlenden Funktionen auch selbst wrappen kann (würde versuchen dem Stil von eukalyptus treu zu bleiben und das dann hier posten, falls mich die Arbeitswut überkommt... erwartet da lieber nicht zu viel^^), falls es dahingehend noch nichts gibt.

    Edit: Habe mit meinem Beispiel genau ins Schwarze getroffen. LineJoin, und Caps sind in der UDF schon drin, habe sie nur übersehen, weil keine einzige StrokeStyle.Methode gewrappt wurde (wobei das auch alles nur "getter" sind) :D


    lg

    Mars

    Der funktioniert nicht, weil $aFormations ein Array vom Typ [2][n] ist. Stattdessen möchtest du wahrscheinlich ein Array vom Typ [n] verwenden. Dafür muss aus dem $aFormations = [[ ... ], [ ... ]] ein [ ... ] werden. Also müsstest du die Arrays in Arrays nochmal kapseln.


    Damit ist $aFormations ein 1D Array welches je Element eine Formation enthält.
    Eine Formation ist ein 1D Array welches Positionen enthält.
    Eine Position ist ein 1D Array welches die Positionsdaten (Name + Kanten) enthält.

    AutoIt hat leider keine Methode um ein Array aus Arrays zu definieren. Wenn man die [[1,2], [3]] Syntax verwendet wird automatisch ein 2x2 Array erstellt, wobei Array[1][1] leer ist. Was man eigentlich will ist ein Array der Länge 2, welches ein Array der Länge 2 und ein Array der Länge 1 enthält.


    Der Trick über eine Funktion ist leider performancetechnisch ziemlich langsam, da hier zuerst ein viel zu großes Array erstellt wird, welches zu allem Überfluss auch noch bis zum Ende hin gefüllt wird. Zusammen mit dem Overhead durch Funktionsaufruf und ReDim ist das ziemlich lahm... Sowas sollte man also eigentlich nicht in Inner-Loops verwenden (sagte er, und verwendet es in 11 Fach verschachtelten For-Schleifen).


    Der Zugriff auf ein Array im Array ist sehr performant, wenn man ByRef auf das Element zugreift. Arrays werden bei Zuweisung mittels Gleichzeichen (in AutoIt) kopiert, hier muss man also etwas vorsichtig sein und schauen auf welchen Daten man eigentlich gerade arbeitet (Original, oder Kopie).


    Man kann ganz billig "alle" Positionen ablaufen. Eine rekursive Version davon ist z.B:

    Hier werden jetzt "alle" Kombinationen durchlaufen. Da der Torwart IMMER Position 0 hat (und auch sonst nirgends spielt) lassen wir den aus der Permutation heraus, sodass es nur noch 10! tatsächlich relevante Kombinationen gibt. Davon sind aber die allermeisten ungültig (da nicht jeder Spieler überall spielen kann).

    Weil ich neugierig war ob der "ich nehme einfach unmengen For-Loops und lehne mich zurück" Ansatz klappt habe ich es kurz implementiert... Entweder ist da was falsch, oder es gibt wesentlich weniger gültige Permutationen als ich gedacht habe... Bei so viel Zahlensalat habe ich mich bestimmt irgendwo vertippt ^^


    Das was du aufgeschrieben hast ist im Prinzip eine kondensierte Version der Matrix mit einer festen Breite von 5 + Zusatzinformationen. Ich habe einfach aus Gewohnheit eine volle Matrix vorgeschlagen, das ist hier wahrscheinlich nicht unbedingt besser...


    Wenn du schon mit Knoten und Kanten loslegen willst: Nachbarschaftsbasierte Suchalgorithmen in ungerichteten Graphen (das ist dein Stichwort :D )

    Dazu gibt es wunderbare Literatur (PS: ich hatte in dem Fach nur eine 3.... 8) ). Ein "Knoten" ist hier eine "Zulässige Lösung", also z.B. eine Liste mit 11 Spielern. Ein "Nachbar" ist eine Zulässige Lösung bei der eine kleine Variation vorgenommen wurde (z.B. 2 Spieler vertauscht). Ein Suchalgorithmus schaut sich jetzt die "Kosten" (das ist die Evaluationsfunktion/Zielfunktion um zu bewerten wie "gut" dein Team ist) im Graphen für den eigenen Knoten (irgendein Startknoten, z.B. eine zufällig zusammengewürfelte, aber zulässige Liste von 11 Spielern), sowie die benachbarten Knoten an und geht dann einen Schritt in eine "vielversprechende" Richtung (z.B. immer zum "besten" Nachbarn, oder zufallsbasiert mit 50% chance zum "besten", mit 25% zum 2t "besten", mit 12,5% zum 3t... usw.).

    Easy :part:

    Das Sieht für mich nach einem klassischen Optimierungsproblem aus.


    Habe (für genau dieses Problem) jetzt nichts programmiert, ich kann aber kurz beschreiben wie man es macht.


    Benötigte Variable:

    $InternerZustand[11][...] = Aktuelle Konstellation deiner Spieler (z.B. in einem [11][...] Array)

    $BesterInternerZustand[2] = [0] -> Zwischenspeichern des bisher besten berechneten internen Zustands, [1] -> Wert der Zielfunktion für diesen Zustand.

    $LetzteAenderung[2][2] (für 2 Spieler hier Beispielhaft)

    [0][0] Position(Index) von SpielerX in InternerZustand VOR der Variation

    [0][1] Position(Index) von SpielerX in InternerZustand NACH der Variation

    [1][0] Position(Index) von SpielerY in InternerZustand VOR der Variation

    [1][1] Position(Index) von SpielerY in InternerZustand NACH der Variation


    Benötigte Funktionen:

    Funktion zur Evaluation des (kompletten) internen Zustands zu einem einzigen int oder float Wert, der sich vergleichen lässt. Eine Konstellation mit dem Wert 5.6123 ist schlechter als eine Konstellation mit dem Wert 7.6543. Die Zielfunktion zu finden ist bei vielen Optimierungsproblemen der härteste Teil, ich glaube das geht hier aber recht einfach. Als Hilfmittel (zur Kantenbeschreibung) ist hier eine 11x11 Matrix geeignet an deren Stelle überall eine 1 steht wo eine Kante existiert und eine 0, wenn keine Kante vorhanden ist. (z.B. es gibt eine Kante zwischen [0] und [4], dann ist in der Matrix bei [0][4] eine 1).

    Funktion zur Variation des internen Zustands. z.B. 2er Vertauschung (Nimm 2 zufällige Spieler, tausche ihren Platz), oder 3er Vertauschung (Nimm 3 zufällige Spieler, verteile sie Zufällig)


    Jetzt machst du folgendes:

    Starte mit "irgendeiner" gültigen Konstellation (Fachjargon: Gültige Lösung), am besten verteilt man die Spieler Zufällig, sodass bei jedem Funktionaufruf ein anderer Startwert vorliegt.

    Berechne die Zielfunktion (Evaluation, hier kommt z.B. 3.123 heraus)

    Speichere diese Konstellation + Wert der Zuelfunktion in BesterInternerZustand.


    Loop

    Variiere (z.B. 2er oder 3er Vertauschung) den Internen Zustand EIN Mal.

    Denke daran die Änderung zu speichern, also wo waren die beiden Spieler vorher, wo sind sie jetzt?

    Berechne die Zielfunktion

    Schaue ob der Wert der Zielfunktion besser ist als der "beste" Wert

    Wenn ja -> Speichere Aktuellen InternenZustand und Wert der Zielfunktion in BesterInternerZustand

    Wenn nö -> Mache die Änderung rückgängig

    Abbruchkriterium

    EndLoop


    Als Abbruchkriterium kann man z.B. einen Zähler einbauen: Wenn sich nach z.B. 500 Schritten nichts mehr verbessert hat ist man fertig.


    Das Entspricht jetzt einer Nachbarschaftssuche "ohne Tricks".


    Warum ist ggf eine 3er Kombination auch sinnvoll?

    Das ist jetzt nur ein Erfahrungswert: Manchmal fressen sich "zu kleine" Variationen fest und eine tatsächliche Verbesserung kann nicht mehr erzielt werden, wenn nur "ein wenig" variiert wird. Dafür gibt es verschiedene Lösungsansätze:

    - Größere Variation zulassen (das wäre jetzt z.B. die 3er Vertauschung)

    - Mehrere Variationen in Folge anwenden (z.B. 2, 3, viele Vertauschungen und erst danach auf die Zielfunktion schauen)

    - Kleine Verschlechterungen zulassen (wird die Zielfunktion nur "etwas" schlechter? Dann kann man ggf trotzdem auf diesem Weg laufen)

    - etc.


    Ich würde das wie oben beschrieben programmieren und dann z.B. 500 Instanzen Laufen lassen. (also die Optimierung als Ganzes 500x mit zufälligen Startwerten durchführen) und das beste Ergebnis davon verwenden.


    Da 11 Fakultät "nur" 40Mio sind kann man das auch mit BruteForce lösen. Das wird in AutoIt vielleicht ziemlich langsam, wenn du aber noch andere Sprachen draufhast (z.B. Java (argh), C, C++, etc) müsste das eine Sache von Sekunden sein bis man das gebruteforced hat.


    Edit: Das ist ne super (teil) Hausaufgabe für neue Info-Studenten. Das merk ich mir... hehehe :D

    lg

    Mars

    Sehr interessanter "erster" Beitrag in einem Programmierer Hilfe & Support Forum. :D

    Back to Topic:
    Irgendwann im laufe des letzten Jahres kam Genshin Impact heraus. Das sah nicht nur gut aus, sondern spielte sich auch gut. Es ist allerdings "kein" Onlinespiel, es gibt einen Multiplayer, der ist aber eher rudimentär und nicht auf Masse (hunderte andere Spieler), sondern auf eine sehr kleine Auswahl (Spieler betreten deine Welt auf Anfrage, man ist also üblicherweise zu 2t unterwegs) ausgelegt.

    Wenn die Namensgebung nur so einfach wäre wie bei wissenschaftlichen Abschlussarbeiten: "Exponentiallogarithmische Schreibweise zur Erfassung von Zahlen außerhalb des Double Wertebereichs". Mit dem Namen liest zwar keiner deine Bachelorarbeit, aber der Prof ist glücklich :D

    Moin,


    Anbei ist eine UDF die intern mit folgender Schreibweise Arbeitet: 1e10.994604967679 statt 9.8765432e10. Die "Zahl" wird als als Logarithmus zur Basis 10 gespeichert. Die eigentliche Zahl ergibt sich damit zu Sign * 10 ^ Double. Mit dieser Schreibweise lassen sich relativ große (1e99999 z.B.) und auch sehr kleine Zahlen gut darstellen. Für exakte Ergebnisse ist diese Methode natürlich ungeeignet, da ist es besser mit BigInt oder BigNum zu rechnen, aber wenn die Genauigkeit "nur so pi mal 7 Nachkommastellen" stimmen muss, dann findet man hier vielleicht was man sucht.


    Ich habe die UDF vorerst "ENumber" getauft (wollte eigentlich BigNum, aber das gibt es ja schon ^^), oder LogNum (aber das klang irgendwie doof). Also ist es jetzt ENum (E = exponential), damit ist der Name wenigstens "fast" richtig.


    In der UDF sind einige Rechenmethoden (+ - * / ^ etc) enthalten. Fortschreitendes wie Fakultät, Binomialkoeffizient, uvm. habe ich aber noch nicht angefasst, da mir das auch zu viel Arbeit ist "alle" Anwendungsfälle ausgiebig zu testen. Ich habe versucht möglichst alle exeptions (und sowas wie "positive 0 und negative 0") 1 zu 1 nachzubilden um den in AutoIt üblichen Rechenregeln zu entsprechen. Ein paar Funktionen arbeiten dennoch anders, z.B. rational power(x, y) = x^y. AutoIt schummelt hier und nimmt y einfach als Integer, wenn es "nah genug" an einem Integer liegt, damit kann man auch negative Zahlen potenzieren, was diese UDF aber nicht kann.


    Wenn jemand Funktionen beisteuern, testen, die UDF nutzen, (z.B. um ein Incremental-Idle-Game zu basteln wo es wahnsinnig riesige Zahlen gibt), Änderungen vornehmen, etc. will. Immer her damit, ich bin für jede Kritik und jeden Verbesserungsvorschlag offen.


    lg

    M

    Die Sprache ist derzeit kräftig am degenerieren. Da ich hauptsächlich mit Leuten aus der Uni zu tun habe ist das für mich kaum bemerkbar, aber sobald man dieses Millieu verlässt fragt man sich was hier überhaupt gerade passiert. Das Gendern ist bei uns (TU-Darmstadt) zum Glück noch nicht allgegenwärtig, in offiziellen Schreiben von "Oben" aber bereits vorhanden. Was ich bei dem ganzen Kram nicht verstehe ist: Frauen fühlen sich angeblich von der neutralen Ansprache "Student", "Arbeiter", "Ingenieur" etc. nicht angesprochen, Männer sollen sich aber von "Student*in" oder von "StudentIn" angesprochen fühlen? Damit verschiebt man das "Problem" doch nur auf die andere Seite, anstatt es zu lösen?


    Mal abgesehen davon, dass kaum jemand noch (anständiges) Deutsch spricht^^ Wenn man im Zug sitzt und hört was da gesprochen wird versteht man kein Wort.

    Der Trick sind Arrays. Du hast unmengen an redundanten Daten in deinem Programmcode. Immer wenn ein Ablauf nur von verschiedenen Daten, aber nicht von verschiedener "Struktur" abhängt, kann man Arrays nutzen. (z.B. du hast ein Label und willst dort 10 verschiedene Strings anzeigen lassen je nachdem was man anklickt. Dann speicherst du diese 10 Strings in einer Liste und benutzt z.B. Liste[0] um den ersten String zu bekommen).


    Trick Nummer 2 sind MEHR ARRAYS :D

    Wenn du einen Datensatz hast (bestehend aus Titel, OS, CPU, GPU, ... etc) ist dieser ein Array. Wenn du viele Datensätze hast, ist das ein Array welches Arrays enthält.


    Trick Nummer 3: Generalisierung im Allgemeinen

    Immer wenn man in der Programmierung eine Anzahl Probleme (z.B. der große ElseIf Teil, oder eine eigene Funktion für jedes Spiel LOL(), GTA(), ...()) hat, die sich sehr ähnlich sind, versucht man einen Schritt zurückzutreten und "alle" Probleme dieses Typs gleichzeitig zu lösen. Was passiert, wenn du ein Spiel hinzufügen willst? Im Optimalfall ergänzt du in einer Liste ein paar Zeilen und fertig, aber du möchtest keine neuen Funktionen schreiben, keine neuen GUIs erstellen, keine neuen Ctrls erstellen, etc.


    Das klingt jetzt als würde ich dich angreifen, will ich aber wirklich nicht. Das sind alles Tips :thumbup:

    Man wächst an seinen Aufgaben, und einfache Programme sind super geeignet um etwas zu lernen ;)

    Anbei gibt es auch gleich ein Grundgerüst für "eine" Lösung des Problems (es gibt immer sehr viele verschiedene richtige Wege ein Problem zu lösen, hier wird nur "einer" gezeigt. Jeder hat einen eigenen Programmierstil). Das UserInterface (GUI) ist selbstverständlich nicht ausgereift, ich habe auch nicht alle Spiele hinzugefügt und der Text der angezeigt wird ist nicht schön formatiert, vielleicht sind auch noch Bugs drin, habe das jetzt nicht 5 Stunden getestet. Das sind alles Sachen an denen du dich austoben kannst 8o


    lg

    M

    1. Was willst du machen?

    2. Welche Hardware ist dafür geeignet?

    3. Welche Sprache benötige ich zur Programmierung?


    zu 2. Wenn eine Antwort Arduino ist: Dafür gibt es so viele Tutorials und eine unfassbar einfache (aber primitive) IDE (Damit kann man nichts falsch machen (und auch nichts richtig), das hier hätte ich anders formulieren müssen :D), dass du hier mit an Sicherheit grenzender Wahrscheinlichkeit besser aufgehoben bist als bei AutoIt, denn AutoIt ist primär zur Automatisierung von auf Windows laufenden Programmen geplant gewesen. Natürlich hat die Zeit und die vielen UDFs diese Sprache zu etwas ganz anderem werden lassen, aber das Verhalten eines Arduino mit AutoIt via Windows auf einem PI zu realisieren ist wesentlich komplizierter als direkt einen Arduino zu nutzen.

    Also beantworte wenigstens die erste der 3 Fragen, damit kann man schonmal mehr anfangen als mit 0 Antworten.