iT邦幫忙

2026 iThome 鐵人賽

DAY 18
0
Software Development

SyncETA 開發日記:手把手打造你的智慧出發時間推薦 PWA系列 第 18 篇

【Day 18】設計一個簡化版的出發時間建議規則

  • 分享至 

  • xImage
  •  

今天正式建立 src/logic/recommend.js,把前兩天討論的分位數概念,寫成可以執行的程式碼。


撰寫分位數計算函式

// src/logic/recommend.js

/**
 * 計算陣列的分位數
 * @param {number[]} values 歷史花費時間(分鐘)
 * @param {number} percentile 0~1 之間,例如 0.9 代表 90% 信心水準
 */
function calculatePercentile(values, percentile) {
  const sorted = [...values].sort((a, b) => a - b);
  const index = Math.ceil(percentile * sorted.length) - 1;
  const safeIndex = Math.min(Math.max(index, 0), sorted.length - 1);
  return sorted[safeIndex];
}

設計建議規則

有了分位數函式,我們可以寫出核心的推薦邏輯:

// src/logic/recommend.js(新增)

/**
 * 根據歷史花費時間與使用者期望信心水準,推薦出發時間
 * @param {number[]} historyMinutes 歷史花費時間紀錄
 * @param {number} confidenceLevel 使用者期望信心水準(0~1)
 * @param {Date} arrivalDeadline 使用者希望到達的時間
 */
export function recommendDepartureTime(historyMinutes, confidenceLevel, arrivalDeadline) {
  const bufferMinutes = calculatePercentile(historyMinutes, confidenceLevel);
  const departureTime = new Date(arrivalDeadline.getTime() - bufferMinutes * 60_000);

  return {
    departureTime,
    bufferMinutes,
    confidenceLevel,
  };
}

先用假資料測試

在真正接上 TDX 歷史資料之前,先用一組模擬資料驗證邏輯是否合理:

import { recommendDepartureTime } from './logic/recommend.js';

const history = [25, 27, 26, 30, 28, 35, 26, 29, 27, 40];
const deadline = new Date('2026-09-01T09:00:00');

const result90 = recommendDepartureTime(history, 0.9, deadline);
console.log('90% 信心水準建議出發時間:', result90.departureTime.toLocaleTimeString());

const result50 = recommendDepartureTime(history, 0.5, deadline);
console.log('50% 信心水準建議出發時間:', result50.departureTime.toLocaleTimeString());

跑起來後你會發現,90% 信心水準給出的出發時間,會比 50% 更早,這正符合我們昨天討論的直覺:想要更有把握,就要多留一點緩衝時間。


明天,我們要把這段邏輯真正接到畫面上,並且串上前面已經有的 TDX 即時資料,讓它不再只是假資料測試。


上一篇
【Day 17】用簡單例子理解「信心水準」的概念
下一篇
【Day 19】把建議邏輯寫進程式,串接真實資料
系列文
SyncETA 開發日記:手把手打造你的智慧出發時間推薦 PWA 共 23 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言