254 lines
6.4 KiB
Markdown
254 lines
6.4 KiB
Markdown
# Racing A* Web Service
|
||
|
||
Микросервис для решения задачи "Гонки на бумаге" с использованием алгоритма A*.
|
||
|
||
## Быстрый старт
|
||
|
||
### 1. Запуск сервиса
|
||
|
||
```bash
|
||
# Используя скрипт (рекомендуется)
|
||
./run-webservice.sh
|
||
|
||
# Или напрямую
|
||
dotnet run --project racing-webservice.csproj
|
||
|
||
# На другом порту
|
||
PORT=8080 ./run-webservice.sh
|
||
```
|
||
|
||
Сервис запустится на `http://localhost:5000` (по умолчанию)
|
||
|
||
### 2. Проверка работоспособности
|
||
|
||
```bash
|
||
curl http://localhost:5000/health
|
||
```
|
||
|
||
### 3. Решение карты
|
||
|
||
```bash
|
||
# Используя готовую карту
|
||
curl -X POST http://localhost:5000/solve \
|
||
-H "Content-Type: application/json" \
|
||
-d @maps/simple-test.json
|
||
|
||
# Или создайте свою карту
|
||
curl -X POST http://localhost:5000/solve \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"map": [
|
||
[0, 0, 0, 0, 0],
|
||
[0, 1, 1, 1, 0],
|
||
[0, 0, 4, 0, 0],
|
||
[0, 1, 1, 1, 0],
|
||
[5, 0, 0, 0, 0]
|
||
]
|
||
}'
|
||
```
|
||
|
||
## API Endpoints
|
||
|
||
### GET /
|
||
Информация о сервисе и доступных endpoints
|
||
|
||
### GET /health
|
||
Health check endpoint для мониторинга
|
||
|
||
### POST /solve
|
||
**Основной endpoint** - решение карты гонок
|
||
|
||
**Request Body:**
|
||
```json
|
||
{
|
||
"map": [[0, 0, 4], [5, 0, 0], [0, 0, 0]],
|
||
"maxIterations": 5000000,
|
||
"timeoutSeconds": 60
|
||
}
|
||
```
|
||
|
||
**Response (успех):**
|
||
```json
|
||
{
|
||
"success": true,
|
||
"solution": [[0, 0], [1, 1], [1, 0], ...],
|
||
"statistics": {
|
||
"steps": 15,
|
||
"checkpoints": 1,
|
||
"iterations": 1234,
|
||
"computeTimeSeconds": 0.52,
|
||
"maxSpeed": 6
|
||
}
|
||
}
|
||
```
|
||
|
||
**Response (ошибка):**
|
||
```json
|
||
{
|
||
"success": false,
|
||
"error": "No solution found within the iteration limit",
|
||
"solution": null,
|
||
"statistics": null
|
||
}
|
||
```
|
||
|
||
## Формат карты
|
||
|
||
- `0` - дорога (нормальное ускорение ±2)
|
||
- `1` - препятствие/камень (нельзя останавливаться)
|
||
- `2` - снег (ограниченное ускорение ±1)
|
||
- `3` - лёд (ускорение нельзя менять)
|
||
- `4` - чекпоинт (нужно посетить все)
|
||
- `5` - старт (стартовая позиция)
|
||
|
||
## Примеры использования
|
||
|
||
### Bash/cURL
|
||
|
||
```bash
|
||
# Тестовый скрипт
|
||
./test-api.sh
|
||
|
||
# Решить карту и сохранить результат
|
||
curl -X POST http://localhost:5000/solve \
|
||
-H "Content-Type: application/json" \
|
||
-d @maps/racing-map-15x15.json \
|
||
| jq '.solution | {solution: .}' > solution.json
|
||
```
|
||
|
||
### Python
|
||
|
||
```bash
|
||
# Используя готовый клиент
|
||
./example-client.py maps/simple-test.json solution.json
|
||
|
||
# Или импортируйте в свой код
|
||
python3 example-client.py maps/racing-map-15x15.json my-solution.json
|
||
```
|
||
|
||
```python
|
||
import requests
|
||
import json
|
||
|
||
# Решение карты
|
||
with open('maps/simple-test.json') as f:
|
||
map_data = json.load(f)
|
||
|
||
response = requests.post(
|
||
'http://localhost:5000/solve',
|
||
json=map_data
|
||
)
|
||
|
||
result = response.json()
|
||
if result['success']:
|
||
print(f"✓ Найдено решение за {result['statistics']['steps']} шагов")
|
||
with open('solution.json', 'w') as f:
|
||
json.dump({'solution': result['solution']}, f, indent=2)
|
||
```
|
||
|
||
### JavaScript/Node.js
|
||
|
||
```javascript
|
||
const fetch = require('node-fetch');
|
||
const fs = require('fs');
|
||
|
||
async function solveMap() {
|
||
const mapData = JSON.parse(fs.readFileSync('maps/simple-test.json'));
|
||
|
||
const response = await fetch('http://localhost:5000/solve', {
|
||
method: 'POST',
|
||
headers: { 'Content-Type': 'application/json' },
|
||
body: JSON.stringify(mapData)
|
||
});
|
||
|
||
const result = await response.json();
|
||
|
||
if (result.success) {
|
||
console.log(`✓ Solution found: ${result.statistics.steps} steps`);
|
||
fs.writeFileSync('solution.json',
|
||
JSON.stringify({ solution: result.solution }, null, 2));
|
||
}
|
||
}
|
||
|
||
solveMap();
|
||
```
|
||
|
||
## Архитектура
|
||
|
||
```
|
||
racing/
|
||
├── ProgramAStar.cs # Ядро A* алгоритма
|
||
├── ProgramWebService.cs # Web API
|
||
├── racing-webservice.csproj # Конфигурация проекта
|
||
├── run-webservice.sh # Скрипт запуска
|
||
├── test-api.sh # Тестирование API
|
||
└── example-client.py # Пример Python клиента
|
||
```
|
||
|
||
## Производительность
|
||
|
||
| Сложность | Чекпоинты | Примерное время |
|
||
|-----------|-----------|-----------------|
|
||
| Простая | 1-5 | < 1 сек |
|
||
| Средняя | 5-15 | 1-10 сек |
|
||
| Сложная | 15-40 | 10-120 сек |
|
||
|
||
## Конфигурация
|
||
|
||
### Переменные окружения
|
||
|
||
- `PORT` - порт для запуска сервиса (по умолчанию: 5000)
|
||
|
||
```bash
|
||
PORT=8080 dotnet run --project racing-webservice.csproj
|
||
```
|
||
|
||
### Параметры запроса
|
||
|
||
- `maxIterations` - максимальное количество итераций A* (по умолчанию: 5000000)
|
||
- `timeoutSeconds` - таймаут выполнения в секундах (опционально)
|
||
|
||
## Мониторинг
|
||
|
||
```bash
|
||
# Health check
|
||
curl http://localhost:5000/health
|
||
|
||
# С использованием watch для мониторинга
|
||
watch -n 1 'curl -s http://localhost:5000/health | jq .'
|
||
```
|
||
|
||
## Troubleshooting
|
||
|
||
### Порт уже занят
|
||
```bash
|
||
# Проверьте, что использует порт 5000
|
||
netstat -tuln | grep 5000
|
||
|
||
# Используйте другой порт
|
||
PORT=8080 ./run-webservice.sh
|
||
```
|
||
|
||
### Решение не найдено
|
||
- Увеличьте `maxIterations` в запросе
|
||
- Упростите карту (меньше чекпоинтов, меньше препятствий)
|
||
- Проверьте, что все чекпоинты достижимы
|
||
|
||
### Сервис не отвечает
|
||
```bash
|
||
# Проверьте, что сервис запущен
|
||
ps aux | grep racing-webservice
|
||
|
||
# Перезапустите сервис
|
||
./run-webservice.sh
|
||
```
|
||
|
||
## Полная документация
|
||
|
||
См. [API-DOCUMENTATION.md](API-DOCUMENTATION.md) для подробной документации API.
|
||
|
||
## Лицензия
|
||
|
||
См. основной [README.md](README.md)
|
||
|