Ich bin ziemlich neu bei Java in Anylogic und denke daher, dass dies wahrscheinlich eine schnelle Lösung ist.
Ich habe einen Klassentyp namens OperationResults definiert:
public class OperationResults {
private final double multiplicationResult;
private final double additionResult;
private final double subtractionResult;
public OperationResults(double mulRes, double addRes, double subRes) {
this.multiplicationResult = mulRes;
this.additionResult = addRes;
this.subtractionResult = subRes;
}
}
Die Funktion in meiner Simulation heißt „callAPI“ und sendet einfach zwei doppelte Werte („a“ und „b“) an meinen Python-API-Code. Beide Codesätze lauten wie folgt. Meine „callAPI“-Funktion:
try {
URL url = new URL("http://127.0.0.1:5000/operations");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setDoOutput(true);
String jsonInputString = "{\"a\": " + a + ", \"b\": " + b + "}";
try (OutputStream os = conn.getOutputStream()) {
byte[] input = jsonInputString.getBytes(StandardCharsets.UTF_8);
os.write(input, 0, input.length);
}
try (InputStream is = conn.getInputStream(); Scanner scanner = new Scanner(is)) {
String jsonResponse = scanner.useDelimiter("\\A").next();
JSONObject response = new JSONObject(jsonResponse);
double multiplicationResult = response.getDouble("multiplicationResult");
double additionResult = response.getDouble("additionResult");
double subtractionResult = response.getDouble("subtractionResult");
return new OperationResults(multiplicationResult, additionResult, subtractionResult);
}
} catch (Exception e) {
e.printStackTrace();
return new OperationResults(-1, -1, -1); // Error handling
}
Mein API-Python-Code:
app = Flask(__name__)
@app.route('/operations', methods=['POST'])
def operations():
data = request.get_json(force=True)
a = data['a']
b = data['b']
result_multiply = a * b
result_addition = a + b
result_subtraction = a - b
return jsonify({
'multiplicationResult': result_multiply,
'additionResult': result_addition,
'subtractionResult': result_subtraction
})
if __name__ == '__main__':
app.run(debug=True)
Mein Button in meiner Simulation, der die Funktion ausführt, sieht wie folgt aus:
for (Learner agent : learners) {
double a = agent.edu1Resources;
double b = agent.edu3Cost;
// API call
OperationResults results = callAPI(a, b);
// Update agent attributes or handle results
agent.multiplicationResult = results.multiplicationResult;
agent.additionResult = results.additionResult;
agent.subtractionResult = results.subtractionResult;
// Print results for each agent
traceln("Agent ID " + agent.getIndex() + ": edu1Resources * edu3Cost = " + results.multiplicationResult +
", edu1Resources + edu3Cost = " + results.additionResult +
", edu1Resources - edu3Cost = " + results.subtractionResult);
}
Die beiden Fehler, die ich erhalte, besagen, dass„Typkonflikt: Konvertierung von Klasse ‚OperationResults‘ in Double nicht möglich“imFunktionCode und„Typkonflikt: Konvertierung von Double in Klasse ‚OperationResults‘ nicht möglich“imTastenCode.
Ich hoffe wirklich, dass es eine einfache Erklärung für meine Fehler gibt, da sonst alles in Ordnung zu sein scheint. Wäre für die Hilfe sehr dankbar.
Hier ist mein Stacktrace:
Type mismatch: cannot convert from double to Main.OperationResults
at _2024_03_28.Main.executeShapeControlAction(Main.java:651)
at _2024_03_28.Main$6.action(Main.java:695)
at com.anylogic.engine.presentation.ShapeControl.executeAction(Unknown Source)
at com.anylogic.engine.presentation.ShapeButton.executeUserAction(Unknown Source)
at com.anylogic.engine.gui.ExperimentHost.executeUserAction(Unknown Source)
at com.anylogic.engine.internal.webserver.f.onAction(Unknown Source)
at com.anylogic.executor.basic.rest.BasicAnimationSessionController.lambda$null$3(BasicAnimationSessionController.java:71)
at com.anylogic.engine.internal.webserver.e.acceptToAnimationSvgSession(Unknown Source)
at com.anylogic.executor.basic.rest.BasicAnimationSessionController.lambda$startController$4(BasicAnimationSessionController.java:71)
at spark.ResponseTransformerRouteImpl$1.handle(ResponseTransformerRouteImpl.java:47)
at spark.http.matching.Routes.execute(Routes.java:61)
at spark.http.matching.MatcherFilter.doFilter(MatcherFilter.java:134)
at com.anylogic.engine.internal.webserver.config.ALServerFactory$1.lambda$0(Unknown Source)
at org.eclipse.jetty.servlets.QoSFilter.doFilter(QoSFilter.java:202)
at com.anylogic.engine.internal.webserver.config.ALServerFactory$1.doHandle(Unknown Source)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1598)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
at org.eclipse.jetty.server.Server.handle(Server.java:516)
at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487)
at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
at java.base/java.lang.Thread.run(Thread.java:834)
Antwort1
Ich habe die Lösung gefunden. In meiner callAPI
in AnyLogic geschriebenen Funktion habe ich den erwarteten Ausgabetyp von „double“ in „Other“ geändert und dann angegeben OperationResults
. Dies wurde unter der Option „Gibt Wert zurück“ durchgeführt. Anstatt eine Funktionsausgabe von zu erwarten double
, ist die Funktionsausgabe im Klassentyp OperationResults
, den ich in meinem Klassencode auf der Hauptseite erstellt habe.