유형 불일치: Anylogic에서 double을 클래스로 변환할 수 없습니다.

유형 불일치: Anylogic에서 double을 클래스로 변환할 수 없습니다.

저는 Anylogic의 Java를 처음 접했기 때문에 이것이 아마도 빠른 수정이라고 생각합니다.

OperationResults라는 클래스 유형을 정의했습니다.

    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;
    }
}

내 시뮬레이션의 함수는 단순히 두 개의 이중 값('a' 및 'b')을 내 Python API 코드로 보내는 'callAPI'라고 합니다. 두 코드 세트는 다음과 같습니다. 내 'callAPI' 기능:

    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
    }

내 API 파이썬 코드:


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)

기능을 실행하는 시뮬레이션의 버튼은 다음과 같습니다.

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);
}

내가받는 두 가지 오류는 다음과 같습니다."유형 불일치: 'OperationResults' 클래스를 double 클래스로 변환할 수 없습니다."에서함수의코드와"유형 불일치: double에서 'OperationResults' 클래스로 변환할 수 없습니다."에서버튼의암호.

다른 모든 것은 괜찮은 것 같으니 내 오류에 대해 간단한 설명이 있었으면 좋겠습니다. 도움을 주시면 감사하겠습니다.

내 스택 추적은 다음과 같습니다.


    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)

답변1

해결책을 찾았습니다. AnyLogic으로 작성된 함수에서 callAPI예상 출력 유형을 'double'에서 'Other'로 변경한 다음 OperationResults. 이는 '반환 값' 옵션에서 수행되었습니다. 의 함수 출력을 기대하는 대신 double함수 출력은 OperationResults기본 페이지의 클래스 코드에서 생성한 클래스 유형에 있습니다.

관련 정보