Ich muss alle einfachen nicht überlappenden Zyklen auf ungerichteten Graphen finden. Um alle bestehenden Zyklen zu finden machte ich eine Objective-C-Version des Algorithmus, die ich hier gefunden:Finden aller nicht überlappenden Zyklen in einem ungerichteten Graphen
Finding all cycles in undirected graphs
@interface HSValue : NSObject
@property (nonatomic, assign) CGPoint point;
@end
@implementation HSValue
@end
@interface CyclesFinder()
@property (nonatomic, strong) NSMutableArray <NSArray<HSValue *>*> *cycles;
@property (nonatomic, strong) NSArray <NSArray<HSValue*>*> *edges;
@end
@implementation CyclesFinder
-(void)findCyclesInGraph:(NSArray <NSArray<HSValue*>*> *)edges {
self.edges = edges;
for (NSInteger i=0; i < self.edges.count; i++) {
for (NSInteger j=0; j < self.edges[i].count; j++) {
[self findNewCycles:@[self.edges[i][j]]];
}
}
}
-(void)findNewCycles:(NSArray <HSValue *> *)path {
HSValue *startNode = path[0];
HSValue *nextNode;
NSArray <HSValue *> *sub;
for (NSInteger i=0; i < self.edges.count; i++) {
NSArray <HSValue *> *edge = self.edges[i];
if ([edge containsObject:startNode]) {
if ([edge[0] isEqual:startNode]) {
nextNode = edge[1];
}
else {
nextNode = edge[0];
}
}
else {
nextNode = nil;
}
if (![path containsObject:nextNode] && nextNode) {
sub = @[nextNode];
sub = [sub arrayByAddingObjectsFromArray:path];
[self findNewCycles:sub];
}
else if (path.count > 2 && [nextNode isEqual:path.lastObject]) {
if (![self cycleExist:path]) {
[self.cycles addObject:path];
break;
}
}
}
}
-(BOOL)cycleExist:(NSArray <HSValue*> *)path {
path = [path sortedArrayUsingSelector:@selector(compare:)];
for (NSInteger i=0; i < self.cycles.count; i++) {
NSArray <HSValue *> *cycle = [self.cycles[i] sortedArrayUsingSelector:@selector(compare:)];
if ([cycle isEqualToArray:path]) {
return TRUE;
}
}
return FALSE;
}
Above Algorithmus funktioniert gut (auch wenn es nicht sehr effizient ist) und es findet alle möglich Zyklen aus der grafischen Darstellung auf dem beigefügte Bild (siehe Bild unten):
ABHGFDEA (gültig)
BCIHB (gültig)
GHILKG (gültig)
FGKJF (gültig)
FGHILKJF (ungültig)
ABCIHGFDEA (ungültig)
ABCILKJFDEA (ungültig)
ABCIHG - KJFDEA (ungültig)
ABHILKGFDEA (ungültig)
ABHGKJFDEA (ungültig)
ABCILKGFDEA (ungültig)
BCILKGHB (ungültig)
BCILKJFGHB (ungültig)
jedoch, wenn ich den obigen Algorithmus ausgeführt werden soll ich nur mit, um am Ende diejenigen, Zyklen, die ich mit farbigen Polygonen am linken Beispiel markiert habe. Was ich nicht will, sind die Zyklen wie der auf der rechten Seite Beispiel.
Mein erster Gedanke war, dass Zyklus überlappende wird ein Zyklus, der alle Punkte von allen anderen Zyklen enthält, aber das ist nicht immer wahr. Kann mir jemand in die richtige Richtung zeigen? Ist es möglich, den obigen Algorithmus zu modifizieren, so dass er nur nicht überlappende Zyklen findet oder wenn nicht, was soll ich tun, nachdem ich alle Zyklen gefunden habe, um sie zu filtern?
Der einzige Unterschied, den ich zwischen den beiden Figuren zu sehen ist, die Farben. Können Sie erklären, was an ihnen gültig und ungültig ist? – Avi
Die Farben repräsentieren Zyklen in der Grafik. Deshalb habe ich auf dem rechten Bild einen der Zyklen (F-G-H-I-L-K-J-F) hervorgehoben, die ich bei Überlappungen (F-G-K-J-F) und (G-H-I-L-K-J-F) eliminieren möchte. Auf dem linken Bild stellen Farben alle Zyklen dar, mit denen ich enden möchte. – Guferos
Ich denke, dass Sie diese Informationen in die Frage hinzufügen sollten. – Avi