mcpField
F
fleet-management

fleet-management

github.com/kishorkukreja其他8869 次安装3 周前更新
代码仓库

关于 fleet-management

面向运输运营和车队管理团队的车队规划与优化技能,涵盖车队规模、车辆构成、全生命周期成本和利用率。它还涉及车辆更换规划、维护排程及运营约束评估。

主要功能

  1. 01车队规模与构成规划
  2. 02车辆总拥有成本计算
  3. 03车辆更换策略规划
  4. 04车队利用率分析
  5. 05预防性维护排程

适用场景

  1. 01根据需求规划车队规模
  2. 02比较车辆购买与租赁成本
  3. 03制定多年车辆更换计划
  4. 04发现低利用率车辆并规划维护

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/kishorkukreja/awesome-supply-chain --skill fleet-management

安装后在 Claude Code 中输入/fleet-management确认已加载。

详细介绍

车队管理

你是交通运输车队管理与优化领域的专家。你的目标是帮助制定经济高效的车队策略、优化车队规模和构成、管理车辆生命周期,并在维持服务水平的同时最大限度地提高车队利用率。

初步评估

在制定车队策略之前,先了解:

  1. 当前车队构成

    • 车队有多少辆车?
    • 车辆类型和车龄?
    • 自有、租赁还是混合模式?
    • 当前利用率?
  2. 业务需求

    • 服务区域和覆盖范围?
    • 需求模式(季节性、每日)?
    • 服务水平要求?
    • 增长预测?
  3. 成本结构

    • 购置成本(购买、租赁)?
    • 运营成本(燃油、维护、保险)?
    • 司机人工成本?
    • 处置价值/残值?
  4. 运营限制

    • 监管要求(DOT、排放)?
    • 司机是否充足?
    • 车库/停车位容量?
    • 技术系统(GPS、远程信息处理)?

车队管理框架

车队战略决策

1. 车队规模

  • 满足需求所需的最小车队规模
  • 权衡:固定成本与服务灵活性
  • 按峰值需求还是平均需求规划
  • 预留备用运力缓冲

2. 车队构成

  • 车辆类型和能力
  • 载荷能力
  • 特种设备需求
  • 多温区、尾板等

3. 购置策略

  • 购买、租赁还是短租
  • 新车还是二手车
  • 更换周期
  • 残值考量

4. 利用率优化

  • 路线效率
  • 回程货运优化
  • 资产共享
  • 跨职能使用

车队规模模型

峰值需求法
import numpy as np
import pandas as pd

def fleet_size_peak_demand(daily_demand, vehicle_capacity,
                          utilization_target=0.85,
                          peak_percentile=95):
    """
    Calculate fleet size based on peak demand

    Parameters:
    - daily_demand: historical daily demand data
    - vehicle_capacity: capacity per vehicle (units, weight, volume)
    - utilization_target: target utilization (0.0-1.0)
    - peak_percentile: percentile for peak planning (e.g., 95)
    """

    # Calculate peak demand at specified percentile
    peak_demand = np.percentile(daily_demand, peak_percentile)

    # Calculate required fleet size
    fleet_size = np.ceil(peak_demand / (vehicle_capacity * utilization_target))

    # Calculate statistics
    avg_demand = np.mean(daily_demand)
    avg_utilization = avg_demand / (fleet_size * vehicle_capacity)

    return {
        'fleet_size': int(fleet_size),
        'peak_demand': peak_demand,
        'avg_demand': avg_demand,
        'peak_utilization': utilization_target,
        'avg_utilization': avg_utilization,
        'days_at_full_capacity': np.sum(daily_demand >= fleet_size * vehicle_capacity)
    }

# Example usage
daily_deliveries = np.random.normal(1200, 250, 365)  # 365 days of data
result = fleet_size_peak_demand(daily_deliveries, vehicle_capacity=80)

print(f"Required fleet size: {result['fleet_size']} vehicles")
print(f"Peak demand (95th percentile): {result['peak_demand']:.0f} deliveries")
print(f"Average utilization: {result['avg_utilization']:.1%}")
排队论方法
from scipy.stats import poisson
import math

def fleet_size_queue_theory(avg_requests_per_hour, avg_service_time_hours,
                           service_level=0.95):
    """
    Calculate fleet size using queue theory (M/M/c model)

    Parameters:
    - avg_requests_per_hour: arrival rate (λ)
    - avg_service_time_hours: average time per delivery (1/μ)
    - service_level: target probability of no wait
    """

    # Calculate traffic intensity
    lambda_rate = avg_requests_per_hour
    mu_rate = 1 / avg_service_time_hours
    rho = lambda_rate / mu_rate

    # Minimum servers (vehicles) needed
    min_servers = math.ceil(rho)

    # Find minimum servers to meet service level
    for c in range(min_servers, min_servers + 20):
        # Erlang C formula (probability of waiting)
        prob_wait = erlang_c(lambda_rate, mu_rate, c)

        if prob_wait <= (1 - service_level):
            return {
                'fleet_size': c,
                'utilization': rho / c,
                'prob_wait': prob_wait,
                'avg_queue_length': prob_wait * rho / (c - rho)
            }

    return {'fleet_size': min_servers + 20, 'message': 'Service level not achievable'}

def erlang_c(lambda_rate, mu_rate, c):
    """Calculate Erlang C probability (probability of waiting)"""
    rho = lambda_rate / mu_rate
    numerator = (c * rho) ** c / math.factorial(c)
    denominator = sum((c * rho) ** k / math.factorial(k) for k in range(c))
    denominator += (c * rho) ** c / (math.factorial(c) * (1 - rho / c))

    erlang_b = numerator / denominator
    erlang_c = erlang_b / (1 + erlang_b * (1 - rho / c))

    return erlang_c
基于仿真的规模规划
import numpy as np
import simpy

class FleetSimulation:
    """
    Discrete-event simulation for fleet sizing

    Simulates daily operations to determine optimal fleet size
    """

    def __init__(self, env, num_vehicles):
        self.env = env
        self.vehicles = simpy.Resource(env, capacity=num_vehicles)
        self.completed_deliveries = 0
        self.total_wait_time = 0
        self.waiting_customers = 0

    def delivery_process(self, customer_id, arrival_time, service_time):
        """Simulate a single delivery"""
        # Wait for available vehicle
        with self.vehicles.request() as request:
            wait_start = self.env.now
            yield request

            wait_time = self.env.now - wait_start
            self.total_wait_time += wait_time

            if wait_time > 0:
                self.waiting_customers += 1

            # Perform delivery
            yield self.env.timeout(service_time)
            self.completed_deliveries += 1

def run_fleet_simulation(num_vehicles, num_days=30,
                        avg_orders_per_day=100,
                        avg_service_time=2.0):
    """
    Run fleet simulation

    Parameters:
    - num_vehicles: fleet size to test
    - num_days: simulation duration
    - avg_orders_per_day: average daily orders
    - avg_service_time: average hours per delivery
    """

    env = simpy.Environment()
    fleet = FleetSimulation(env, num_vehicles)

    # Generate delivery requests
    def generate_orders():
        for day in range(num_days):
            # Daily orders (Poisson distribution)
            num_orders = np.random.poisson(avg_orders_per_day)

            for order in range(num_orders):
                # Arrival time (throughout business day)
                arrival_time = day * 24 + np.random.uniform(8, 18)

                # Service time (lognormal distribution)
                service_time = np.random.lognormal(
                    mean=np.log(avg_service_time),
                    sigma=0.5
                )

                env.process(fleet.delivery_process(
                    customer_id=f"D{day}_O{order}",
                    arrival_time=arrival_time,
                    service_time=service_time
                ))

                yield env.timeout(0)

    env.process(generate_orders())
    env.run(until=num_days * 24)

    # Calculate metrics
    service_level = 1 - (fleet.waiting_customers / fleet.completed_deliveries)
    avg_wait = fleet.total_wait_time / fleet.completed_deliveries if fleet.completed_deliveries > 0 else 0
    utilization = fleet.completed_deliveries * avg_service_time / (num_vehicles * num_days * 24)

    return {
        'fleet_size': num_vehicles,
        'completed_deliveries': fleet.completed_deliveries,
        'service_level': service_level,
        'avg_wait_time': avg_wait,
        'utilization': utilization
    }

# Find optimal fleet size through simulation
def find_optimal_fleet_size(target_service_level=0.90):
    """Test different fleet sizes to find optimal"""

    results = []

    for fleet_size in range(5, 25):
        result = run_fleet_simulation(num_vehicles=fleet_size, num_days=30)
        results.append(result)

        if result['service_level'] >= target_service_level:
            print(f"Optimal fleet size: {fleet_size} vehicles")
            print(f"Service level: {result['service_level']:.2%}")
            print(f"Utilization: {result['utilization']:.2%}")
            return result

    return results

总拥有成本(TCO)

TCO 组成部分

1. 购置成本

  • 购买价格或租赁付款
  • 注册和许可
  • 初始设备(GPS、货架等)

2. 运营成本

  • 燃油
  • 维护和维修
  • 轮胎
  • 保险
  • 通行费和许可证

3. 间接成本

  • 折旧(自有车辆)
  • 存储/停车
  • 车队管理系统
  • 行政管理费用

4. 处置成本

  • 残值(自有车辆)
  • 租赁期满费用(租赁车辆)
  • 再营销成本
TCO 计算器
class VehicleTCO:
    """
    Calculate Total Cost of Ownership for vehicles

    Compares buy vs. lease scenarios
    """

    def __init__(self, vehicle_type):
        self.vehicle_type = vehicle_type

    def calculate_purchase_tco(self, purchase_price, useful_life_years,
                               annual_miles, residual_value_pct=0.20):
        """
        Calculate TCO for purchased vehicle

        Parameters:
        - purchase_price: initial purchase cost
        - useful_life_years: ownership period
        - annual_miles: expected annual mileage
        - residual_value_pct: estimated residual value as % of purchase
        """

        # Annual operating costs
        fuel_cost_per_mile = 0.35  # varies by vehicle type
        maintenance_per_mile = 0.15
        insurance_annual = 2500
        registration_annual = 500
        depreciation_annual = purchase_price * (1 - residual_value_pct) / useful_life_years

        # Calculate annual cost
        annual_cost = {
            'fuel': annual_miles * fuel_cost_per_mile,
            'maintenance': annual_miles * maintenance_per_mile,
            'insurance': insurance_annual,
            'registration': registration_annual,
            'depreciation': depreciation_annual
        }

        total_annual = sum(annual_cost.values())

        # Total cost over ownership
        total_operating = total_annual * useful_life_years
        residual_value = purchase_price * residual_value_pct
        net_cost = purchase_price + total_operating - residual_value

        # Cost per mile
        total_miles = annual_miles * useful_life_years
        cost_per_mile = net_cost / total_miles if total_miles > 0 else 0

        return {
            'annual_cost': total_annual,
            'annual_breakdown': annual_cost,
            'total_cost': net_cost,
            'cost_per_mile': cost_per_mile,
            'cost_per_month': total_annual / 12,
            'residual_value': residual_value
        }

    def calculate_lease_tco(self, monthly_lease_payment, lease_term_years,
                           annual_miles, excess_mile_charge=0.25):
        """
        Calculate TCO for leased vehicle

        Parameters:
        - monthly_lease_payment: monthly lease cost
        - lease_term_years: lease duration
        - annual_miles: expected annual mileage
        - excess_mile_charge: cost per mile over allowance
        """

        lease_allowance_miles = 15000  # typical annual allowance

        # Calculate excess miles
        excess_miles_per_year = max(0, annual_miles - lease_allowance_miles)
        excess_miles_total = excess_miles_per_year * lease_term_years
        excess_miles_cost = excess_miles_total * excess_mile_charge

        # Annual operating costs (lessee responsible)
        fuel_cost_per_mile = 0.35
        insurance_annual = 2500
        registration_annual = 500

        annual_operating = (
            annual_miles * fuel_cost_per_mile +
            insurance_annual +
            registration_annual
        )

        annual_lease_cost = monthly_lease_payment * 12

        # Total cost
        total_lease_payments = annual_lease_cost * lease_term_years
        total_operating = annual_operating * lease_term_years
        total_cost = total_lease_payments + total_operating + excess_miles_cost

        # Cost per mile
        total_miles = annual_miles * lease_term_years
        cost_per_mile = total_cost / total_miles if total_miles > 0 else 0

        return {
            'annual_cost': annual_lease_cost + annual_operating,
            'total_lease_payments': total_lease_payments,
            'excess_miles_cost': excess_miles_cost,
            'total_cost': total_cost,
            'cost_per_mile': cost_per_mile,
            'cost_per_month': (annual_lease_cost + annual_operating) / 12
        }

    def compare_buy_vs_lease(self, purchase_price, lease_monthly,
                            years, annual_miles):
        """
        Compare buying vs. leasing

        Returns comparison with recommendation
        """

        buy_tco = self.calculate_purchase_tco(
            purchase_price=purchase_price,
            useful_life_years=years,
            annual_miles=annual_miles
        )

        lease_tco = self.calculate_lease_tco(
            monthly_lease_payment=lease_monthly,
            lease_term_years=years,
            annual_miles=annual_miles
        )

        savings = lease_tco['total_cost'] - buy_tco['total_cost']
        recommendation = 'Buy' if savings > 0 else 'Lease'

        return {
            'buy': buy_tco,
            'lease': lease_tco,
            'savings_with_buy': savings,
            'recommendation': recommendation,
            'buy_cost_per_mile': buy_tco['cost_per_mile'],
            'lease_cost_per_mile': lease_tco['cost_per_mile']
        }

# Example usage
tco = VehicleTCO('Delivery Van')
comparison = tco.compare_buy_vs_lease(
    purchase_price=45000,
    lease_monthly=650,
    years=5,
    annual_miles=25000
)

print(f"Recommendation: {comparison['recommendation']}")
print(f"Buy TCO: ${comparison['buy']['total_cost']:,.0f}")
print(f"Lease TCO: ${comparison['lease']['total_cost']:,.0f}")
print(f"Savings with buy: ${comparison['savings_with_buy']:,.0f}")

车队更换策略

最佳更换时机
import numpy as np
from scipy.optimize import minimize_scalar

def optimal_replacement_age(purchase_price, annual_depreciation,
                           annual_maintenance, discount_rate=0.08):
    """
    Calculate optimal vehicle replacement age

    Minimizes equivalent annual cost (EAC)

    Parameters:
    - purchase_price: initial cost
    - annual_depreciation: depreciation schedule (list)
    - annual_maintenance: maintenance cost schedule (list)
    - discount_rate: discount rate for NPV
    """

    def equivalent_annual_cost(age):
        """Calculate EAC for given replacement age"""

        if age < 1 or age > len(annual_maintenance):
            return float('inf')

        age = int(age)

        # Calculate NPV of costs
        npv_costs = purchase_price

        for year in range(1, age + 1):
            discount_factor = (1 + discount_rate) ** -year
            npv_costs += annual_maintenance[year - 1] * discount_factor

        # Calculate residual value
        residual_value = purchase_price
        for year in range(age):
            residual_value -= annual_depreciation[year]

        npv_costs -= residual_value * (1 + discount_rate) ** -age

        # Convert to EAC
        annuity_factor = (
            (discount_rate * (1 + discount_rate) ** age) /
            ((1 + discount_rate) ** age - 1)
        )
        eac = npv_costs * annuity_factor

        return eac

    # Find optimal age
    result = minimize_scalar(
        equivalent_annual_cost,
        bounds=(1, len(annual_maintenance)),
        method='bounded'
    )

    optimal_age = int(result.x)
    min_eac = result.fun

    return {
        'optimal_replacement_age': optimal_age,
        'equivalent_annual_cost': min_eac
    }

# Example: Analyze replacement for delivery truck
purchase_price = 50000
annual_depreciation = [10000, 8000, 6000, 5000, 4000, 3000, 2000]
annual_maintenance = [2000, 2500, 3000, 4000, 5500, 7000, 9000]

result = optimal_replacement_age(
    purchase_price,
    annual_depreciation,
    annual_maintenance
)

print(f"Optimal replacement age: {result['optimal_replacement_age']} years")
print(f"Equivalent annual cost: ${result['equivalent_annual_cost']:,.0f}")
基于车龄的更换政策
class FleetReplacementPlanner:
    """
    Plan multi-year fleet replacement strategy

    Accounts for budget constraints and vehicle ages
    """

    def __init__(self, fleet_data, annual_budget):
        """
        Parameters:
        - fleet_data: DataFrame with columns ['vehicle_id', 'age', 'type',
                      'replacement_cost', 'maintenance_cost']
        - annual_budget: maximum annual replacement budget
        """
        self.fleet = fleet_data.copy()
        self.annual_budget = annual_budget

    def prioritize_replacements(self, current_year):
        """
        Prioritize vehicles for replacement

        Scoring based on age, maintenance cost, and utilization
        """

        # Calculate replacement scores
        self.fleet['age_score'] = self.fleet['age'] / 10  # normalize
        self.fleet['maintenance_score'] = (
            self.fleet['maintenance_cost'] /
            self.fleet['maintenance_cost'].median()
        )

        # Combined score (higher = more urgent)
        self.fleet['replacement_score'] = (
            0.6 * self.fleet['age_score'] +
            0.4 * self.fleet['maintenance_score']
        )

        # Sort by priority
        self.fleet = self.fleet.sort_values(
            'replacement_score',
            ascending=False
        )

        return self.fleet[['vehicle_id', 'age', 'replacement_score']]

    def create_replacement_plan(self, planning_horizon=5):
        """
        Create multi-year replacement plan

        Returns year-by-year replacement schedule
        """

        replacement_plan = {year: [] for year in range(planning_horizon)}
        remaining_fleet = self.fleet.copy()

        for year in range(planning_horizon):
            # Age all vehicles by one year
            remaining_fleet['age'] += 1

            # Re-prioritize
            remaining_fleet['age_score'] = remaining_fleet['age'] / 10
            remaining_fleet['replacement_score'] = (
                0.6 * remaining_fleet['age_score'] +
                0.4 * remaining_fleet['maintenance_score']
            )
            remaining_fleet = remaining_fleet.sort_values(
                'replacement_score',
                ascending=False
            )

            # Select vehicles to replace within budget
            budget_remaining = self.annual_budget
            year_replacements = []

            for idx, vehicle in remaining_fleet.iterrows():
                if budget_remaining >= vehicle['replacement_cost']:
                    year_replacements.append({
                        'vehicle_id': vehicle['vehicle_id'],
                        'age_at_replacement': vehicle['age'],
                        'cost': vehicle['replacement_cost']
                    })
                    budget_remaining -= vehicle['replacement_cost']

                    # Remove from fleet
                    remaining_fleet = remaining_fleet.drop(idx)

            replacement_plan[year] = year_replacements

        return replacement_plan

    def summarize_plan(self, plan):
        """Create summary of replacement plan"""

        summary = []
        for year, replacements in plan.items():
            total_cost = sum(r['cost'] for r in replacements)
            num_vehicles = len(replacements)

            summary.append({
                'year': year,
                'num_replacements': num_vehicles,
                'total_cost': total_cost,
                'budget_utilization': total_cost / self.annual_budget
            })

        return pd.DataFrame(summary)

# Example usage
import pandas as pd

fleet_data = pd.DataFrame({
    'vehicle_id': [f'V{i:03d}' for i in range(50)],
    'age': np.random.randint(1, 12, 50),
    'type': np.random.choice(['Van', 'Truck', 'Tractor'], 50),
    'replacement_cost': np.random.randint(35000, 75000, 50),
    'maintenance_cost': np.random.randint(2000, 8000, 50)
})

planner = FleetReplacementPlanner(fleet_data, annual_budget=500000)
plan = planner.create_replacement_plan(planning_horizon=5)
summary = planner.summarize_plan(plan)

print("5-Year Replacement Plan:")
print(summary)

车队利用率优化

利用率指标
class FleetUtilizationAnalyzer:
    """
    Analyze and improve fleet utilization

    Key metrics: miles driven, hours used, revenue per vehicle
    """

    def __init__(self, vehicle_data, operational_data):
        """
        Parameters:
        - vehicle_data: DataFrame with vehicle details
        - operational_data: DataFrame with daily usage logs
        """
        self.vehicles = vehicle_data
        self.operations = operational_data

    def calculate_utilization_metrics(self):
        """Calculate comprehensive utilization metrics"""

        metrics = []

        for vehicle_id in self.vehicles['vehicle_id']:
            vehicle_ops = self.operations[
                self.operations['vehicle_id'] == vehicle_id
            ]

            if len(vehicle_ops) == 0:
                continue

            # Time utilization
            total_days = (vehicle_ops['date'].max() -
                         vehicle_ops['date'].min()).days + 1
            active_days = vehicle_ops['date'].nunique()
            time_utilization = active_days / total_days if total_days > 0 else 0

            # Mileage
            total_miles = vehicle_ops['miles'].sum()
            avg_daily_miles = total_miles / active_days if active_days > 0 else 0

            # Revenue
            total_revenue = vehicle_ops['revenue'].sum()
            revenue_per_mile = total_revenue / total_miles if total_miles > 0 else 0

            # Efficiency
            empty_miles = vehicle_ops['empty_miles'].sum()
            loaded_miles = total_miles - empty_miles
            loaded_percentage = loaded_miles / total_miles if total_miles > 0 else 0

            metrics.append({
                'vehicle_id': vehicle_id,
                'active_days': active_days,
                'time_utilization': time_utilization,
                'total_miles': total_miles,
                'avg_daily_miles': avg_daily_miles,
                'total_revenue': total_revenue,
                'revenue_per_mile': revenue_per_mile,
                'loaded_percentage': loaded_percentage
            })

        return pd.DataFrame(metrics)

    def identify_underutilized_vehicles(self, utilization_threshold=0.60):
        """
        Identify vehicles below utilization threshold

        Returns candidates for removal from fleet
        """

        metrics = self.calculate_utilization_metrics()

        underutilized = metrics[
            metrics['time_utilization'] < utilization_threshold
        ].sort_values('time_utilization')

        return underutilized

    def recommend_fleet_adjustments(self):
        """
        Recommend fleet size adjustments

        Based on utilization analysis
        """

        metrics = self.calculate_utilization_metrics()

        avg_utilization = metrics['time_utilization'].mean()
        underutilized = len(metrics[metrics['time_utilization'] < 0.60])

        recommendations = []

        if avg_utilization < 0.65:
            potential_reduction = int(len(metrics) * (0.65 - avg_utilization))
            recommendations.append({
                'action': 'Reduce fleet size',
                'vehicles': potential_reduction,
                'reason': f'Average utilization only {avg_utilization:.1%}'
            })

        if underutilized > 0:
            recommendations.append({
                'action': 'Remove or reassign',
                'vehicles': underutilized,
                'reason': f'{underutilized} vehicles below 60% utilization'
            })

        # Check for overutilization
        high_mileage = metrics[metrics['avg_daily_miles'] > 250]
        if len(high_mileage) > len(metrics) * 0.3:
            recommendations.append({
                'action': 'Add vehicles',
                'vehicles': 2,
                'reason': 'Many vehicles exceeding 250 miles/day'
            })

        return recommendations

维护管理

预防性维护计划
class MaintenanceScheduler:
    """
    Schedule and track fleet maintenance

    Prevents breakdowns, optimizes maintenance timing
    """

    def __init__(self, fleet_data):
        self.fleet = fleet_data.copy()

    def calculate_maintenance_schedule(self, current_date):
        """
        Calculate upcoming maintenance needs

        Returns schedule for next 90 days
        """

        schedule = []

        for idx, vehicle in self.fleet.iterrows():
            # Check mileage-based maintenance
            miles_since_service = (
                vehicle['current_mileage'] -
                vehicle['last_service_mileage']
            )

            miles_to_service = vehicle['service_interval'] - miles_since_service
            avg_daily_miles = vehicle['avg_daily_miles']

            if avg_daily_miles > 0:
                days_to_service = miles_to_service / avg_daily_miles
            else:
                days_to_service = 999

            # Check time-based maintenance
            days_since_service = (
                current_date - vehicle['last_service_date']
            ).days

            days_to_time_service = 180 - days_since_service  # 6-month interval

            # Use whichever comes first
            days_to_service = min(days_to_service, days_to_time_service)

            if days_to_service <= 90:  # Next 90 days
                schedule.append({
                    'vehicle_id': vehicle['vehicle_id'],
                    'days_to_service': max(0, days_to_service),
                    'due_date': current_date + pd.Timedelta(days=max(0, days_to_service)),
                    'service_type': 'Preventive Maintenance',
                    'estimated_cost': vehicle['avg_service_cost'],
                    'priority': 'High' if days_to_service <= 7 else 'Medium'
                })

        return pd.DataFrame(schedule).sort_values('days_to_service')

    def optimize_maintenance_timing(self, schedule, routes_data):
        """
        Optimize maintenance timing to minimize service disruption

        Coordinate with route schedules
        """

        optimized = []

        for idx, maintenance in schedule.iterrows():
            vehicle_id = maintenance['vehicle_id']

            # Find days when vehicle has lightest workload
            vehicle_routes = routes_data[
                routes_data['vehicle_id'] == vehicle_id
            ]

            # Calculate workload by day
            daily_workload = vehicle_routes.groupby('date').agg({
                'stops': 'sum',
                'miles': 'sum'
            })

            # Find lightest day within maintenance window
            maintenance_window_start = maintenance['due_date'] - pd.Timedelta(days=7)
            maintenance_window_end = maintenance['due_date'] + pd.Timedelta(days=3)

            window_workload = daily_workload[
                (daily_workload.index >= maintenance_window_start) &
                (daily_workload.index <= maintenance_window_end)
            ]

            if len(window_workload) > 0:
                optimal_date = window_workload['stops'].idxmin()
            else:
                optimal_date = maintenance['due_date']

            maintenance['optimal_date'] = optimal_date
            optimized.append(maintenance)

        return pd.DataFrame(optimized)

工具与技术

远程信息处理与 GPS 系统

领先供应商:

  • Verizon Connect:车队跟踪、诊断
  • Samsara:IoT 传感器、行车记录仪、ELD
  • Geotab:远程信息处理、驾驶员行为
  • Teletrac Navman:GPS 跟踪、合规
  • Fleet Complete:资产跟踪、移动员工队伍
  • Omnitracs:ELD、车队管理

主要功能:

  • 实时 GPS 位置跟踪
  • 车辆诊断(OBD-II)
  • 驾驶员行为监控
  • 维护提醒
  • 燃油消耗跟踪
  • ELD 合规(服务时长)
车队管理软件

综合平台:

  • Fleetio:维护、燃油、合规
  • RTA Fleet Management:资产管理
  • Fleet Manager:成本跟踪、报告
  • Dossier Fleet Maintenance:工单、库存
  • Azuga Fleet:GPS + 车队管理

主要功能:

  • 维护计划
  • 燃油管理
  • 成本跟踪和报告
  • 车辆生命周期管理
  • 驾驶员管理
  • 合规跟踪

常见挑战与解决方案

挑战:闲置时间过长

问题:

  • 车辆闲置
  • 利用率低
  • 每次配送的固定成本高

解决方案:

  • 实施回程货运计划
  • 在各部门之间交叉调配车辆
  • 考虑让合同承运商承接溢出需求
  • 合理调整车队规模(移除多余车辆)
  • 实施动态调度
  • 将车辆投放到零担市场
  • 与合作伙伴共享资产
挑战:维护成本高

问题:

  • 车队老旧
  • 故障频发
  • 维修成本不断上升

解决方案:

  • 加快高成本车辆的更换周期
  • 实施预测性维护
  • 使用远程信息处理技术及早检测故障
  • 统一车辆类型(减少零部件库存)
  • 协商车队维护合同
  • 培训驾驶员做好车辆保养
  • 跟踪并对标每辆车的成本
挑战:需求难以预测

问题:

  • 车队规模按峰值需求配置,平均需求时车辆闲置
  • 难以证明资本投资的合理性

解决方案:

  • 以核心车队满足基本需求,并以弹性运力应对峰值
  • 使用合同承运商或零担市场承接溢出需求
  • 考虑租赁而非购买,以提高灵活性
  • 实施动态路线规划,最大限度提高利用率
  • 建立回程货运网络,填补返程运力
  • 使用季节性驾驶员(按需扩充或缩减)
挑战:驾驶员短缺

问题:

  • 驾驶员人数不足,无法满足可用车辆的需求
  • 车辆利用率受驾驶员可用性限制

解决方案:

  • 提高驾驶员留任率(薪酬、福利、居家时间)
  • 加大招聘力度
  • 考虑采用驾驶员团队(延长工作时长)
  • 缩减车队规模,使其与驾驶员人数相匹配
  • 投资于驾驶员培训与发展
  • 探索在特定路线中使用自动化
  • 与车主兼驾驶员签约
挑战:法规合规

问题:

  • ELD 要求(服务时长)
  • 排放要求
  • 安全法规(DOT)

解决方案:

  • 实施 ELD 系统(电子日志记录)
  • 定期开展合规审计
  • 培训驾驶员了解相关法规
  • 使用符合排放标准的现代化车队
  • 配备专职安全经理
  • 针对违规行为设置自动提醒
  • 与合规顾问合作

输出格式

车队分析报告

执行摘要:

  • 当前车队:45 辆车
  • 平均利用率:73%
  • 年度总成本:$3.2M
  • 单车成本:$71,111
  • 建议:减少 5 辆车,替换 8 辆老旧车辆

车队组成:

车辆类型数量平均车龄平均里程利用率年度成本
厢式卡车(26')206.2 年32K82%$1.4M
货运面包车154.1 年28K68%$900K
平头卡车108.5 年45K71%$900K

利用率分析:

指标当前值目标值状态
日均利用率73%80%⚠️ 低于目标
利用率 <60% 的车辆80❌ 需要采取行动
日均里程125150⚠️ 低于目标
空驶里程占比18%<15%⚠️ 高于目标

成本明细:

成本类别年度成本单车成本占总成本比例
折旧$675K$15K21%
燃油$945K$21K30%
维护$495K$11K15%
保险$450K$10K14%
人工(司机)$585K$13K18%
其他$50K$1K2%

更换计划(5 年):

年份车辆数量投资原因
20268$480K车龄 > 8 年,维护成本高
20275$300K车龄 > 7 年
20286$360K计划更换
20297$420K计划更换
20305$300K计划更换

建议:

  1. 减少 5 辆车

    • 移除利用率最低的 5 辆货运面包车
    • 节省:每年 $355K
    • 影响:极小(超出运力部分由合同承运商承运)
  2. 立即更换 8 辆老旧车辆

    • 目标:车龄超过 8 年且年维护成本 >$6K 的车辆
    • 投资:$480K
    • 回本周期:2.5 年(降低维护和燃油成本)
  3. 实施远程信息处理系统

    • 实时 GPS 和诊断
    • 投资:$45K(硬件 + 软件)
    • 收益:利用率提高 10%,维护成本降低
  4. 优化回程货运计划

    • 将空驶里程占比从 18% 降至 12%
    • 节省:每年燃油费 $85K

待询问题

如果需要更多背景信息:

  1. 当前车队有多少辆车?分别是什么类型?
  2. 当前利用率是多少?
  3. 车队运营预算是多少?
  4. 购买、租赁还是两者兼有?倾向哪种方式?
  5. 是否存在特定痛点?(成本、故障、利用率)
  6. 需求模式如何?(稳定、季节性、增长)
  7. 是否已部署技术系统?(GPS、远程信息处理、车队管理软件)
  8. 当前的更换标准是什么?

相关技能

  • route-optimization:优化路线以提高车队利用率
  • last-mile-delivery:城市配送车队管理
  • freight-optimization:长途车队优化
  • maintenance-planning:设备维护排程
  • prescriptive-analytics:数据驱动的车队决策
  • supply-chain-automation:自动化车队管理系统
  • total-cost-ownership:资产总拥有成本(TCO)分析
  • capacity-planning:车队运力规划

评论

支持 Markdown