Ich entwickle High-Level-Petri-Net-Editor/Simulator. Zunächst ist hier ein kleines VokabularBacktracking mit Rekursion
Kreis = Ort
Rechteck = Übergang
ganze Zahlen anstelle = Token
Zustand im Übergang = Wache
Und ich bin fest Beim Überschreiten der Wache des Übergangs. Guard ist eine Bedingung, die wahr sein muss, wenn Sie den Übergang ausführen möchten. Ich weiß, dass ich backtracking irgendwie verwenden sollte, aber ich weiß nicht, wieviele Plätze den Übergang vor dem Programmanfang betreten, also kann ich nicht für Schleifen verwenden, da ich nicht weiß, wieviele von ihnen ich brauchen werde.
Hier ist das Bild, dass das Problem, ich will erste Token nehmen So
zeigt vom ersten Platz, erste Token von dem zweiten Platz, dann versuchen die Wache zu übergeben, wenn übergeben, dann Token speichern, und brechen Sie die Schleife, wenn falsch, mit zweiten Token des zweiten Platzes fortsetzen .. etc ... Ich übergeben schließlich Wache mit letzten Token (4) des ersten Platzes, und letzte Token (2) des zweiten Platzes.
Ich würde wissen, wie das codieren, wenn ich den Übergang konstante Zahl der Plätze hatte Eingabe, würde es wie folgt aussieht
for token in place 1
for token in place 2
try pass guard
if (passed)
save tokens
break;
aber wie ich schon sagte, ich nicht konstante Zahl der Plätze haben Übergang Eingabe , also kann ich diesen Ansatz nicht verwenden. Also, im Grunde muss ich Kombinationen von Tokens versuchen und versuchen, die Wache zu übergeben - bis ich die Wache übergeben, oder bis ich alle Kombinationen ausprobiert. Haben Sie irgendwelche Ideen? Pseudocode wäre genug. Nebenbei verwende ich diese Datenstruktur
Liste der Orte - normale Java-Liste, Liste Orte = neue ArrayList();
und jeder Ort hat seine eigene Liste von Token, List tokens = new ArrayList();
/// EDIT: die Wache hat folgendes Format:
op1 rel op2, wo op1 variabel ist, und op2 konstant oder variabel ist, rel Beziehung (<,>, =, ... op1 rel op2 & & op3 rel op4 ...
---- EDIT:
Beispiel -) es kann mit dem logischen Operator UND verbunden mehrere Bedingungen in der Hut seinAlso habe ich versucht, den Rushil-Algorithmus zu implementieren, aber es ist ziemlich fehlerhaft, also gebe ich SSCCE ein, damit du es ausprobieren und vielleicht ein wenig helfen kannst.
Zunächst Platz Klasse erstellen:
public class Place {
public List<Integer> tokens ;
//constructor
public Place() {
this.tokens = new ArrayList<Integer>();
}
}
Und dann testen Klasse:
public class TestyParmutace {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
List<Place> places = new ArrayList<Place>();
Place place1 = new Place();
place1.tokens.add(1);
place1.tokens.add(2);
place1.tokens.add(3);
places.add(place1); //add place to the list
Place place2 = new Place();
place2.tokens.add(3);
place2.tokens.add(4);
place2.tokens.add(5);
places.add(place2); //add place to the list
Place place3 = new Place();
place3.tokens.add(6);
place3.tokens.add(7);
place3.tokens.add(8);
places.add(place3); //add place to the list
//so we have
//P1 = {1,2,3}
//P2 = {3,4,5}
//P3 = {6,7,8}
List<Integer> tokens = new ArrayList<Integer>();
Func(places,0,tokens);
}
/**
*
* @param places list of places
* @param index index of current place
* @param tokens list of tokens
* @return true if we passed guard, false if we did not
*/
public static boolean Func(List<Place> places, int index, List<Integer> tokens)
{
if (index >= places.size())
{
// if control reaches here, it means that we've recursed through a particular combination
// (consisting of exactly 1 token from each place), and there are no more "places" left
String outputTokens = "";
for (int i = 0; i< tokens.size(); i++) {
outputTokens+= tokens.get(i) +",";
}
System.out.println("Tokens: "+outputTokens);
if (tokens.get(0) == 4 && tokens.get(1) == 5 && tokens.get(2) == 10) {
System.out.println("we passed the guard with 3,5,8");
return true;
}
else {
tokens.remove(tokens.get(tokens.size()-1));
return false;
}
}
Place p = places.get(index);
for (int i = 0; i< p.tokens.size(); i++)
{
tokens.add(p.tokens.get(i));
//System.out.println("Pridali sme token:" + p.tokens.get(i));
if (Func(places, index+1, tokens)) return true;
}
if (tokens.size()>0)
tokens.remove(tokens.get(tokens.size()-1));
return false;
}
}
und hier ist der Ausgang dieses Code:
Tokens: 1,3,6,
Tokens: 1,3,7,
Tokens: 1,3,8,
Tokens: 3,4,6,
Tokens: 3,4,7,
Tokens: 3,4,8,
Tokens: 4,5,6,
Tokens: 4,5,7,
Tokens: 4,5,8,
Tokens: 2,3,6,
Tokens: 2,3,7,
Tokens: 2,3,8,
Tokens: 3,4,6,
Tokens: 3,4,7,
Tokens: 3,4,8,
Tokens: 4,5,6,
Tokens: 4,5,7,
Tokens: 4,5,8,
Tokens: 3,3,6,
Tokens: 3,3,7,
Tokens: 3,3,8,
Tokens: 3,4,6,
Tokens: 3,4,7,
Tokens: 3,4,8,
Tokens: 4,5,6,
Tokens: 4,5,7,
Tokens: 4,5,8,
Also, Sie sehen, einige Kombinationen sind korrekt, wie 1,3,6 und 1,3,7 ... aber 4,5,8 ist absoluter Unsinn, da 4 nicht einmal an erster Stelle steht ... und ther Es gibt auch Kombinationen, die komplett fehlen ... wie 2,4,6 etc ... jeder sieht warum ist das so?
EDIT: Jetzt funktioniert es gut.
Ich bin nicht sicher, ob ich es bekommen, die erste Linie verwirrend für me..how ich bin soll Versuchen Sie Wache zu passieren, wenn Plätze leer sind? –
Oh, ich sehe, ich dachte, du brauchst nur die Token, die du ausgewählt hast. Auf diese Weise können Sie Paare (Token, Place) behalten. Ich benutze eine pytho-ische Notation, ich hoffe, das ist nicht zu verwirrend. Ich werde die Antwort aktualisieren, um Ihnen zu zeigen, was ich meine. – Laky
Ich verstehe immer noch nicht, was diese Zeile bedeutet, wenn der Platz leer ist ?? Die Liste der Orte wird nie leer sein, es gibt immer einen Ort, der mit dem Übergang verbunden ist, den ich auszuführen versuche. Nun, ich muss mich an ein Token-Place-Paar erinnern, weil ich, wenn ich den Wächter erzwinge, diesen Token aus dem Ort entfernen muss. –