Convert Branch und Bound-Schleife zur Verwendung der Java Stream-API

8

Ich habe einen einfachen Branch and Bound-Algorithmus, der an einer Variante des Problems Traveling Salesman arbeitet, und ich dachte, es würde Spaß machen, ihn zu konvertieren, um die Java 8 Stream API zu verwenden. Mir fällt es jedoch schwer, herauszufinden, wie ich es machen kann, ohne mich auf Nebenwirkungen zu verlassen.

Anfangscode

%Vor%

Ich habe einen ersten Versuch unternommen, es in die Stream-API zu konvertieren und habe Folgendes gefunden:

Java 8 Version

%Vor%

Das Hauptproblem ist, dass der nodeConsumer auf "bestPath" und "bound" verweisen muss, was keine endgültigen Variablen sind. Ich könnte sie zur endgültigen AtomicReference-Variablen machen, um das zu umgehen, aber ich habe den Eindruck, dass dies den Geist der Stream-API verletzt. Kann jemand mir helfen, den ursprünglichen Algorithmus in eine idiomatische Implementierung zu destillieren?

    
Alex Pritchard 30.09.2015, 00:42
quelle

1 Antwort

1

Ich frage mich, ob die Verwendung von reduce der richtige Weg ist, um Werte ohne externe Variablen zu verfolgen.

Etwas wie das folgende (ich musste einige Details Ihres obigen Codes erraten, aber hoffentlich bin ich auf dem richtigen Weg).

%Vor%

Alternativ können Sie auch Seq in jOOλ (eine sequentielle Erweiterung von Streams) verwenden. und verwende stattdessen foldLeft .

    
lukens 18.10.2015 10:24
quelle