add web-service

This commit is contained in:
2025-10-20 23:07:10 +05:00
parent a74b8bbb5d
commit 4f9417a032
10 changed files with 1266 additions and 282 deletions

253
WEBSERVICE-README.md Normal file
View File

@@ -0,0 +1,253 @@
# 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)