# Robin Logistics Environment
[](https://badge.fury.io/py/robin-logistics-env)
[](https://www.python.org/downloads/)
[](https://opensource.org/licenses/MIT)
A comprehensive logistics optimization environment for developing and testing multi-depot vehicle routing algorithms. Built for hackathons, research, and educational purposes.
## ๐ Quick Start
### Installation
```bash
pip install robin-logistics-env
```
### Basic Usage
```python
from robin_logistics import LogisticsEnvironment
# Load the environment
env = LogisticsEnvironment()
# Define your solver function
def my_solver(env):
"""Your optimization algorithm goes here"""
routes = {}
# Access environment data
warehouses = env.warehouse_locations
orders = env.order_requirements
vehicles = env.get_available_vehicles()
# Build your solution
for vehicle_id in vehicles[:len(orders)]:
warehouse_node = env.get_vehicle_home_warehouse(vehicle_id)
order = orders[0] if orders else None
if order:
routes[vehicle_id] = [
warehouse_node,
order['destination_node'],
warehouse_node
]
orders.pop(0)
return {"routes": routes}
# Launch interactive dashboard
env.launch_dashboard(my_solver)
```
## ๐ Features
### ๐ฏ Core Capabilities
- **Multi-depot vehicle routing** with real-world constraints
- **Interactive dashboard** with real-time visualization
- **Performance metrics** and algorithm comparison
- **Dynamic problem generation** with configurable parameters
- **Solution validation** and cost estimation
### ๐ ๏ธ Environment API
- **Distance calculations** between any nodes
- **Route optimization** helpers and validation
- **Inventory management** across multiple warehouses
- **Vehicle capacity** and constraint checking
- **Order fulfillment** tracking and analytics
### ๐ Dashboard Features
- **Problem Definition Editor** - Configure orders, warehouses, inventory
- **Interactive Map** - Visualize routes and locations
- **Performance Metrics** - Track solver time, costs, efficiency
- **Order Inspector** - Detailed order and delivery information
- **Real-time Analytics** - Vehicle utilization, delivery rates
## ๐ API Reference
### LogisticsEnvironment
The main interface for accessing problem data and running optimizations.
#### Properties
```python
env.num_warehouses # Number of distribution centers
env.num_vehicles # Total fleet size
env.num_orders # Customer orders count
env.warehouse_locations # [(warehouse_id, lat, lon), ...]
env.customer_locations # [(order_id, lat, lon), ...]
env.order_requirements # Detailed order specifications
env.vehicle_specs # Vehicle capacity and cost info
```
#### Core Methods
```python
# Distance and routing
env.get_distance(node1, node2) # Shortest distance in km
env.get_shortest_path(node1, node2) # Path as list of nodes
env.calculate_route_statistics(route) # Distance, stops, etc.
# Vehicle and capacity checking
env.get_available_vehicles() # List of vehicle IDs
env.can_vehicle_serve_orders(vehicle_id, orders) # Capacity validation
env.get_vehicle_home_warehouse(vehicle_id) # Home base location
# Order and inventory management
env.get_order_location(order_id) # Delivery destination
env.get_warehouse_inventory(warehouse_id) # Stock levels
env.get_unassigned_orders(current_solution) # Remaining orders
# Solution validation and optimization
env.validate_route(vehicle_id, route) # Check route validity
env.estimate_route_cost(vehicle_id, route) # Cost estimation
env.run_optimization(solver_function) # Execute and analyze
```
#### Advanced Utilities
```python
# Geographic analysis
env.get_nodes_within_distance(center, max_dist) # Nearby locations
env.get_sku_info() # Product specifications
# Performance analysis
env.launch_dashboard(solver_function) # Interactive visualization
```
## ๐งช Example Solvers
### Basic Nearest Neighbor
```python
def nearest_neighbor_solver(env):
"""Simple nearest neighbor heuristic"""
routes = {}
unassigned = list(range(len(env.order_requirements)))
for vehicle_id in env.get_available_vehicles():
if not unassigned:
break
warehouse_node = env.get_vehicle_home_warehouse(vehicle_id)
route = [warehouse_node]
current_node = warehouse_node
vehicle_orders = []
while unassigned:
# Find nearest unassigned order
nearest_order = None
min_distance = float('inf')
for i, order_idx in enumerate(unassigned):
order = env.order_requirements[order_idx]
order_node = order['destination_node']
distance = env.get_distance(current_node, order_node)
# Check capacity constraints
if env.can_vehicle_serve_orders(vehicle_id, [order['order_id']]):
if distance < min_distance:
min_distance = distance
nearest_order = i
if nearest_order is None:
break
# Add order to route
order_idx = unassigned.pop(nearest_order)
order = env.order_requirements[order_idx]
current_node = order['destination_node']
route.append(current_node)
# Return to warehouse
route.append(warehouse_node)
routes[vehicle_id] = route
return {"routes": routes}
```
### Advanced Genetic Algorithm
```python
def genetic_algorithm_solver(env):
"""Genetic algorithm for vehicle routing"""
import random
def create_individual():
orders = list(range(len(env.order_requirements)))
random.shuffle(orders)
return orders
def evaluate_fitness(individual):
# Convert to routes and calculate cost
routes = assign_orders_to_vehicles(individual, env)
return calculate_total_cost(routes, env)
def crossover(parent1, parent2):
# Order crossover (OX)
size = len(parent1)
start, end = sorted(random.sample(range(size), 2))
child = [-1] * size
child[start:end] = parent1[start:end]
remaining = [x for x in parent2 if x not in child]
for i in range(size):
if child[i] == -1:
child[i] = remaining.pop(0)
return child
def mutate(individual):
# Swap mutation
i, j = random.sample(range(len(individual)), 2)
individual[i], individual[j] = individual[j], individual[i]
return individual
# Genetic algorithm main loop
population_size = 100
generations = 500
mutation_rate = 0.1
population = [create_individual() for _ in range(population_size)]
for generation in range(generations):
# Evaluate fitness
fitness_scores = [evaluate_fitness(ind) for ind in population]
# Selection, crossover, mutation
new_population = []
for _ in range(population_size):
parent1 = tournament_selection(population, fitness_scores)
parent2 = tournament_selection(population, fitness_scores)
child = crossover(parent1, parent2)
if random.random() < mutation_rate:
child = mutate(child)
new_population.append(child)
population = new_population
# Return best solution
best_individual = min(population, key=evaluate_fitness)
return assign_orders_to_vehicles(best_individual, env)
```
## ๐๏ธ Dashboard Configuration
The interactive dashboard provides comprehensive control over problem parameters:
### Problem Definition
- **Orders**: Number, weight ratios, SKU variety
- **Warehouses**: Count, locations, inventory distribution
- **Fleet**: Vehicle count per warehouse, capacity specifications
- **Geography**: Delivery distance constraints
### Performance Metrics
- **Timing**: Solver execution, simulation overhead
- **Efficiency**: Delivery rates, cost per order, fleet utilization
- **Quality**: Solution validation, constraint satisfaction
### Visualization
- **Interactive Map**: Real-time route visualization with order details
- **Analytics**: Vehicle status, inventory usage, journey analysis
- **Comparison**: Multi-algorithm performance benchmarking
## ๐ง Development Setup
### Local Installation
```bash
# Clone repository
git clone https://github.com/your-org/robin-logistics-env.git
cd robin-logistics-env
# Install in development mode
pip install -e .
# Install development dependencies
pip install -r requirements-dev.txt
```
### Running Tests
```bash
# Run test suite
python -m pytest tests/
# Run with coverage
python -m pytest tests/ --cov=robin_logistics --cov-report=html
```
### Building Documentation
```bash
# Generate API documentation
cd docs/
make html
# Serve locally
python -m http.server 8000 --directory _build/html
```
## ๐ฏ Problem Constraints
### Vehicle Constraints
- **Capacity**: Weight (kg) and volume (mยณ) limits
- **Distance**: Maximum travel distance per route
- **Home Base**: Must start and end at assigned warehouse
### Order Constraints
- **Delivery**: Each order has a specific destination
- **Items**: Multiple SKUs with different weight/volume
- **Fulfillment**: Orders must be completely satisfied
### Inventory Constraints
- **Availability**: Limited stock at each warehouse
- **Distribution**: Configurable inventory allocation
- **Depletion**: Stock decreases with order fulfillment
## ๐ Solution Format
Your solver function must return a dictionary with the following structure:
```python
{
"routes": {
"vehicle_id_1": [warehouse_node, customer_node_1, customer_node_2, warehouse_node],
"vehicle_id_2": [warehouse_node, customer_node_3, warehouse_node],
# ... more routes
}
}
```
### Route Requirements
- **Start/End**: Routes must begin and end at the vehicle's home warehouse
- **Nodes**: Use node IDs from the road network
- **Orders**: Visit customer nodes to fulfill orders
- **Capacity**: Respect vehicle weight and volume limits
- **Distance**: Stay within vehicle's maximum travel distance
## ๐ Optimization Tips
### Algorithm Design
1. **Start Simple**: Implement nearest neighbor or greedy heuristics first
2. **Add Constraints**: Gradually incorporate capacity and distance limits
3. **Improve Solutions**: Use local search, genetic algorithms, or simulated annealing
4. **Handle Edge Cases**: Empty orders, unreachable locations, capacity exceeded
### Performance Optimization
1. **Distance Caching**: Cache frequently accessed distances
2. **Early Termination**: Stop when solutions aren't improving
3. **Parallel Processing**: Use multiple threads for population-based algorithms
4. **Memory Management**: Avoid storing unnecessary intermediate solutions
### Dashboard Usage
1. **Problem Tuning**: Use sliders to test different problem sizes
2. **Performance Analysis**: Monitor solver time vs solution quality
3. **Visual Debugging**: Use the map to identify routing inefficiencies
4. **Comparison**: Test multiple algorithms on the same problem instance
## ๐ค Contributing
We welcome contributions! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
### Development Workflow
1. Fork the repository
2. Create a feature branch: `git checkout -b feature-name`
3. Make your changes with tests
4. Run the test suite: `python -m pytest`
5. Submit a pull request
### Issue Reporting
- Use GitHub Issues for bug reports and feature requests
- Include code samples and error messages
- Describe your environment (Python version, OS, etc.)
## ๐ License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
## ๐ Acknowledgments
- Built for logistics optimization education and research
- Inspired by real-world vehicle routing challenges
- Designed for hackathon accessibility and extensibility
## ๐ Additional Resources
- [Vehicle Routing Problem on Wikipedia](https://en.wikipedia.org/wiki/Vehicle_routing_problem)
- [Operations Research Techniques](https://www.coursera.org/learn/operations-research-modeling)
- [Python Optimization Libraries](https://pypi.org/search/?q=optimization)
---
**Happy Optimizing!** ๐๐ฆโจ
Raw data
{
"_id": null,
"home_page": "https://github.com/robin-logistics/optimization-environment",
"name": "robin-logistics-env",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "logistics, optimization, vehicle-routing, supply-chain, algorithms, hackathon, vrp, mdvrp",
"author": "Robin Logistics Team",
"author_email": "Robin Logistics Team <info@robin-logistics.com>",
"download_url": "https://files.pythonhosted.org/packages/49/41/ab39e306d5c326faf36caa2e7f604d95ecf731075202e2b651b582331580/robin_logistics_env-2.0.1.tar.gz",
"platform": "any",
"description": "# Robin Logistics Environment\n\n[](https://badge.fury.io/py/robin-logistics-env)\n[](https://www.python.org/downloads/)\n[](https://opensource.org/licenses/MIT)\n\nA comprehensive logistics optimization environment for developing and testing multi-depot vehicle routing algorithms. Built for hackathons, research, and educational purposes.\n\n## \ud83d\ude80 Quick Start\n\n### Installation\n\n```bash\npip install robin-logistics-env\n```\n\n### Basic Usage\n\n```python\nfrom robin_logistics import LogisticsEnvironment\n\n# Load the environment\nenv = LogisticsEnvironment()\n\n# Define your solver function\ndef my_solver(env):\n \"\"\"Your optimization algorithm goes here\"\"\"\n routes = {}\n \n # Access environment data\n warehouses = env.warehouse_locations\n orders = env.order_requirements\n vehicles = env.get_available_vehicles()\n \n # Build your solution\n for vehicle_id in vehicles[:len(orders)]:\n warehouse_node = env.get_vehicle_home_warehouse(vehicle_id)\n order = orders[0] if orders else None\n \n if order:\n routes[vehicle_id] = [\n warehouse_node,\n order['destination_node'],\n warehouse_node\n ]\n orders.pop(0)\n \n return {\"routes\": routes}\n\n# Launch interactive dashboard\nenv.launch_dashboard(my_solver)\n```\n\n## \ud83d\udccb Features\n\n### \ud83c\udfaf Core Capabilities\n- **Multi-depot vehicle routing** with real-world constraints\n- **Interactive dashboard** with real-time visualization\n- **Performance metrics** and algorithm comparison\n- **Dynamic problem generation** with configurable parameters\n- **Solution validation** and cost estimation\n\n### \ud83d\udee0\ufe0f Environment API\n- **Distance calculations** between any nodes\n- **Route optimization** helpers and validation\n- **Inventory management** across multiple warehouses\n- **Vehicle capacity** and constraint checking\n- **Order fulfillment** tracking and analytics\n\n### \ud83d\udcca Dashboard Features\n- **Problem Definition Editor** - Configure orders, warehouses, inventory\n- **Interactive Map** - Visualize routes and locations\n- **Performance Metrics** - Track solver time, costs, efficiency\n- **Order Inspector** - Detailed order and delivery information\n- **Real-time Analytics** - Vehicle utilization, delivery rates\n\n## \ud83d\udcd6 API Reference\n\n### LogisticsEnvironment\n\nThe main interface for accessing problem data and running optimizations.\n\n#### Properties\n\n```python\nenv.num_warehouses # Number of distribution centers\nenv.num_vehicles # Total fleet size\nenv.num_orders # Customer orders count\nenv.warehouse_locations # [(warehouse_id, lat, lon), ...]\nenv.customer_locations # [(order_id, lat, lon), ...]\nenv.order_requirements # Detailed order specifications\nenv.vehicle_specs # Vehicle capacity and cost info\n```\n\n#### Core Methods\n\n```python\n# Distance and routing\nenv.get_distance(node1, node2) # Shortest distance in km\nenv.get_shortest_path(node1, node2) # Path as list of nodes\nenv.calculate_route_statistics(route) # Distance, stops, etc.\n\n# Vehicle and capacity checking\nenv.get_available_vehicles() # List of vehicle IDs\nenv.can_vehicle_serve_orders(vehicle_id, orders) # Capacity validation\nenv.get_vehicle_home_warehouse(vehicle_id) # Home base location\n\n# Order and inventory management\nenv.get_order_location(order_id) # Delivery destination\nenv.get_warehouse_inventory(warehouse_id) # Stock levels\nenv.get_unassigned_orders(current_solution) # Remaining orders\n\n# Solution validation and optimization\nenv.validate_route(vehicle_id, route) # Check route validity\nenv.estimate_route_cost(vehicle_id, route) # Cost estimation\nenv.run_optimization(solver_function) # Execute and analyze\n```\n\n#### Advanced Utilities\n\n```python\n# Geographic analysis\nenv.get_nodes_within_distance(center, max_dist) # Nearby locations\nenv.get_sku_info() # Product specifications\n\n# Performance analysis\nenv.launch_dashboard(solver_function) # Interactive visualization\n```\n\n## \ud83e\uddea Example Solvers\n\n### Basic Nearest Neighbor\n\n```python\ndef nearest_neighbor_solver(env):\n \"\"\"Simple nearest neighbor heuristic\"\"\"\n routes = {}\n unassigned = list(range(len(env.order_requirements)))\n \n for vehicle_id in env.get_available_vehicles():\n if not unassigned:\n break\n \n warehouse_node = env.get_vehicle_home_warehouse(vehicle_id)\n route = [warehouse_node]\n current_node = warehouse_node\n vehicle_orders = []\n \n while unassigned:\n # Find nearest unassigned order\n nearest_order = None\n min_distance = float('inf')\n \n for i, order_idx in enumerate(unassigned):\n order = env.order_requirements[order_idx]\n order_node = order['destination_node']\n distance = env.get_distance(current_node, order_node)\n \n # Check capacity constraints\n if env.can_vehicle_serve_orders(vehicle_id, [order['order_id']]):\n if distance < min_distance:\n min_distance = distance\n nearest_order = i\n \n if nearest_order is None:\n break\n \n # Add order to route\n order_idx = unassigned.pop(nearest_order)\n order = env.order_requirements[order_idx]\n current_node = order['destination_node']\n route.append(current_node)\n \n # Return to warehouse\n route.append(warehouse_node)\n routes[vehicle_id] = route\n \n return {\"routes\": routes}\n```\n\n### Advanced Genetic Algorithm\n\n```python\ndef genetic_algorithm_solver(env):\n \"\"\"Genetic algorithm for vehicle routing\"\"\"\n import random\n \n def create_individual():\n orders = list(range(len(env.order_requirements)))\n random.shuffle(orders)\n return orders\n \n def evaluate_fitness(individual):\n # Convert to routes and calculate cost\n routes = assign_orders_to_vehicles(individual, env)\n return calculate_total_cost(routes, env)\n \n def crossover(parent1, parent2):\n # Order crossover (OX)\n size = len(parent1)\n start, end = sorted(random.sample(range(size), 2))\n child = [-1] * size\n child[start:end] = parent1[start:end]\n \n remaining = [x for x in parent2 if x not in child]\n for i in range(size):\n if child[i] == -1:\n child[i] = remaining.pop(0)\n return child\n \n def mutate(individual):\n # Swap mutation\n i, j = random.sample(range(len(individual)), 2)\n individual[i], individual[j] = individual[j], individual[i]\n return individual\n \n # Genetic algorithm main loop\n population_size = 100\n generations = 500\n mutation_rate = 0.1\n \n population = [create_individual() for _ in range(population_size)]\n \n for generation in range(generations):\n # Evaluate fitness\n fitness_scores = [evaluate_fitness(ind) for ind in population]\n \n # Selection, crossover, mutation\n new_population = []\n for _ in range(population_size):\n parent1 = tournament_selection(population, fitness_scores)\n parent2 = tournament_selection(population, fitness_scores)\n child = crossover(parent1, parent2)\n \n if random.random() < mutation_rate:\n child = mutate(child)\n \n new_population.append(child)\n \n population = new_population\n \n # Return best solution\n best_individual = min(population, key=evaluate_fitness)\n return assign_orders_to_vehicles(best_individual, env)\n```\n\n## \ud83c\udf9b\ufe0f Dashboard Configuration\n\nThe interactive dashboard provides comprehensive control over problem parameters:\n\n### Problem Definition\n- **Orders**: Number, weight ratios, SKU variety\n- **Warehouses**: Count, locations, inventory distribution \n- **Fleet**: Vehicle count per warehouse, capacity specifications\n- **Geography**: Delivery distance constraints\n\n### Performance Metrics\n- **Timing**: Solver execution, simulation overhead\n- **Efficiency**: Delivery rates, cost per order, fleet utilization\n- **Quality**: Solution validation, constraint satisfaction\n\n### Visualization\n- **Interactive Map**: Real-time route visualization with order details\n- **Analytics**: Vehicle status, inventory usage, journey analysis\n- **Comparison**: Multi-algorithm performance benchmarking\n\n## \ud83d\udd27 Development Setup\n\n### Local Installation\n\n```bash\n# Clone repository\ngit clone https://github.com/your-org/robin-logistics-env.git\ncd robin-logistics-env\n\n# Install in development mode\npip install -e .\n\n# Install development dependencies\npip install -r requirements-dev.txt\n```\n\n### Running Tests\n\n```bash\n# Run test suite\npython -m pytest tests/\n\n# Run with coverage\npython -m pytest tests/ --cov=robin_logistics --cov-report=html\n```\n\n### Building Documentation\n\n```bash\n# Generate API documentation\ncd docs/\nmake html\n\n# Serve locally\npython -m http.server 8000 --directory _build/html\n```\n\n## \ud83c\udfaf Problem Constraints\n\n### Vehicle Constraints\n- **Capacity**: Weight (kg) and volume (m\u00b3) limits\n- **Distance**: Maximum travel distance per route\n- **Home Base**: Must start and end at assigned warehouse\n\n### Order Constraints \n- **Delivery**: Each order has a specific destination\n- **Items**: Multiple SKUs with different weight/volume\n- **Fulfillment**: Orders must be completely satisfied\n\n### Inventory Constraints\n- **Availability**: Limited stock at each warehouse\n- **Distribution**: Configurable inventory allocation\n- **Depletion**: Stock decreases with order fulfillment\n\n## \ud83d\udcc8 Solution Format\n\nYour solver function must return a dictionary with the following structure:\n\n```python\n{\n \"routes\": {\n \"vehicle_id_1\": [warehouse_node, customer_node_1, customer_node_2, warehouse_node],\n \"vehicle_id_2\": [warehouse_node, customer_node_3, warehouse_node],\n # ... more routes\n }\n}\n```\n\n### Route Requirements\n- **Start/End**: Routes must begin and end at the vehicle's home warehouse\n- **Nodes**: Use node IDs from the road network\n- **Orders**: Visit customer nodes to fulfill orders\n- **Capacity**: Respect vehicle weight and volume limits\n- **Distance**: Stay within vehicle's maximum travel distance\n\n## \ud83c\udfc6 Optimization Tips\n\n### Algorithm Design\n1. **Start Simple**: Implement nearest neighbor or greedy heuristics first\n2. **Add Constraints**: Gradually incorporate capacity and distance limits\n3. **Improve Solutions**: Use local search, genetic algorithms, or simulated annealing\n4. **Handle Edge Cases**: Empty orders, unreachable locations, capacity exceeded\n\n### Performance Optimization\n1. **Distance Caching**: Cache frequently accessed distances\n2. **Early Termination**: Stop when solutions aren't improving\n3. **Parallel Processing**: Use multiple threads for population-based algorithms\n4. **Memory Management**: Avoid storing unnecessary intermediate solutions\n\n### Dashboard Usage\n1. **Problem Tuning**: Use sliders to test different problem sizes\n2. **Performance Analysis**: Monitor solver time vs solution quality\n3. **Visual Debugging**: Use the map to identify routing inefficiencies\n4. **Comparison**: Test multiple algorithms on the same problem instance\n\n## \ud83e\udd1d Contributing\n\nWe welcome contributions! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n### Development Workflow\n1. Fork the repository\n2. Create a feature branch: `git checkout -b feature-name`\n3. Make your changes with tests\n4. Run the test suite: `python -m pytest`\n5. Submit a pull request\n\n### Issue Reporting\n- Use GitHub Issues for bug reports and feature requests\n- Include code samples and error messages\n- Describe your environment (Python version, OS, etc.)\n\n## \ud83d\udcc4 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## \ud83d\ude4f Acknowledgments\n\n- Built for logistics optimization education and research\n- Inspired by real-world vehicle routing challenges\n- Designed for hackathon accessibility and extensibility\n\n## \ud83d\udcda Additional Resources\n\n- [Vehicle Routing Problem on Wikipedia](https://en.wikipedia.org/wiki/Vehicle_routing_problem)\n- [Operations Research Techniques](https://www.coursera.org/learn/operations-research-modeling)\n- [Python Optimization Libraries](https://pypi.org/search/?q=optimization)\n\n---\n\n**Happy Optimizing!** \ud83d\ude9b\ud83d\udce6\u2728\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Comprehensive logistics optimization environment with interactive dashboard and performance analytics",
"version": "2.0.1",
"project_urls": {
"Bug Tracker": "https://github.com/robin-logistics/optimization-environment/issues",
"Changelog": "https://github.com/robin-logistics/optimization-environment/blob/main/CHANGELOG.md",
"Documentation": "https://robin-logistics.readthedocs.io/",
"Homepage": "https://github.com/robin-logistics/optimization-environment",
"Repository": "https://github.com/robin-logistics/optimization-environment"
},
"split_keywords": [
"logistics",
" optimization",
" vehicle-routing",
" supply-chain",
" algorithms",
" hackathon",
" vrp",
" mdvrp"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "62b9a08198b4725639638c4c3c0cab9a0f856c1a02205db1df8a8b9a7915f9d8",
"md5": "d4ea8bb8c694bdfa21fe976ee59e2f2b",
"sha256": "f2daea94a759a50cfc6f7c8b5728c211da262b2a128f5950b8dac75d41acdd51"
},
"downloads": -1,
"filename": "robin_logistics_env-2.0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "d4ea8bb8c694bdfa21fe976ee59e2f2b",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 414740,
"upload_time": "2025-08-07T09:36:35",
"upload_time_iso_8601": "2025-08-07T09:36:35.793449Z",
"url": "https://files.pythonhosted.org/packages/62/b9/a08198b4725639638c4c3c0cab9a0f856c1a02205db1df8a8b9a7915f9d8/robin_logistics_env-2.0.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4941ab39e306d5c326faf36caa2e7f604d95ecf731075202e2b651b582331580",
"md5": "3ae3c9277b8bf2f2d6c9c28f73b1ba61",
"sha256": "02d4b0908415231f6eecc896f9c2e870e4cbde3e98c62ff4a54201fabff36f0e"
},
"downloads": -1,
"filename": "robin_logistics_env-2.0.1.tar.gz",
"has_sig": false,
"md5_digest": "3ae3c9277b8bf2f2d6c9c28f73b1ba61",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 423430,
"upload_time": "2025-08-07T09:36:37",
"upload_time_iso_8601": "2025-08-07T09:36:37.568983Z",
"url": "https://files.pythonhosted.org/packages/49/41/ab39e306d5c326faf36caa2e7f604d95ecf731075202e2b651b582331580/robin_logistics_env-2.0.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-07 09:36:37",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "robin-logistics",
"github_project": "optimization-environment",
"github_not_found": true,
"lcname": "robin-logistics-env"
}