Kajetan Johannes Hammerle 3 years ago
commit
6a27c0fbd4
3 changed files with 109 additions and 0 deletions
  1. 1 0
      .gitignore
  2. 103 0
      Main.c
  3. 5 0
      Makefile

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+magic

+ 103 - 0
Main.c

@@ -0,0 +1,103 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define SIZE 9
+#define SUM ((SIZE * (SIZE * SIZE + 1)) / 2)
+
+int data[SIZE][SIZE];
+
+void init() {
+    for(int x = 0; x < SIZE; x++) {
+        for(int y = 0; y < SIZE; y++) {
+            data[x][y] = y * SIZE + x + 1;
+        }
+    }
+}
+
+int errorFactor(int e) {
+    return e * e;
+}
+
+int getFitness() {
+    int fitness = 0;
+    for(int y = 0; y < SIZE; y++) {
+        int sum = 0;
+        for(int x = 0; x < SIZE; x++) {
+            sum += data[x][y];
+        }
+        fitness += errorFactor(sum - SUM);
+    }
+    for(int x = 0; x < SIZE; x++) {
+        int sum = 0;
+        for(int y = 0; y < SIZE; y++) {
+            sum += data[x][y];
+        }
+        fitness += errorFactor(sum - SUM);
+    }
+    int diaA = 0;
+    int diaB = 0;
+    for(int i = 0; i < SIZE; i++) {
+        diaA += data[i][i];
+        diaB += data[i][(SIZE - 1) - i];
+    }
+    fitness += errorFactor(diaA - SUM);
+    fitness += errorFactor(diaB - SUM);
+    return fitness;
+}
+
+void print() {
+    printf("Fitness: %d\n", getFitness());
+    for(int y = 0; y < SIZE; y++) {
+        for(int x = 0; x < SIZE; x++) {
+            printf("%2d ", data[x][y]);
+        }
+        putchar('\n');
+    }
+    putchar('\n');
+}
+
+void swap(int x1, int y1, int x2, int y2) {
+    int tmp = data[x1][y1];
+    data[x1][y1] = data[x2][y2];
+    data[x2][y2] = tmp;
+}
+
+void randSwap() {
+    swap(rand() % SIZE, rand() % SIZE, rand() % SIZE, rand() % SIZE);
+}
+
+void randSwaps(int swaps) {
+    for(int i = 0; i < swaps; i++) {
+        swap(rand() % SIZE, rand() % SIZE, rand() % SIZE, rand() % SIZE);
+    }
+}
+
+int main() {
+    init();
+    for(int k = 0; k < 2000; k++) {
+        for(int i = 0; i < 1000000; i++) {
+            int oldFitness = getFitness();
+
+            int x1 = rand() % SIZE;
+            int y1 = rand() % SIZE;
+            int x2 = rand() % SIZE;
+            int y2 = rand() % SIZE;
+
+            swap(x1, y1, x2, y2);
+
+            int newFitness = getFitness();
+            if(newFitness == 0) {
+                break;
+            }
+
+            if(newFitness >= oldFitness) {
+                swap(x1, y1, x2, y2);
+            }
+        }
+        if(getFitness() == 0) {
+            print();
+        }
+        randSwaps(400);
+    }
+    return 0;
+}

+ 5 - 0
Makefile

@@ -0,0 +1,5 @@
+run: build
+	./magic
+
+build: Main.c 
+	gcc -o magic Main.c -Wall -Wextra -pedantic -Werror -O3