网站百度排名,昆明优化广告公司,什么是新闻源网站,什么是社交电商平台基于 C 实现的智能物流配送系统模拟程序
一、项目简介
本项目是一个基于 C实现的智能物流配送系统模拟程序#xff0c;综合运用了多种经典算法#xff0c;用于完成以下核心任务#xff1a;
#x1f4cd; 路径规划#xff08;最短路径、配送路线优化#xff09;#x1f6…基于 C 实现的智能物流配送系统模拟程序一、项目简介本项目是一个基于C实现的智能物流配送系统模拟程序综合运用了多种经典算法用于完成以下核心任务路径规划最短路径、配送路线优化车辆调度容量 时间窗约束库存优化预算约束下的补货决策算法对比演示贪心 / 2-opt / 回溯 分支限界系统支持文件数据输入 自动示例数据生成 菜单式交互操作二、系统功能概览1️⃣ 用户登录模块默认账号1默认密码123456最多 3 次登录尝试2️⃣ 基础数据管理系统自动加载或生成以下数据文件文件名内容nodes.txt节点信息含仓库edges.txt路网边及距离orders.txt客户订单vehicles.txt车辆信息inventory.txt库存与补货方案若文件不存在程序会自动生成示例数据确保可直接运行。3️⃣ 路径规划Dijkstra支持任意两节点之间的最短路径查询输出最短距离具体路径节点序列 使用算法Dijkstra 单源最短路径算法基于邻接表 优先队列实现4️⃣ 车辆调度带时间窗调度目标在满足以下约束的前提下尽可能分配订单 车辆容量约束⏱ 订单时间窗readyTime / dueTime调度策略订单按最早截止时间优先对每个订单选择最早可完成的可行车辆若无车辆满足则标记为未分配订单 算法类型贪心调度算法启发式5️⃣ 路线规划与优化① 初始路线生成基于最短路距离矩阵使用最近邻贪心算法Nearest Neighbor路线形式仓库 → 客户1 → 客户2 → ... → 仓库② 小规模精确优化≤10 个客户回溯 分支限界TSP 变体自动以贪心解作为上界进行剪枝输出贪心距离最优距离搜索节点数剪枝次数优化率③ 大规模近似优化使用2-opt 局部搜索算法对初始路线进行边交换优化 涉及算法贪心回溯 分支限界2-opt 局部优化6️⃣ 库存优化动态规划问题描述在给定总预算 B的条件下为每种商品选择不补货或选择一种补货方案目标是最小化缺货罚金等价于最大化需求满足度模型说明缺货量 max(0, demand - (onHand 补货量))罚金 缺货量 × unitPenalty 算法类型多物品 多方案 预算约束的动态规划状态DP[i][b]表示前i个物品、预算b下的最小罚金输出内容最优使用预算每个物品的补货决策缺货情况与罚金统计三、菜单功能说明 智能物流配送系统 1. 查看基础数据 2. 路径规划两点最短路径Dijkstra 3. 配送规划时间窗调度 路线优化 4. 路线优化对比演示贪心 vs 2-opt 5. 库存优化动态规划 DP 6. 退出系统四、数据文件格式说明 nodes.txtnodeId nodeName示例0Depot1A2B3C4D5E6F7G8H9I10J11K12L edges.txtu v weight示例01402303612214723425636545347856458669778571098939116101141012711125 orders.txtorderId nodeId demand serviceTime readyTime dueTime示例100132015101243018102322525103454322104522030105632102810674362010782101210893282610910541235110112101011112431540 vehicles.txtvehId capacity startTime示例1100280360 inventory.txtitemName onHand demand unitPenalty optionCount qty1 cost1 qty2 cost2 ...示例Widget21583366101218Gadget512632447813Bolt203532103205Nut102543551092015Screw5080222064010五、编译与运行方式 编译Linux / macOS / Windows MinGWg -stdc17 main.cpp -o logistics▶ 运行./logisticsWindowsCMD / PowerShelllogistics.exe六、特色与加分点✅ 多算法综合应用贪心 / Dijkstra / DP / 回溯✅ 支持时间窗约束的车辆调度✅ 路线优化算法对比与性能统计✅ 自动示例数据生成开箱即用✅ 菜单式交互演示友好✅ 代码结构清晰适合课程答辩讲解七.项目源码#includebits/stdc.husingnamespacestd;/* 智能物流配送系统 - 路径规划Dijkstra最短路 - 车辆调度贪心需求降序 可用车辆优先 容量约束 - 库存优化动态规划多物品多补货方案 预算约束最小成本/最大满足 - 可选回溯分支限界小规模路线精确优化 文件数据自动生成示例 nodes.txt : 节点列表id name edges.txt : 边u v w orders.txt : 订单orderId nodeId demand serviceTime vehicles.txt : 车辆vehId capacity startTime inventory.txt : 库存itemName onHand demand unitPenalty optionCount [qty cost]... */staticconststring kAccount1;staticconststring kPassword123456;// ---------- 回溯统计用于展示分支限界效果 ----------staticlonglongg_dfsCount0;staticlonglongg_pruneCount0;// ---------- 平台清屏/暂停 ----------staticvoidcls(){#ifdef_WIN32system(cls);#elsecout\033[2J\033[H;#endif}staticvoidpauseAny(){#ifdef_WIN32system(pause);#elsecout按回车继续...;cin.ignore(numeric_limitsstreamsize::max(),\n);cin.get();#endif}// ---------- 数据结构 ----------structNode{intid{};string name;};structEdge{intto{};intw{};};structOrder{intorderId{};intnodeId{};intdemand{};intserviceTime{};intreadyTime{};// 最早可服务时间intdueTime{};// 最晚完成时间};structVehicle{intvehId{};intcapacity{};intstartTime{};// 可用时间例如 0 表示立即};structRoutePlan{intvehId{};vectorintorderIds;// 分配到该车辆的订单IDvectorintvisitNodes;// 实际访问节点序列含仓库0inttotalDemand{};intfinishTime{};inttotalDistance{};};structInventoryOption{intqty{};intcost{};};structInventoryItem{string name;intonHand{};intdemand{};intunitPenalty{};// 缺货单位罚金越大越希望满足vectorInventoryOptionoptions;// 补货方案补qty 花cost};structGraph{vectorNodenodes;vectorvectorEdgeadj;unordered_mapint,intid2idx;// nodeId - index in nodes};// ---------- 工具文件存在 ----------staticboolfileExists(conststringpath){ifstreamin(path);return(bool)in;}// ---------- 示例数据生成 ----------staticvoidwriteSampleDataIfMissing(){if(!fileExists(nodes.txt)){ofstreamout(nodes.txt);// 0 号默认仓库out0 Depot\n;out1 A\n;out2 B\n;out3 C\n;out4 D\n;out5 E\n;}if(!fileExists(edges.txt)){ofstreamout(edges.txt);// 无向图边u v wout0 1 4\n;out0 2 2\n;out1 2 1\n;out1 3 5\n;out2 3 8\n;out2 4 10\n;out3 4 2\n;out3 5 6\n;out4 5 3\n;}if(!fileExists(orders.txt)){ofstreamout(orders.txt);// orderId nodeId demand serviceTimeout100 1 3 2\n;out101 2 4 3\n;out102 3 2 2\n;out103 4 5 4\n;out104 5 2 2\n;}if(!fileExists(vehicles.txt)){ofstreamout(vehicles.txt);// vehId capacity startTimeout1 8 0\n;out2 7 0\n;}if(!fileExists(inventory.txt)){ofstreamout(inventory.txt);/* itemName onHand demand unitPenalty optionCount [qty cost]... 例如ItemX 2 8 10 3 (3,8) (5,13) (8,20) */outWidget 2 10 8 3 3 6 6 10 10 16\n;outGadget 5 9 6 3 2 4 4 7 6 10\n;outBolt 20 30 3 2 10 3 20 5\n;}}// ---------- 读取数据 ----------staticGraphloadGraph(){Graph g;ifstreamnIn(nodes.txt);if(!nIn)throwruntime_error(无法打开 nodes.txt);g.nodes.clear();intid;string name;while(nInidname){g.nodes.push_back({id,name});}g.adj.assign(g.nodes.size(),{});for(inti0;i(int)g.nodes.size();i){g.id2idx[g.nodes[i].id]i;}ifstreameIn(edges.txt);if(!eIn)throwruntime_error(无法打开 edges.txt);intu,v,w;while(eInuvw){if(!g.id2idx.count(u)||!g.id2idx.count(v))continue;intuig.id2idx[u],vig.id2idx[v];g.adj[ui].push_back({vi,w});g.adj[vi].push_back({ui,w});}returng;}staticvectorOrderloadOrders(){ifstreamin(orders.txt);if(!in)throwruntime_error(无法打开 orders.txt);vectorOrderorders;Order o;while(ino.orderIdo.nodeIdo.demando.serviceTimeo.readyTimeo.dueTime){orders.push_back(o);}returnorders;}staticvectorVehicleloadVehicles(){ifstreamin(vehicles.txt);if(!in)throwruntime_error(无法打开 vehicles.txt);vectorVehiclevs;Vehicle v;while(inv.vehIdv.capacityv.startTime){vs.push_back(v);}returnvs;}staticvectorInventoryItemloadInventory(){ifstreamin(inventory.txt);if(!in)throwruntime_error(无法打开 inventory.txt);vectorInventoryItemitems;while(true){InventoryItem it;intoptionCount;if(!(init.nameit.onHandit.demandit.unitPenaltyoptionCount))break;it.options.clear();for(inti0;ioptionCount;i){InventoryOption op;inop.qtyop.cost;it.options.push_back(op);}items.push_back(it);}returnitems;}// ---------- 路径规划Dijkstra 最短路 ----------staticpairvectorint,vectorintdijkstra(constGraphg,intsrcNodeId){intn(int)g.nodes.size();constintINF1e9;vectorintdist(n,INF),parent(n,-1);if(!g.id2idx.count(srcNodeId))throwruntime_error(srcNodeId 不存在);intsg.id2idx.at(srcNodeId);usingPpairint,int;// dist, idxpriority_queueP,vectorP,greaterPpq;dist[s]0;pq.push({0,s});while(!pq.empty()){auto[d,u]pq.top();pq.pop();if(d!dist[u])continue;for(autoe:g.adj[u]){if(dist[e.to]dist[u]e.w){dist[e.to]dist[u]e.w;parent[e.to]u;pq.push({dist[e.to],e.to});}}}return{dist,parent};}staticvectorintrestorePathByIdx(constvectorintparent,intsrcIdx,intdstIdx){vectorintpath;intcurdstIdx;while(cur!-1){path.push_back(cur);if(cursrcIdx)break;curparent[cur];}reverse(path.begin(),path.end());if(path.empty()||path.front()!srcIdx)return{};returnpath;}// ---------- 车辆调度贪心分配订单到车辆 ----------// 策略订单按 demand 降序First-Fit Decreasing车辆按“最早可用时间/剩余容量”选择staticvectorRoutePlanscheduleVehiclesWithTimeWindow(constvectorOrderorders,constvectorVehiclevehicles){// 按 dueTime最紧急优先vectorOrderordorders;sort(ord.begin(),ord.end(),[](constOrdera,constOrderb){returna.dueTimeb.dueTime;});structVehState{Vehicle v;intremainingCap;intcurrentTime;vectorintassignedOrderIds;inttotalDemand;};vectorVehStatestates;for(autov:vehicles){states.push_back({v,v.capacity,v.startTime,{},0});}vectorintunassigned;for(autoo:ord){intbest-1;intbestFinishINT_MAX;for(inti0;i(int)states.size();i){if(states[i].remainingCapo.demand)continue;intarrivalmax(states[i].currentTime,o.readyTime);intfinisharrivalo.serviceTime;if(finisho.dueTime){if(finishbestFinish){bestFinishfinish;besti;}}}if(best-1){unassigned.push_back(o.orderId);continue;}states[best].assignedOrderIds.push_back(o.orderId);states[best].remainingCap-o.demand;states[best].currentTimebestFinish;states[best].totalDemando.demand;}vectorRoutePlanplans;for(autost:states){RoutePlan rp;rp.vehIdst.v.vehId;rp.orderIdsst.assignedOrderIds;rp.totalDemandst.totalDemand;rp.finishTimest.currentTime;plans.push_back(rp);}if(!unassigned.empty()){cout\n? 未分配订单时间窗/容量限制;for(intid:unassigned)coutid ;cout\n;}returnplans;}// ---------- 路线生成贪心最近邻基于最短路距离矩阵 ----------staticvectorvectorintallPairsShortestPathDist(constGraphg){intn(int)g.nodes.size();vectorvectorintdist(n,vectorint(n,(int)1e9));for(inti0;in;i){auto[d,p]dijkstra(g,g.nodes[i].id);for(intj0;jn;j)dist[i][j]d[j];}returndist;}staticvectorintbuildRouteNearestNeighbor(constGraphg,constvectorvectorintdistMat,intdepotId,constvectorintcustomerNodeIds){if(!g.id2idx.count(depotId))throwruntime_error(depotId 不存在);intdepotIdxg.id2idx.at(depotId);vectorinttargets;for(intnid:customerNodeIds){if(g.id2idx.count(nid))targets.push_back(g.id2idx.at(nid));}sort(targets.begin(),targets.end());targets.erase(unique(targets.begin(),targets.end()),targets.end());vectorintrouteIdx;routeIdx.push_back(depotIdx);vectorintunvisitedtargets;intcurdepotIdx;while(!unvisited.empty()){intbestPos0;for(inti1;i(int)unvisited.size();i){if(distMat[cur][unvisited[i]]distMat[cur][unvisited[bestPos]]){bestPosi;}}intnxtunvisited[bestPos];routeIdx.push_back(nxt);curnxt;unvisited.erase(unvisited.begin()bestPos);}// 回仓库routeIdx.push_back(depotIdx);// 转成 nodeIdvectorintrouteNodeId;for(intidx:routeIdx)routeNodeId.push_back(g.nodes[idx].id);returnrouteNodeId;}// ---------- 回溯 分支限界小规模精确路线可选 ----------// 对每辆车的客户点 10 时尝试找更优的闭环路径TSP 变体// 使用 distMat进行回溯搜索 当前最短上界剪枝staticvoidtspBacktrackBB(constvectorvectorintdistMat,intdepotIdx,constvectorintcustomerIdx,vectorintbestPath,intbestCost){intm(int)customerIdx.size();vectorintpath;vectorintused(m,0);// 预计算最小边用于下界估计intglobalMinEdgeINT_MAX;for(inti0;i(int)distMat.size();i)for(intj0;j(int)distMat.size();j)if(i!jdistMat[i][j]globalMinEdge)globalMinEdgedistMat[i][j];functionvoid(int,int,int)dfs[](intdepth,intlastIdx,intcostSoFar){g_dfsCount;// 下界估计分支限界核心intremainingm-depth;intlowerBoundcostSoFarremaining*globalMinEdge;if(lowerBoundbestCost){g_pruneCount;return;}if(depthm){inttotalcostSoFardistMat[lastIdx][depotIdx];if(totalbestCost){bestCosttotal;bestPathpath;}return;}for(inti0;im;i){if(used[i])continue;intnxtcustomerIdx[i];intadddistMat[lastIdx][nxt];if(add(int)1e9)continue;used[i]1;path.push_back(nxt);dfs(depth1,nxt,costSoFaradd);path.pop_back();used[i]0;}};dfs(0,depotIdx,0);}staticvectorintbuildRouteGreedyOrExact(constGraphg,constvectorvectorintdistMat,intdepotId,constvectorintcustomerNodeIds){// ---------- 1. 贪心上界 ----------vectorintgreedybuildRouteNearestNeighbor(g,distMat,depotId,customerNodeIds);autocalcCost[](constvectorintrouteNodeId){intcost0;for(inti1;i(int)routeNodeId.size();i){intag.id2idx.at(routeNodeId[i-1]);intbg.id2idx.at(routeNodeId[i]);costdistMat[a][b];}returncost;};intgreedyCostcalcCost(greedy);// ---------- 2. 客户点去重 ----------unordered_setints;for(intnid:customerNodeIds)s.insert(nid);if((int)s.size()10){cout[提示] 客户点数量 10自动使用贪心路线。\n;returngreedy;}// ---------- 3. 精确搜索 ----------vectorintcustomerIdx;for(intnid:s)customerIdx.push_back(g.id2idx.at(nid));intdepotIdxg.id2idx.at(depotId);intbestCostgreedyCost;vectorintbestPermIdx;g_dfsCountg_pruneCount0;tspBacktrackBB(distMat,depotIdx,customerIdx,bestPermIdx,bestCost);cout------ 路线优化对比回溯 分支限界------\n;cout贪心路线距离: greedyCost\n;cout最优路线距离: bestCost\n;cout搜索节点数: g_dfsCount\n;cout剪枝次数: g_pruneCount\n;if(bestCostgreedyCost){doubleimprove100.0*(greedyCost-bestCost)/greedyCost;cout优化率: fixedsetprecision(2)improve%\n;}else{cout未优于贪心贪心已是最优或接近最优\n;}cout------------------------------------------\n;// ---------- 4. 构造最优路线 ----------vectorintbestRouteNodeId;bestRouteNodeId.push_back(depotId);for(intidx:bestPermIdx)bestRouteNodeId.push_back(g.nodes[idx].id);bestRouteNodeId.push_back(depotId);returnbestRouteNodeId;}staticvoidtwoOptImprove(vectorintroute,constGraphg,constvectorvectorintdistMat){boolimprovedtrue;intnroute.size();autodist[](inta,intb){returndistMat[g.id2idx.at(a)][g.id2idx.at(b)];};while(improved){improvedfalse;for(inti1;in-2;i){for(intki1;kn-1;k){intdeltadist(route[i-1],route[k])dist(route[i],route[k1])-dist(route[i-1],route[i])-dist(route[k],route[k1]);if(delta0){reverse(route.begin()i,route.begin()k1);improvedtrue;}}}}}// ---------- 路线距离 ----------staticintrouteDistance(constGraphg,constvectorvectorintdistMat,constvectorintrouteNodeIds){intsum0;for(inti1;i(int)routeNodeIds.size();i){intag.id2idx.at(routeNodeIds[i-1]);intbg.id2idx.at(routeNodeIds[i]);sumdistMat[a][b];}returnsum;}// ---------- 库存优化动态规划 ----------// 目标在预算 B 内为每个物品选择一个补货方案或不补使“缺货罚金最小”等价于满足最大// 缺货量 max(0, demand - (onHand replenishQty))// 成本 sum(option.cost)// 罚金 sum(缺货量 * unitPenalty)// DP[itemIndex][budget] 最小罚金staticvoidoptimizeInventoryDP(constvectorInventoryItemitems,intbudget){intn(int)items.size();constlonglongINF(1LL60);vectorvectorlonglongdp(n1,vectorlonglong(budget1,INF));vectorvectorintchoice(n1,vectorint(budget1,-1));// 记录选哪个 option-1表示不补dp[0][0]0;autopenalty[](constInventoryItemit,intaddQty)-longlong{inthaveit.onHandaddQty;intshortagemax(0,it.demand-have);return1LL*shortage*it.unitPenalty;};for(inti1;in;i){constautoititems[i-1];for(intb0;bbudget;b){// 不补货if(dp[i-1][b]INF){longlongvaldp[i-1][b]penalty(it,0);if(valdp[i][b]){dp[i][b]val;choice[i][b]-1;}}// 选一个补货方案for(intk0;k(int)it.options.size();k){intcostit.options[k].cost;intqtyit.options[k].qty;if(bcostdp[i-1][b-cost]INF){longlongvaldp[i-1][b-cost]penalty(it,qty);if(valdp[i][b]){dp[i][b]val;choice[i][b]k;}}}}}// 找到最优预算点intbestB0;for(intb1;bbudget;b){if(dp[n][b]dp[n][bestB])bestBb;}// 回溯方案vectorintpicked(n,-1);intbbestB;for(intin;i1;i--){intcchoice[i][b];picked[i-1]c;if(c!-1)b-items[i-1].options[c].cost;}// 输出cout\n 库存优化动态规划DP \n;cout预算上限: budget最优使用预算: bestB\n;cout最小缺货罚金: dp[n][bestB]\n\n;coutleftsetw(12)物品setw(8)现有setw(8)需求setw(10)补货setw(8)成本setw(10)缺货setw(10)罚金\n;longlongtotalCost0,totalPenalty0;for(inti0;in;i){intaddQty0,cost0;if(picked[i]!-1){addQtyitems[i].options[picked[i]].qty;costitems[i].options[picked[i]].cost;}inthaveitems[i].onHandaddQty;intshortagemax(0,items[i].demand-have);longlongpen1LL*shortage*items[i].unitPenalty;totalCostcost;totalPenaltypen;coutleftsetw(12)items[i].namesetw(8)items[i].onHandsetw(8)items[i].demandsetw(10)addQtysetw(8)costsetw(10)shortagesetw(10)pen\n;}cout总成本: totalCost总罚金: totalPenalty\n;cout\n;}// ---------- 打印基础数据 ----------staticvoidshowData(constGraphg,constvectorOrderorders,constvectorVehiclevehicles,constvectorInventoryIteminv){cout\n 节点 Nodes \n;for(auton:g.nodes)coutNode n.id : n.name\n;cout\n 订单 Orders \n;for(autoo:orders){coutOrder o.orderId - Node o.nodeId demando.demand serviceTimeo.serviceTime\n;}cout\n 车辆 Vehicles \n;for(autov:vehicles){coutVehicle v.vehId capv.capacity startv.startTime\n;}cout\n 库存 Inventory \n;for(autoit:inv){coutit.name onHandit.onHand demandit.demand penaltyit.unitPenalty options:;for(autoop:it.options)cout (op.qty,op.cost);cout\n;}}// ---------- 主功能规划配送调度路径 ----------staticvoidplanDelivery(constGraphg,constvectorOrderorders,constvectorVehiclevehicles,booluseExactIfSmall){// 1) 带时间窗的贪心调度autoplansscheduleVehiclesWithTimeWindow(orders,vehicles);// 2) 最短路距离矩阵autodistMatallPairsShortestPathDist(g);unordered_mapint,Ordermp;for(autoo:orders)mp[o.orderId]o;cout\n 车辆调度 路线规划结果 \n;for(autorp:plans){if(rp.orderIds.empty()){cout\n[车辆 rp.vehId] 无分配订单。\n;continue;}vectorintcustomerNodes;for(intoid:rp.orderIds)customerNodes.push_back(mp[oid].nodeId);// 3) 初始路线vectorintroute;boolsmallScale(unordered_setint(customerNodes.begin(),customerNodes.end()).size()10);if(useExactIfSmallsmallScale){routebuildRouteGreedyOrExact(g,distMat,0,customerNodes);}else{routebuildRouteNearestNeighbor(g,distMat,0,customerNodes);}intbeforerouteDistance(g,distMat,route);// 4) 仅在大规模下启用 2-optif(!smallScale){twoOptImprove(route,g,distMat);}intafterrouteDistance(g,distMat,route);rp.visitNodesroute;rp.totalDistanceafter;rp.finishTimeafter;// 距离≈时间简化模型cout\n[车辆 rp.vehId] 分配订单: ;for(intoid:rp.orderIds)coutoid ;cout\n路线距离: before;if(!smallScale)cout → after2-opt 优化 fixedsetprecision(2)100.0*(before-after)/before%;cout\n预计完成时间: rp.finishTime\n路线: ;for(intnid:route){coutg.nodes[g.id2idx.at(nid)].name(nid);if(nid!route.back())cout - ;}cout\n;}cout\n;}// ---------- 路径查询Dijkstra 输出某两点最短路径 ----------staticvoidqueryShortestPath(constGraphg){intsId,tId;cout输入起点nodeId;cinsId;cout输入终点nodeId;cintId;if(!g.id2idx.count(sId)||!g.id2idx.count(tId)){cout节点不存在。\n;return;}auto[dist,parent]dijkstra(g,sId);intsIdxg.id2idx.at(sId);inttIdxg.id2idx.at(tId);if(dist[tIdx](int)1e9){cout不可达。\n;return;}autopathIdxrestorePathByIdx(parent,sIdx,tIdx);cout最短距离 dist[tIdx]\n路径;for(inti0;i(int)pathIdx.size();i){coutg.nodes[pathIdx[i]].name(g.nodes[pathIdx[i]].id);if(i1(int)pathIdx.size())cout - ;}cout\n;}// ---------- 登录 ----------staticboollogin(intremain){string acc,pwd;cout\n;cout 智能物流配送系统实验3 演示版\n;cout\n;cout【登录提示】\n;cout - 默认演示账号1\n;cout - 默认演示密码123456\n;cout - 剩余登录次数remain\n;cout-----------------------------------------\n;cout请输入账号;cinacc;cout请输入密码;cinpwd;if(acckAccountpwdkPassword){cout\n? 登录成功欢迎进入系统。\n;cout系统将自动加载示例数据用于算法演示。\n;returntrue;}else{cout\n? 登录失败账号或密码错误。\n;if(remain1){cout请重新输入剩余 remain-1 次机会。\n;}returnfalse;}}staticvoiddemoRouteOptimization(constGraphg,constvectorOrderorders){autodistMatallPairsShortestPathDist(g);vectorintcustomerNodes;for(autoo:orders)customerNodes.push_back(o.nodeId);cout\n 路线优化对比演示 \n;autogreedybuildRouteNearestNeighbor(g,distMat,0,customerNodes);intd1routeDistance(g,distMat,greedy);autooptgreedy;twoOptImprove(opt,g,distMat);intd2routeDistance(g,distMat,opt);cout贪心路线距离: d1\n;cout2-opt 优化后距离: d2\n;cout优化率: fixedsetprecision(2)100.0*(d1-d2)/d1%\n\n;cout优化后路线\n;for(intnid:opt){coutg.nodes[g.id2idx.at(nid)].name(nid);if(nid!opt.back())cout - ;}cout\n;}// ---------- 菜单 ----------staticvoidmenuLoop(){// 自动生成示例数据writeSampleDataIfMissing();// 加载数据Graph gloadGraph();vectorOrderordersloadOrders();vectorVehiclevehiclesloadVehicles();vectorInventoryIteminvloadInventory();while(true){cout\n\n;cout 智能物流配送系统实验3\n;cout\n;cout1. 查看基础数据\n;cout2. 路径规划两点最短路径Dijkstra\n;cout3. 配送规划时间窗调度 路线优化\n;cout4. 路线优化对比演示贪心 vs 2-opt\n;cout5. 库存优化动态规划 DP\n;cout6. 退出系统\n;cout请输入功能编号;intop;cinop;cls();if(op1){showData(g,orders,vehicles,inv);pauseAny();cls();}elseif(op2){queryShortestPath(g);pauseAny();cls();}elseif(op3){cout是否启用小规模精确路线优化回溯分支限界10客户\n;cout1 是精确 0 否启发式\n;intyes;cinyes;cout\n【说明】系统将自动\n;cout- 使用带时间窗的贪心算法进行车辆调度\n;cout- 小规模使用回溯大规模使用 2-opt 优化\n\n;planDelivery(g,orders,vehicles,yes1);pauseAny();cls();}elseif(op4){demoRouteOptimization(g,orders);pauseAny();cls();}elseif(op5){cout输入库存补货总预算建议 5~30;intB;cinB;optimizeInventoryDP(inv,B);pauseAny();cls();}elseif(op6){cout退出。\n;break;}else{cout无效输入。\n;pauseAny();cls();}}}intreadIntInRange(conststringtip,intl,intr){intx;while(true){couttip;if(cinxxlxr)returnx;cout输入非法请输入 [l,r] 之间的整数。\n;cin.clear();cin.ignore(numeric_limitsstreamsize::max(),\n);}}intmain(){// 登录三次机会for(inti0;i3;i){if(login(3-i)){cls();menuLoop();return0;}}cout\n? 超过最大登录次数系统已退出。\n;return0;}