Hi, ich versuche ein Programm zu erstellen, dass KV-Tabellen automatisch befüllt und mir die möglichst kürzeste Kombination aus Gattern wiedergibt.
Kurz zur Erklärung wie das geht, ich hab z.B. eine Tabelle mit 2 Eingängen:
KVC_01
Bei A1 gib ich die Zahlen selbst ein und das Programm überführt sie rechts in die Tabelle, dann überprüft er, ob vertikal oder horizontal mehrere 'Einsen' liegen.
Es können immer nur 2-er, 4-er, 8-er oder eben 1-er Päckchen gebildet werden. Es können z.B. 4 'Einsen' untereinander oder nebeneinander ein 4-er Päckchen ergeben oder auch 2 neben- und untereinander.
Das geht auch über den Rand hinaus, so können z.B. 4 'Einsen' in den äußersten 4 Ecken, ein 4-er Päckchen ergeben.
Das ist bei dem Bsp. mit 2 Eingängen noch nicht relevant aber bei 3 oder 4 Eingängen.
Man kann auch 'Einsen' die man für ein Päckchen schon verbraucht hat, auch nochmal benutzen um ein weiteres Päckchen zu bilden, allerdings nur, wenn es auch Sinn macht.
Als Bsp.:
KVC_02
Hier sollen z.B. alle 4 'Einsen' auf der linken Seite zu einem 4-er Päckchen gebildet werden und die dritte 'Eins' in oberen Reihe soll mit der zweiten 'Eins' in dieser Reihe zu einem 2-er Päckchen gebildet werden.
Wäre ganz oben rechts noch eine 'Eins', so sollten aber 2x 4-er Päckchen gebildet werden.
Weiterhin besteht die Möglichkeit, dass ein Ausgang nicht relevant ist und mit 'x' belegt wird. Das 'x' kann auch dazu genutzt werden ein Päckchen mit 'Einsen' zu bilden, soll aber nur in Betracht gezogen werden, wenn es dabei hilft, ein Päckchen zu bilden.
Am Ende müssen alle 'Einsen' in der Tabelle verbraucht sein und dann sieht man sich die Päckchen an. Für die Bildung der Gleichung muss man sich jetzt das Päckchen ansehen, in welchen Eingängen es sich befindet.
Befindet sich ein Päckchen z.B. in x1, aber nicht in x1¯, so ist x1 die Gleichung. Befindet sich das Päckchen in beiden Eingängen (x1 und x1¯), so ist weder x1, noch x1¯ Teil der Gleichung.
An dem Bsp. KVC_02 wäre die Gleichung A1 = x1 ∨ (x2 ∧ x3). Beim 4-er Päckchen wird x2 und x2¯ eingeschlossen, sowie x3 und x3¯, deswegen werden die beiden Eingänge ausgeschlossen und es bleibt x1 als Gleichung über, weil x1¯ nicht eingeschlossen ist. Beim 2-er Päckchen ist x1 und x1¯ eingeschlossen, aber x2¯ und x3¯ nicht, deswegen bleibt x2 ∧(und) x3 über.
Ich hoffe ich hab nichts vergessen und es halbwegs vernünftig erklärt.
So nun hab ich das mit 2 Eingängen hin bekommen, der Code dazu:
KVC_2E_Code
Func CompareE2()
if ($Av[0][0] = 1 Or $Av[0][0] = "x") And ($Av[0][1] = 1 Or $Av[0][1] = "x") And ($Av[1][0] = 1 Or $Av[1][0] = "x") And ($Av[1][1] = 1 Or $Av[1][1] = "x") Then
$TermAv = $TermAv &"Plus"
$ComboA1_4 = 1
EndIf
if ($Av[0][0] = 1 Or $Av[0][0] = "x") And ($Av[0][1] = 1 Or $Av[0][1] = "x") And $ComboA1_4 = 0 Then
if $TermAv <> "A"&$TermChar &" = " Then
$TermAv = $TermAv &" ∨ "
EndIf
$TermAv = $TermAv &"x2"
$ComboA1_2 = 1
EndIf
if ($Av[1][0] = 1 Or $Av[1][0] = "x") And ($Av[1][1] = 1 Or $Av[1][1] = "x") And $ComboA1_4 = 0 Then
if $TermAv <> "A"&$TermChar &" = " Then
$TermAv = $TermAv &" ∨ "
EndIf
$TermAv = $TermAv &"x2 ̅"
$ComboA1_2 = 1
EndIf
if ($Av[0][0] = 1 Or $Av[0][0] = "x") And ($Av[1][0] = 1 Or $Av[1][0] = "x") And $ComboA1_4 = 0 Then
if $TermAv <> "A"&$TermChar &" = " Then
$TermAv = $TermAv &" ∨ "
EndIf
$TermAv = $TermAv &"x1"
$ComboA1_2 = 1
EndIf
if ($Av[0][1] = 1 Or $Av[0][1] = "x") And ($Av[1][1] = 1 Or $Av[1][1] = "x") And $ComboA1_4 = 0 Then
if $TermAv <> "A"&$TermChar &" = " Then
$TermAv = $TermAv &" ∨ "
EndIf
$TermAv = $TermAv &"x1 ̅"
$ComboA1_2 = 1
EndIf
if $ComboA1_2 = 0 And $ComboA1_4 = 0 Then
if $Av[0][0] = 1 Then
if $TermAv <> "A"&$TermChar &" = " Then
$TermAv = $TermAv &" ∨ "
EndIf
$TermAv = $TermAv &"(x1 ∧ x2)"
EndIf
if $Av[0][1] = 1 Then
if $TermAv <> "A"&$TermChar &" = " Then
$TermAv = $TermAv &" ∨ "
EndIf
$TermAv = $TermAv &"(x1 ̅ ∧ x2)"
EndIf
if $Av[1][0] = 1 Then
if $TermAv <> "A"&$TermChar &" = " Then
$TermAv = $TermAv &" ∨ "
EndIf
$TermAv = $TermAv &"(x1 ∧ x2 ̅ )"
EndIf
if $Av[1][1] = 1 Then
if $TermAv <> "A"&$TermChar &" = " Then
$TermAv = $TermAv &" ∨ "
EndIf
$TermAv = $TermAv &"(x1 ̅ ∧ x2 ̅ )"
EndIf
EndIf
EndFunc
Alles anzeigen
Kurze Erläuterung:
$Av ist die Tabelle als Array (ohne die Bezeichnungen wie x1, x1̅ usw.)
$TermAv benutze ich um die Gleichung aus zu geben. Die Abfrage "if $TermAv <> "A"&$TermChar &" = " Then" dient dazu um zu gucken ob ich schon ein Teil der Gleichung habe, falls ja, soll er diese mit " ∨ " erweitern, bevor die Gleichung um die Eingänge erweitert wird.
$ComboA1_4/2 hab ich hier als Hilfsvariable benutzt, weil ich keine weiteren 2-er bzw. 1-er Päckchen bilden muss, das funktioniert aber auch nur bei der Tabelle mit 2 Eingängen.
Allerdings bin ich maßlos überfordert, das für eine Tabelle mit 3 oder 4 Eingängen zu erstellen und ich glaube auch auf diese Art und Weise würde da an die eine Million Zeilen Code entstehen und meine eigentliche Frage ist, hat jemand eine Idee, wie ich das anders abfragen kann bzw. gibt es irgendwelche Funktionen in AutoIT mit denen ich sowas viel einfacher machen kann?
Ich bin leider noch kein Profi in AutoIT.
Das Hauptproblem was ich sehe, ist, dass ich manche 'Einsen' manchmal, doppelt verwenden muss, aber manchmal eben nicht.
Das selbe auch mit dem 'x', welches ich ja nur verwenden möchte, wenn es mir dabei hilft, mit anderen 'Einsen' ein Päckchen zu bilden.
Hier nochmal ein Screen, wie die Tabelle mit 4 Eingängen bei mir aussieht:
KVC_03
Ich hoffe wirklich jemand kann mir hierbei irgendwie helfen und ich bin für jede Idee dankbar.
Mit freundlichem Gruß
Eugen