fuel-distribution について
Fuel Distributionは、小売燃料の配送と石油製品の物流を扱うスキルです。ターミナル、車両、給油所の運用計画向けに、在庫、需要予測、配送ルートと配車、ターミナル積込、価格設定を扱います。
主な機能
- 01給油所の燃料在庫計画
- 02多室タンクローリーの経路最適化
- 03ターミナルの積込場所と時間枠の調整
- 04天候や季節を考慮した需要予測
- 05コストと競合価格に基づく価格最適化
活用シーン
- 01時間枠に沿った複数製品の配送計画
- 02小売給油所の燃料欠品防止
- 03ターミナル積込とトラック稼働の調整
- 04需要変化に応じた在庫と価格の検討
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ kishorkukreja/ awesome-supply-chain --skill fuel-distributionインストール後、Claude Code で/fuel-distributionを入力して読み込まれたか確認します。
詳細
燃料の配送
小売燃料の配送と石油製品の物流に精通した専門家として、ガソリン、ディーゼル、その他の石油製品をターミナルから小売店へ効率的に配送できるよう支援します。配送スケジュール、在庫水準、輸送効率を管理し、欠品を防ぐことが目標です。
初期評価
燃料配送を最適化する前に、次の点を把握してください。
-
ネットワーク構造
- 小売拠点はいくつありますか?(ガソリンスタンド、フリート施設)
- ターミナルの所在地と処理能力は?
- 対象となる地理的範囲は?
- ブランド付きとノーブランドのスタンドはそれぞれいくつありますか?
-
需要の特性
- 拠点ごとの日次販売量は?
- 季節的な傾向はありますか?(夏季のドライブ、休日)
- 製品構成は?(レギュラー、ミッドグレード、プレミアム、ディーゼル)
- 需要の変動性と傾向は?
-
配送業務
- フリートの規模とタンクローリーの容量は?
- 配送可能時間と制限事項は?
- 複数区画のタンクローリー(複数製品対応)はありますか?
- ドライバーの稼働状況と規制は?
-
目標と制約
- 主な目標は?(コスト削減、欠品防止、サービス向上)
- 予算上の制約は?
- サービスレベル要件は?(補充頻度、緊急配送)
- 環境規制と安全規制は?
燃料配送のフレームワーク
サプライチェーン構造
上流(供給):
- 製油所
- パイプラインターミナル
- 海上輸入ターミナル
- バルク貯蔵施設
配送(物流):
- 主要ターミナル(一括受け入れ)
- 二次ターミナル(地域配送)
- タンクローリーのフリート
- 配送スケジュールとルート設定
下流(小売):
- ガソリンスタンド(コンビニエンスストア併設店)
- フリート向け給油施設
- カードロック式給油所
- 法人顧客
小売店の在庫管理
タンク在庫の最適化
import numpy as np
import pandas as pd
from datetime import datetime, timedelta
class FuelStationInventory:
"""
Manage inventory for retail fuel station with multiple tanks
"""
def __init__(self, station_id, tanks, daily_sales_forecast):
self.station_id = station_id
self.tanks = tanks # list of {product, capacity_gallons, current_level}
self.forecast = daily_sales_forecast
def calculate_reorder_point(self, product, lead_time_days=1,
service_level=0.95):
"""
Calculate reorder point for fuel tank
Reorder Point = (Avg Daily Sales × Lead Time) + Safety Stock
"""
from scipy.stats import norm
# Get historical sales for this product
product_sales = [day[product] for day in self.forecast
if product in day]
avg_daily_sales = np.mean(product_sales)
std_daily_sales = np.std(product_sales)
# Safety stock calculation
z_score = norm.ppf(service_level)
safety_stock = z_score * std_daily_sales * np.sqrt(lead_time_days)
reorder_point = (avg_daily_sales * lead_time_days) + safety_stock
# Tank capacity constraint
tank = next((t for t in self.tanks if t['product'] == product), None)
if tank:
max_order = tank['capacity_gallons'] - reorder_point
return {
'reorder_point_gallons': reorder_point,
'order_quantity_gallons': max_order,
'avg_daily_sales': avg_daily_sales,
'safety_stock': safety_stock,
'days_of_supply': reorder_point / avg_daily_sales
}
def forecast_runout_time(self, product, current_level_gallons):
"""
Forecast when tank will run out (hours from now)
"""
product_sales = [day[product] for day in self.forecast
if product in day]
avg_hourly_sales = np.mean(product_sales) / 24
if avg_hourly_sales > 0:
hours_until_runout = current_level_gallons / avg_hourly_sales
return hours_until_runout
else:
return float('inf')
def check_delivery_needed(self):
"""
Check if delivery is needed for any product
Returns list of products needing delivery
"""
delivery_needed = []
for tank in self.tanks:
product = tank['product']
current_level = tank['current_level']
capacity = tank['capacity_gallons']
reorder_params = self.calculate_reorder_point(product)
reorder_point = reorder_params['reorder_point_gallons']
if current_level <= reorder_point:
hours_to_runout = self.forecast_runout_time(product, current_level)
delivery_needed.append({
'station': self.station_id,
'product': product,
'current_level': current_level,
'capacity': capacity,
'fill_to_level': capacity * 0.95, # Leave 5% ullage
'delivery_quantity': (capacity * 0.95) - current_level,
'hours_until_runout': hours_to_runout,
'priority': 'HIGH' if hours_to_runout < 12 else 'NORMAL'
})
return delivery_needed
# Example usage
tanks = [
{'product': 'Regular', 'capacity_gallons': 12000, 'current_level': 3000},
{'product': 'Premium', 'capacity_gallons': 8000, 'current_level': 5000},
{'product': 'Diesel', 'capacity_gallons': 10000, 'current_level': 2500},
]
# Forecast: daily sales by product
forecast = [
{'Regular': 4000, 'Premium': 1500, 'Diesel': 2000},
{'Regular': 4500, 'Premium': 1600, 'Diesel': 2100},
# ... more days
]
station = FuelStationInventory('Station_001', tanks, forecast)
deliveries = station.check_delivery_needed()
for delivery in deliveries:
print(f"{delivery['product']}: {delivery['delivery_quantity']:.0f} gallons needed "
f"(Priority: {delivery['priority']}, Runout: {delivery['hours_until_runout']:.1f} hrs)")
配送ルートとスケジュール
複数区画タンクローリーのルート設定
def optimize_fuel_delivery_routes(stations, terminal_location, trucks,
time_windows):
"""
Optimize fuel delivery routes for multi-compartment tank trucks
Vehicle Routing Problem with:
- Time windows
- Multiple products
- Compartment constraints
- Split deliveries allowed
Parameters:
- stations: list of stations with delivery requirements
- terminal_location: depot coordinates
- trucks: list of available trucks with compartment configurations
- time_windows: delivery time windows by station
"""
from pulp import *
import numpy as np
prob = LpProblem("Fuel_Delivery_Routing", LpMinimize)
# Decision variables
# x[t, i, j]: truck t travels from station i to station j
x = {}
for t, truck in enumerate(trucks):
for i in range(len(stations) + 1): # +1 for terminal
for j in range(len(stations) + 1):
if i != j:
x[t, i, j] = LpVariable(f"x_{t}_{i}_{j}", cat='Binary')
# y[t, s, p]: truck t delivers product p to station s
y = {}
for t, truck in enumerate(trucks):
for s, station in enumerate(stations):
for product in ['Regular', 'Premium', 'Diesel']:
y[t, s, product] = LpVariable(f"y_{t}_{s}_{product}",
lowBound=0)
# Arrival time at each station
arrival_time = {}
for t, truck in enumerate(trucks):
for s in range(len(stations)):
arrival_time[t, s] = LpVariable(f"arrival_{t}_{s}",
lowBound=0)
# Objective: minimize total distance + time window penalties
total_distance = []
for t, truck in enumerate(trucks):
for i in range(len(stations) + 1):
for j in range(len(stations) + 1):
if i != j:
loc_i = terminal_location if i == 0 else stations[i-1]['location']
loc_j = terminal_location if j == 0 else stations[j-1]['location']
distance = calculate_distance(loc_i, loc_j)
total_distance.append(distance * x[t, i, j])
prob += lpSum(total_distance)
# Constraints
# Each station's demand must be satisfied
for s, station in enumerate(stations):
for product in station['delivery_needs']:
required = station['delivery_needs'][product]
prob += lpSum([y[t, s, product] for t in range(len(trucks))]) >= required
# Truck compartment capacity
for t, truck in enumerate(trucks):
for product in ['Regular', 'Premium', 'Diesel']:
# Sum of deliveries ≤ compartment capacity for that product
comp_capacity = truck['compartments'].get(product, 0)
prob += lpSum([y[t, s, product] for s in range(len(stations))]) <= \
comp_capacity
# If truck delivers to station, it must visit station
for t, truck in enumerate(trucks):
for s, station in enumerate(stations):
total_delivery = lpSum([y[t, s, p] for p in ['Regular', 'Premium', 'Diesel']])
# If total_delivery > 0, truck must visit
visits = lpSum([x[t, i, s+1] for i in range(len(stations) + 1) if i != s+1])
prob += total_delivery <= truck['total_capacity'] * visits
# Flow conservation: if truck enters, it must leave
for t, truck in enumerate(trucks):
for j in range(1, len(stations) + 1): # stations only (not terminal)
inflow = lpSum([x[t, i, j] for i in range(len(stations) + 1) if i != j])
outflow = lpSum([x[t, j, i] for i in range(len(stations) + 1) if i != j])
prob += inflow == outflow
# Each truck starts and ends at terminal
for t, truck in enumerate(trucks):
prob += lpSum([x[t, 0, j] for j in range(1, len(stations) + 1)]) == 1
prob += lpSum([x[t, i, 0] for i in range(1, len(stations) + 1)]) == 1
# Solve
solver = PULP_CBC_CMD(msg=0, timeLimit=60)
prob.solve(solver)
# Extract routes
routes = []
for t, truck in enumerate(trucks):
route = [0] # Start at terminal
current = 0
for _ in range(len(stations)):
for j in range(len(stations) + 1):
if j != current and (t, current, j) in x:
if x[t, current, j].varValue > 0.5:
if j != 0: # Not terminal
route.append(j)
current = j
break
if len(route) > 1:
route.append(0) # Return to terminal
routes.append({
'truck': truck['id'],
'route': route,
'stations_visited': len(route) - 2,
'deliveries': {
(s, p): y[t, s, p].varValue
for s in range(len(stations))
for p in ['Regular', 'Premium', 'Diesel']
if (t, s, p) in y and y[t, s, p].varValue > 10
}
})
return {
'status': LpStatus[prob.status],
'total_distance': value(prob.objective),
'routes': routes
}
def calculate_distance(loc1, loc2):
"""Calculate distance between two locations (miles)"""
import numpy as np
return np.sqrt((loc1[0] - loc2[0])**2 + (loc1[1] - loc2[1])**2) * 69
# Example usage
stations = [
{
'id': 'Station_A',
'location': (30.0, -95.0),
'delivery_needs': {'Regular': 4000, 'Premium': 0, 'Diesel': 2000}
},
{
'id': 'Station_B',
'location': (30.1, -95.1),
'delivery_needs': {'Regular': 3000, 'Premium': 1000, 'Diesel': 0}
},
{
'id': 'Station_C',
'location': (30.05, -95.15),
'delivery_needs': {'Regular': 5000, 'Premium': 0, 'Diesel': 3000}
},
]
terminal = (30.0, -95.2)
trucks = [
{
'id': 'Truck_1',
'compartments': {'Regular': 5000, 'Premium': 2000, 'Diesel': 3000},
'total_capacity': 10000
},
{
'id': 'Truck_2',
'compartments': {'Regular': 6000, 'Premium': 1000, 'Diesel': 4000},
'total_capacity': 11000
},
]
result = optimize_fuel_delivery_routes(stations, terminal, trucks, {})
print(f"Total distance: {result['total_distance']:.1f} miles")
for route in result['routes']:
print(f"Truck {route['truck']}: {route['stations_visited']} stations")
ターミナル業務の最適化
ターミナル積み込みドックのスケジュール設定
def optimize_terminal_loading(scheduled_deliveries, loading_bays, time_slots):
"""
Optimize assignment of trucks to loading bays and time slots
Parameters:
- scheduled_deliveries: list of planned deliveries with truck arrival times
- loading_bays: number of available loading bays
- time_slots: list of available time slots (e.g., hourly)
"""
from pulp import *
prob = LpProblem("Terminal_Loading", LpMinimize)
n_deliveries = len(scheduled_deliveries)
n_bays = loading_bays
n_slots = len(time_slots)
# Variables: assign delivery d to bay b in time slot t
x = {}
for d in range(n_deliveries):
for b in range(n_bays):
for t in range(n_slots):
x[d, b, t] = LpVariable(f"x_{d}_{b}_{t}", cat='Binary')
# Objective: minimize waiting time and tardiness
waiting_penalty = []
for d, delivery in enumerate(scheduled_deliveries):
desired_slot = delivery['desired_time_slot']
for b in range(n_bays):
for t in range(n_slots):
# Penalty for deviation from desired time
delay = max(0, t - desired_slot)
waiting_penalty.append(delay * x[d, b, t])
prob += lpSum(waiting_penalty)
# Constraints
# Each delivery assigned exactly once
for d in range(n_deliveries):
prob += lpSum([x[d, b, t]
for b in range(n_bays)
for t in range(n_slots)]) == 1
# Bay can handle one truck per time slot
for b in range(n_bays):
for t in range(n_slots):
prob += lpSum([x[d, b, t] for d in range(n_deliveries)]) <= 1
# Truck cannot load before arrival time
for d, delivery in enumerate(scheduled_deliveries):
earliest_slot = delivery['arrival_time_slot']
for b in range(n_bays):
for t in range(earliest_slot):
prob += x[d, b, t] == 0
# Loading duration (occupy bay for multiple slots)
for d, delivery in enumerate(scheduled_deliveries):
load_duration = delivery['loading_duration_slots']
for b in range(n_bays):
for t in range(n_slots):
if x[d, b, t] in prob.variables():
# If loading starts at t, bay b is occupied for next 'duration' slots
for dt in range(1, load_duration):
if t + dt < n_slots:
# No other delivery can use this bay during loading
prob += lpSum([x[d2, b, t+dt]
for d2 in range(n_deliveries)
if d2 != d]) <= \
1 - x[d, b, t]
# Solve
prob.solve(PULP_CBC_CMD(msg=0))
# Extract schedule
schedule = []
for d in range(n_deliveries):
for b in range(n_bays):
for t in range(n_slots):
if x[d, b, t].varValue > 0.5:
schedule.append({
'delivery': scheduled_deliveries[d]['id'],
'truck': scheduled_deliveries[d]['truck'],
'bay': b + 1,
'time_slot': t,
'load_duration': scheduled_deliveries[d]['loading_duration_slots']
})
return {
'status': LpStatus[prob.status],
'total_waiting': value(prob.objective),
'schedule': pd.DataFrame(schedule).sort_values('time_slot')
}
燃料需要の予測
燃料販売の予測
def forecast_fuel_sales(historical_sales, weather_data, events_calendar):
"""
Forecast fuel sales considering multiple factors
Factors:
- Day of week
- Seasonality
- Weather (temperature affects driving)
- Special events
- Trends
"""
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.preprocessing import StandardScaler
import pandas as pd
# Prepare features
df = historical_sales.copy()
# Time-based features
df['day_of_week'] = df['date'].dt.dayofweek
df['day_of_month'] = df['date'].dt.day
df['month'] = df['date'].dt.month
df['is_weekend'] = (df['day_of_week'] >= 5).astype(int)
# Lag features (previous sales)
df['sales_lag_1'] = df['sales_gallons'].shift(1)
df['sales_lag_7'] = df['sales_gallons'].shift(7)
df['sales_rolling_7'] = df['sales_gallons'].rolling(7).mean()
# Weather features
df = df.merge(weather_data, on='date', how='left')
# Special events
df = df.merge(events_calendar, on='date', how='left')
df['is_holiday'] = df['is_holiday'].fillna(0)
# Drop rows with NaN from lag features
df = df.dropna()
# Features for model
feature_cols = ['day_of_week', 'day_of_month', 'month', 'is_weekend',
'sales_lag_1', 'sales_lag_7', 'sales_rolling_7',
'temperature', 'precipitation', 'is_holiday']
X = df[feature_cols]
y = df['sales_gallons']
# Scale features
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Train model
model = GradientBoostingRegressor(
n_estimators=100,
learning_rate=0.1,
max_depth=5,
random_state=42
)
model.fit(X_scaled, y)
# Feature importance
importance = pd.DataFrame({
'feature': feature_cols,
'importance': model.feature_importances_
}).sort_values('importance', ascending=False)
return {
'model': model,
'scaler': scaler,
'feature_importance': importance,
'train_r2': model.score(X_scaled, y)
}
def predict_next_week_sales(model, scaler, current_data, weather_forecast):
"""Predict sales for next 7 days"""
predictions = []
for day in range(7):
# Prepare features for prediction day
# This would use latest sales data and weather forecast
# Simplified for illustration
pass
return predictions
燃料価格の最適化
動的価格設定戦略
def optimize_fuel_pricing(station_data, competitor_prices, cost_data,
demand_elasticity=-0.5):
"""
Optimize fuel pricing to maximize margin while remaining competitive
Parameters:
- station_data: station characteristics and historical data
- competitor_prices: current prices at nearby competitors
- cost_data: wholesale cost and other costs
- demand_elasticity: price elasticity of demand
"""
from pulp import *
prob = LpProblem("Fuel_Pricing", LpMaximize)
stations = station_data
products = ['Regular', 'Premium', 'Diesel']
# Variables: price for each product at each station
price = {}
volume = {}
for s, station in enumerate(stations):
for product in products:
price[s, product] = LpVariable(
f"Price_{s}_{product}",
lowBound=cost_data[product]['wholesale_cost'] + 0.10, # Min margin
upBound=competitor_prices[product]['max'] + 0.20
)
volume[s, product] = LpVariable(
f"Volume_{s}_{product}",
lowBound=0
)
# Objective: maximize total profit
profit = []
for s, station in enumerate(stations):
for product in products:
# Profit = (Price - Cost) × Volume
cost = cost_data[product]['wholesale_cost'] + \
cost_data[product]['operating_cost']
profit.append((price[s, product] - cost) * volume[s, product])
prob += lpSum(profit)
# Constraints
# Demand model: volume as function of price
for s, station in enumerate(stations):
for product in products:
base_volume = station['base_volume'][product]
base_price = station['base_price'][product]
# Linear demand: V = V0 * (1 + elasticity * (P - P0) / P0)
# Approximation for LP
avg_comp_price = competitor_prices[product]['average']
# Volume decreases if price above competitors
prob += volume[s, product] <= base_volume * \
(1 + demand_elasticity * (price[s, product] - avg_comp_price) / avg_comp_price)
# Competitive constraints: don't price too far from competitors
for s, station in enumerate(stations):
for product in products:
avg_comp = competitor_prices[product]['average']
min_comp = competitor_prices[product]['min']
# Price within competitive range
prob += price[s, product] <= avg_comp + 0.15 # Max 15 cents above average
prob += price[s, product] >= min_comp - 0.05 # Max 5 cents below minimum
# Solve
prob.solve(PULP_CBC_CMD(msg=0))
# Extract optimal prices
optimal_prices = {}
for s, station in enumerate(stations):
optimal_prices[station['id']] = {
product: {
'price': price[s, product].varValue,
'volume': volume[s, product].varValue
}
for product in products
}
return {
'status': LpStatus[prob.status],
'max_profit': value(prob.objective),
'optimal_prices': optimal_prices
}
ツールとライブラリ
Python ライブラリ
最適化:
PuLP:線形計画法OR-Tools:車両ルート設定Pyomo:最適化モデリング
予測:
scikit-learn:機械学習prophet:時系列予測statsmodels:統計モデル
地理空間:
geopy:距離の計算folium:地図作成geopandas:地理データ
商用ソフトウェア
燃料配送:
- Omnitracs:フリート管理とルート設定
- Verizon Connect:GPS フリート追跡
- Descartes:ルート最適化
- TMW Systems:輸送管理
ターミナル管理:
- AspenTech:燃料のスケジューリングと最適化
- Honeywell Experion:プロセス制御
- Emerson DeltaV:ターミナル自動化
小売管理:
- Veeder-Root:タンク監視システム
- PDI:燃料価格設定と卸売管理
- Gilbarco:給油と管理
- Dover Fueling Solutions:小売業務の自動化
よくある課題と解決策
課題:欠品の防止
問題:
- 予測できない需要の急増
- 配送の遅延
- 不正確な予測
解決策:
- リアルタイムの在庫監視(ATG システム)
- 安全在庫の最適化
- 需要の予測分析
- 緊急配送の手順
- 自動再発注システム
課題:配送効率
問題:
- 燃料費の上昇
- ドライバー不足
- 交通渋滞
- 配送時間枠
解決策:
- ルート最適化ソフトウェア
- 配送の集約
- 動的ルート設定(リアルタイム調整)
- 複数製品対応の区画型タンクローリー
- 許可されている場合の夜間配送
課題:製品の混入
問題:
- 製品間の交差汚染
- 品質問題
- タンクへの混油ミス
解決策:
- 厳格な区画管理手順
- 製品確認システム
- タンク洗浄プロトコル
- 品質検査(配送前および配送後)
- 自動配送システム
課題:価格の変動
問題:
- 卸売価格の急激な変動
- 競争圧力
- 利益率の圧縮
解決策:
- ダイナミックプライシングシステム
- ヘッジ戦略
- 卸売供給契約
- 価格の監視と自動化
- 付加価値サービス(コンビニエンスストア、洗車)
出力形式
燃料配送最適化レポート
エグゼクティブサマリー:
- ネットワークの概要(ターミナル、ステーション、トラック)
- 主な最適化の結果
- 達成したコスト削減
- サービスレベルの実績
ステーション在庫状況:
| ステーション | 製品 | 現在のレベル | 容量 | 在庫日数 | 発注点 | 状況 | |---------|---------------|----------|-------------|---------------|--------| | Station_A | Regular | 3,000 gal | 12,000 | 0.75 | 4,500 | URGENT | | Station_A | Diesel | 6,000 gal | 10,000 | 3.0 | 3,000 | OK | | Station_B | Regular | 8,000 gal | 15,000 | 2.0 | 5,000 | OK |
配送スケジュール:
| 日付 | トラック | ルート | ステーション数 | 製品 | 合計ガロン数 | マイル数 | 時間 |
|---|---|---|---|---|---|---|---|
| 2026-02-01 | Truck_1 | Route_A | 4 | R, P, D | 9,500 | 85 | 6.5 |
| 2026-02-01 | Truck_2 | Route_B | 3 | R, D | 10,200 | 72 | 5.8 |
| 2026-02-02 | Truck_1 | Route_C | 5 | R, P, D | 10,800 | 95 | 7.2 |
コスト分析:
| カテゴリ | 1日あたりのコスト | 月間コスト | 年間コスト |
|---|---|---|---|
| 燃料(トラック用ディーゼル) | $2,500 | $75,000 | $900,000 |
| ドライバー賃金 | $3,200 | $96,000 | $1,152,000 |
| トラック整備 | $800 | $24,000 | $288,000 |
| 保険 | $400 | $12,000 | $144,000 |
| 配送コスト合計 | $6,900 | $207,000 | $2,484,000 |
KPI:
| 指標 | 現在 | 目標 | 状況 |
|---|---|---|---|
| 欠品率 | 0.2% | < 0.5% | ✓ 良好 |
| 時間どおりの配送率 | 97% | > 95% | ✓ 良好 |
| 1ガロンあたりの配送コスト | $0.025 | < $0.030 | ✓ 良好 |
| トラック稼働率 | 88% | > 85% | ✓ 良好 |
| 平均配送時間 | 5.5 hrs | < 6 hrs | ✓ 良好 |
推奨事項:
- 夏季のピーク需要に対応するため、車両にトラックを1台追加する
- 利益率を10%改善するため、自動価格設定システムを導入する
- Station_15への配送を最適化する(現在、ルートの稼働率が低い)
- 次の四半期に向けて、燃料の一括ヘッジを検討する
確認事項
さらに詳しい情報が必要な場合:
- 何か所の小売拠点にサービスを提供していますか?
- タンクローリー車両の規模と構成はどのようになっていますか?
- どの製品を配送していますか?(ガソリンのグレード、ディーゼル、バイオ燃料)
- 現在の配送頻度とサービスレベルはどのようになっていますか?
- 主な課題は何ですか?(コスト、欠品、効率)
- どのようなシステムを導入していますか?(TMS、タンク監視、価格設定)
- 競争環境はどのようになっていますか?(ブランド系、独立系)
関連スキル
- energy-logistics:中流部門の石油物流向け
- drilling-logistics:上流部門の石油・ガス事業向け
- route-optimization:車両ルーティングとスケジューリング向け
- inventory-optimization:在庫管理戦略向け
- demand-forecasting:販売予測向け
- last-mile-delivery:配送業務向け
- fleet-management:トラック車両管理向け
- network-design:ターミナルおよびステーションのネットワーク計画向け