Hallo,
ich habe mich noch einmal mit dem Problem beschäftigt und folgendes Programm erstellt:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import random
# Bezeichnungen der Signale
b = ['D', 'K', 'HA', 'ES', 'DU', 'W', 'MG', 'DO', 'KR', 'OB', 'SI', 'AC']
# Liste mit den Knoten
k = [[0, 1, 4, 5, 6, 8], # 0 = D <
[1, 0, 5, 10, 11], # 1 = K <
[2, 3, 5, 7, 10], # 2 = HA
[3, 2, 4, 7, 9], # 3 = ES <
[4, 0, 3, 8, 9], # 4 = DU
[5, 0, 1, 2], # 5 = W <
[6, 0, 8, 11], # 6 = MG
[7, 2, 3, 9], # 7 = DO <
[8, 0, 4, 6], # 8 = KR
[9, 3, 4, 7], # 9 = OB <
[10, 1, 2], # 10 = SI
[11, 1, 6]] # 11 = AC
d = 0
geloest = False
while not geloest:
# Liste mit den Knoten zufällig sortieren
random.shuffle(k)
# Liste für den Status der Signale mit False initialisieren
signale = 12 * [0]
# Durchlaufzähler
d += 1
# nur die ersten sechs Knoten (Signale) berücksichtigen
for n in range(0, 6, 1):
# Knoten einschließlich aller Nachbarn umschalten
for m in k[n]:
signale[m] = ~signale[m]
# prüfen ob alle Signale gesetzt sind
if 0 not in signale:
geloest = True
print 'Durchläufe:\n', d
print '\nSignalliste:\n', signale
print '\nAusgewertete Knoten:\n', k[:6]
print '\nFolgende Signale müssen umgestellt werden (Reihenfolge beliebig):\n',\
b[k[0][0]]+' '+b[k[1][0]]+' '+b[k[2][0]]+' '+b[k[3][0]]+' '+b[k[4][0]]+' '+b[k[5][0]]
break
if geloest: break
Im Prinzip habe ich mit zwei Listen gearbeitet, einer mit allen Knoten (Signale) mit den Indizien für die eigene Position und die aller Nachbarn. In der zweiten wird für alle Signale eines Knotens der Status umgeschaltet.
Vor jedem Durchlauf wird die Liste mit den Knoten in eine zufällige Reihenfolge gebracht und die Liste für den Status der Signale für alle Signale auf "nicht gestellt" (0) gesetzt.
Danach werden die ersten sechs Knoten ausgewertet. Sind nach einer solchen Auswertung alle Signale gesetzt, wird der Durchlauf abgebrochen und das Ergebnis angezeigt.
Ich habe die über das Programm von
stefanbunde gewonnenen Erkenntnisse, dass es genau sechs "Lösungswerte" gibt, deren Reihenfolge beliebig ist, als Faktum unterstellt. Wüsste man dies nicht, müsste man zum Beispiel mit einem Durchlauf von fünf Knoten beginnen und, falls damit nach einer bestimmten Anzahl von Durchläufen keine Lösung gefunden wird, die Anzahl der zu berücksichtigen Knoten schrittweise erhöhen.
Durch folgende Ergänzung lässt sich das sehr leicht realisieren:
Vor der while-Schleife einfügen:
p = 5
In der Schleife ab Zeile 33 den Code so verändern:
Code: Alles auswählen
if d % 5000 == 0:
p += 1
# nur die ersten p Knoten (Signale) berücksichtigen
for n in range(0, p, 1):
MfG, kodela