This repository contains the Micronaut Optimizer project, which aims to optimize various computational problems using the Micronaut framework. The project leverages the power of Micronaut for building lightweight, modular, and efficient applications.
The architecture of the Micronaut Optimizer is visualized using PlantUML. Below is the updated PlantUML diagram representing the high-level architecture of the project.
@startuml
package "io.github.seehiong" {
    package "controller" {
        class ProgressController
        class ProblemController
    }
    
    package "factory" {
        class SolverServiceFactory
    }
    
    package "service" {
        class SolverService
        class BaseSolverService
        class FLPService
    }
    
    package "utils" {
        class DisposableUtils << (U,orchid) utility >>
        class CoordUtils << (U,orchid) utility >>
        class FileUtils << (U,orchid) utility >>
    }
    package "model" {
        abstract class Input
        class FLPInput
        abstract class Output
        class FLPOutput
        interface Constraint
        interface Objective
        interface Metric
        interface Metadata
    }   
    package "solver" {
        interface Solver
        class FLPSolver
        class TSPSolver
    }    
}
SolverService <|.. BaseSolverService
BaseSolverService <|-- FLPService
FLPService --> DisposableUtils
ProgressController --> Output
ProblemController --> SolverService
SolverServiceFactory -> SolverService
FLPSolver --|> Solver
TSPSolver --|> Solver
Input <|-- FLPInput
Output <|-- FLPOutput
Input --> Constraint
Input --> Objective
Output --> Metric
Output --> Metadata
FLPSolver --> CoordUtils
FLPSolver --> FileUtils
@enduml- Real-time Progress Monitoring: View optimization progress through SSE (Server-Sent Events)
- Multiple Solver Support:
- Traveling Salesman Problem (TSP)
- Facility Location Problem (FLP)
 
- Interactive Visualization: Dynamic visualization of solution progress
- Factory Pattern: Extensible solver framework
The folder structure of the project is as follows:
micronaut-optimizer/
βββ src/main/
β   βββ java/io/github/seehiong/
β   β   βββ controller/   # REST endpoints
β   β   βββ factory/      # Solver factory implementation
β   β   βββ micronaut/    # Application configuration
β   β   βββ model/        # Data models and DTOs
β   β   βββ service/      # Business logic layer
β   β   βββ solver/       # Optimization algorithms
β   β   βββ utils/        # Utility classes
β   βββ resources/
β       βββ application.yml  # Micronaut configuration
β       βββ logback.yml      # Logging configuration
β       βββ static/          # Static resources (HTML, CSS, JS)
β           βββ flp-progress.html
β           βββ tsp-progress.html
β           βββ cvrp-progress.html
βββ build.gradle
βββ settings.gradle
βββ README.md
- Java 21 or higher
- Gradle 8.11 or higher
- Web browser with SSE support
- Clone the repository:
git clone https://github.com/seehiong/micronaut-optimizer.git
cd micronaut-optimizer- Build the project:
./gradlew clean build- Run the application:
./gradlew run- Access the visualization:
- TSP Progress: http://localhost:8080/tsp-progress.html
- FLP Progress: http://localhost:8080/flp-progress.html
POST /solve/{problem}           # Solve a problem with raw input
POST /solve/{problem}/upload    # Solve a problem with file upload
GET /progress/latest/{solverId} # Get the latest output for a solver
GET /progress/{solverId}        # Stream optimization progress
- Post to http://localhost:8080/solve/flp
- Navigate to http://localhost:8080/flp-progress.html?xScale=1500&yScale=1500&solverId=<SOLVER_ID>for progess:
{
    "facilityCostConstraint": {
        "costs": [100, 100, 100]
    },
    "facilityCapacityConstraint": {
        "capacities": [100, 100, 500]
    },    
    "facilityCoordinateConstraint": {
        "coordinates": [
            {"x": "1065", "y": "1065"},
            {"x": "1062", "y": "1062"},
            {"x": "0",    "y": "0"}
        ]
    },
    "customerCoordinateConstraint": {
        "coordinates": [
            {"x": "1397", "y": "1397"},
            {"x": "1398", "y": "1398"},
            {"x": "1399", "y": "1399"},
            {"x": "586",  "y": "586"},
            {"x": "900",  "y": "900"},
            {"x": "910",  "y": "910"},
            {"x": "1200", "y": "1200"},
            {"x": "1210", "y": "1210"}
        ]
    },
    "customerDemandConstraint": {
        "demands": [50, 50, 75, 75, 80, 80, 90, 90]
    }
}- Post to http://localhost:8080/solve/tsp
- Navigate to http://localhost:8080/tsp-progress.html?xScale=5&yScale=5&solverId=<SOLVER_ID>for progess:
{
    "distanceMatrixConstraint": {
        "distances": [
            [ 0, 10, 15, 20, 25 ],
            [10,  0, 35, 25, 20 ],
            [15, 35,  0, 30, 10 ],
            [20, 25, 30,  0, 15 ],
            [25, 20, 10, 15,  0 ]
        ]
    },
    "solveTimeConstraint": {
        "solveTime": "30s"
    },
    "minMaxObjective": {
        "minMaxEnum": "MINIMIZE"
    }
}- Post to http://localhost:8080/solve/cvrp
- Navigate to http://localhost:8080/cvrp-progress.html?xScale=20&yScale=20&solverId=<SOLVER_ID>for progess:
{
    "vehicleConstraint": {
        "vehicleNumber": 4,
        "capacity": 15
    },
    "customerDemandConstraint": {
        "demands": [0, 1, 1, 2, 4, 2, 4, 8, 8, 1, 2, 1, 2, 4, 4, 8, 8]
    },
    "distanceMatrixConstraint": {
        "distances": [
            [0, 548, 776, 696, 582, 274, 502, 194, 308, 194, 536, 502, 388, 354, 468, 776, 662],
            [548, 0, 684, 308, 194, 502, 730, 354, 696, 742, 1084, 594, 480, 674, 1016, 868, 1210],
            [776, 684, 0, 992, 878, 502, 274, 810, 468, 742, 400, 1278, 1164, 1130, 788, 1552, 754],
            [696, 308, 992, 0, 114, 650, 878, 502, 844, 890, 1232, 514, 628, 822, 1164, 560, 1358],
            [582, 194, 878, 114, 0, 536, 764, 388, 730, 776, 1118, 400, 514, 708, 1050, 674, 1244],
            [274, 502, 502, 650, 536, 0, 228, 308, 194, 240, 582, 776, 662, 628, 514, 1050, 708],
            [502, 730, 274, 878, 764, 228, 0, 536, 194, 468, 354, 1004, 890, 856, 514, 1278, 480],
            [194, 354, 810, 502, 388, 308, 536, 0, 342, 388, 730, 468, 354, 320, 662, 742, 856],
            [308, 696, 468, 844, 730, 194, 194, 342, 0, 274, 388, 810, 696, 662, 320, 1084, 514],
            [194, 742, 742, 890, 776, 240, 468, 388, 274, 0, 342, 536, 422, 388, 274, 810, 468],
            [536, 1084, 400, 1232, 1118, 582, 354, 730, 388, 342, 0, 878, 764, 730, 388, 1152, 354],
            [502, 594, 1278, 514, 400, 776, 1004, 468, 810, 536, 878, 0, 114, 308, 650, 274, 844],
            [388, 480, 1164, 628, 514, 662, 890, 354, 696, 422, 764, 114, 0, 194, 536, 388, 730],
            [354, 674, 1130, 822, 708, 628, 856, 320, 662, 388, 730, 308, 194, 0, 342, 422, 536],
            [468, 1016, 788, 1164, 1050, 514, 514, 662, 320, 274, 388, 650, 536, 342, 0, 764, 194],
            [776, 868, 1552, 560, 674, 1050, 1278, 742, 1084, 810, 1152, 274, 388, 422, 764, 0, 798],
            [662, 1210, 754, 1358, 1244, 708, 480, 856, 514, 468, 354, 844, 730, 536, 194, 798, 0]
        ]
    },
    "solveTimeConstraint": {
        "timeInSeconds": "10"
    }
}- Post to http://localhost:8080/solve/bpp
- Navigate to http://localhost:8080/bpp-progress.html?solverId=<SOLVER_ID>for progess:
{
    "itemWeightConstraint": {
        "weights": [48, 30, 19, 36, 36, 27, 42, 42, 36, 24, 30]
    },
    "binCapacityConstraint": {
        "capacity": 100
    }
}- Fork the repository
- Create a feature branch
- Submit a pull request
MIT License



