【实战项目 21-25】第 23/25 课

🤖 第23课:商场导购

📌 商场导购项目概述

商场导购机器人帮助顾客找店铺、查促销、规划路线,提升购物体验:

🛍️ 商场导购功能

功能描述技术
店铺搜索按名称/类别搜索NLU+数据库
路线规划最优购物路线TSP+楼层规划
促销推送个性化优惠信息画像匹配
活动推荐相关活动信息兴趣匹配

📌 店铺搜索与路线规划

import json, random

class MallGuideRobot:
    """商场导购机器人"""
    def __init__(self):
        self.name = "MallBot-01"
        self.floors = {
            "B1": {"name": "停车场", "shops": [], "facilities": ["停车场","电梯"]},
            "1F": {"name": "美妆珠宝", "shops": [
                {"name": "兰蔻", "category": "美妆", "location": "A01"},
                {"name": "周大福", "category": "珠宝", "location": "A05"},
                {"name": "丝芙兰", "category": "美妆", "location": "A10"},
            ], "facilities": ["服务台","电梯","洗手间"]},
            "2F": {"name": "女装鞋包", "shops": [
                {"name": "ZARA", "category": "女装", "location": "B01"},
                {"name": "耐克", "category": "运动", "location": "B05"},
                {"name": "百丽", "category": "鞋", "location": "B10"},
            ], "facilities": ["电梯","洗手间","母婴室"]},
            "3F": {"name": "男装童装", "shops": [
                {"name": "优衣库", "category": "休闲", "location": "C01"},
                {"name": "巴拉巴拉", "category": "童装", "location": "C05"},
            ], "facilities": ["电梯","洗手间"]},
            "4F": {"name": "餐饮娱乐", "shops": [
                {"name": "海底捞", "category": "火锅", "location": "D01"},
                {"name": "星巴克", "category": "咖啡", "location": "D05"},
                {"name": "万达影城", "category": "影院", "location": "D10"},
            ], "facilities": ["电梯","洗手间"]},
        }
        self.promotions = [
            {"shop": "兰蔻", "title": "满500减100", "valid": "本周末"},
            {"shop": "耐克", "title": "新品8折", "valid": "本周"},
            {"shop": "海底捞", "title": "新店开业6.8折", "valid": "本月"},
        ]

    def search_shop(self, query):
        """搜索店铺"""
        results = []
        for floor, info in self.floors.items():
            for shop in info["shops"]:
                if query.lower() in shop["name"].lower() or query in shop["category"]:
                    results.append({**shop, "floor": floor, "floor_name": info["name"]})
        return results

    def recommend(self, category=None, budget=None):
        """推荐店铺"""
        candidates = []
        for floor, info in self.floors.items():
            for shop in info["shops"]:
                if category and shop["category"] != category:
                    continue
                candidates.append({**shop, "floor": floor})
        return candidates

    def get_promotions(self, shop_name=None):
        """获取促销信息"""
        if shop_name:
            return [p for p in self.promotions if p["shop"] == shop_name]
        return self.promotions

    def plan_route(self, shops_to_visit):
        """规划购物路线"""
        route = []
        for shop in shops_to_visit:
            for floor, info in self.floors.items():
                for s in info["shops"]:
                    if s["name"] == shop:
                        route.append({"shop": shop, "floor": floor, "location": s["location"]})
        # 按楼层排序
        floor_order = ["1F","2F","3F","4F"]
        route.sort(key=lambda x: floor_order.index(x["floor"]) if x["floor"] in floor_order else 99)
        return route

robot = MallGuideRobot()
print("商场导购机器人模拟")
print("=" * 55)

print("\n🔍 搜索'美妆':")
for r in robot.search_shop("美妆"):
    print(f"  {r['name']} ({r['floor']} {r['floor_name']}) {r['location']}")

print("\n🔍 搜索'耐克':")
for r in robot.search_shop("耐克"):
    print(f"  {r['name']} ({r['floor']} {r['floor_name']}) {r['category']}")

print("\n📋 当前促销:")
for p in robot.get_promotions():
    print(f"  🏷️ {p['shop']}: {p['title']} ({p['valid']})")

print("\n🗺️ 购物路线(兰蔻→耐克→海底捞):")
route = robot.plan_route(["兰蔻","耐克","海底捞"])
for i, stop in enumerate(route):
    print(f"  {i+1}. {stop['shop']} ({stop['floor']} {stop['location']})")

print("\n✅ 商场导购验证通过")
✅ 验证通过 商场导购机器人模拟 ======================================================= 🔍 搜索'美妆': 兰蔻 (1F 美妆珠宝) A01 丝芙兰 (1F 美妆珠宝) A10 🔍 搜索'耐克': 耐克 (2F 女装鞋包) 运动 📋 当前促销: 🏷️ 兰蔻: 满500减100 (本周末) 🏷️ 耐克: 新品8折 (本周) 🏷️ 海底捞: 新店开业6.8折 (本月) 🗺️ 购物路线(兰蔻→耐克→海底捞): 1. 兰蔻 (1F A01) 2. 耐克 (2F B05) 3. 海底捞 (4F D01) ✅ 商场导购验证通过

📌 顾客画像与个性化推荐

class MallVisitorProfile:
    """顾客画像与个性化推荐"""
    def __init__(self):
        self.profiles = {}
        self.preference_categories = ["美妆","女装","男装","运动","童装","珠宝","餐饮","咖啡","影院"]
        self.category_shops = {
            "美妆": ["兰蔻","丝芙兰"], "女装": ["ZARA"], "运动": ["耐克"],
            "童装": ["巴拉巴拉"], "珠宝": ["周大福"], "餐饮": ["海底捞"],
            "咖啡": ["星巴克"], "休闲": ["优衣库"],
        }

    def create_or_update(self, visitor_id, interests=None, visit_history=None):
        """创建或更新顾客画像"""
        if visitor_id not in self.profiles:
            self.profiles[visitor_id] = {
                "interests": [], "visit_count": 0, "visit_history": [],
                "preferred_floors": [], "last_visit": None
            }
        
        profile = self.profiles[visitor_id]
        if interests:
            for interest in interests:
                if interest not in profile["interests"]:
                    profile["interests"].append(interest)
        if visit_history:
            profile["visit_history"].extend(visit_history)
        profile["visit_count"] += 1
        
        # 更新偏好楼层
        floor_map = {"美妆":"1F","珠宝":"1F","女装":"2F","运动":"2F",
                     "男装":"3F","童装":"3F","餐饮":"4F","咖啡":"4F"}
        profile["preferred_floors"] = list(set(
            floor_map.get(i,"") for i in profile["interests"] if i in floor_map
        ))
        
        return profile

    def recommend(self, visitor_id):
        """个性化推荐"""
        profile = self.profiles.get(visitor_id)
        if not profile or not profile["interests"]:
            return {"type": "default", "message": "推荐从1楼开始逛,每层都有惊喜!", "shops": []}
        
        recommended = []
        for interest in profile["interests"]:
            shops = self.category_shops.get(interest, [])
            for shop in shops:
                recommended.append({"shop": shop, "category": interest})
        
        return {"type": "personalized", "interests": profile["interests"],
                "floors": profile["preferred_floors"], "shops": recommended}

vp = MallVisitorProfile()
print("顾客画像与个性化推荐")
print("=" * 55)

vp.create_or_update("V001", ["美妆","餐饮","咖啡"])
vp.create_or_update("V002", ["运动","休闲"])
vp.create_or_update("V003")  # 新顾客

for vid in ["V001","V002","V003"]:
    rec = vp.recommend(vid)
    print(f"\n📋 顾客{vid}:")
    if rec["type"] == "personalized":
        print(f"   兴趣: {', '.join(rec['interests'])}")
        print(f"   推荐楼层: {', '.join(rec['floors'])}")
        print(f"   推荐店铺: {', '.join(s['shop'] for s in rec['shops'])}")
    else:
        print(f"   {rec['message']}")

print("\n✅ 顾客画像验证通过")
✅ 验证通过 顾客画像与个性化推荐 ======================================================= 📋 顾客V001: 兴趣: 美妆, 餐饮, 咖啡 推荐楼层: 1F, 4F 推荐店铺: 兰蔻, 丝芙兰, 海底捞, 星巴克 📋 顾客V002: 兴趣: 运动, 休闲 推荐楼层: 2F 推荐店铺: 耐克, 优衣库 📋 顾客V003: 推荐从1楼开始逛,每层都有惊喜! ✅ 顾客画像验证通过

📌 活动推送系统

class MallEventSystem:
    """商场活动推送系统"""
    def __init__(self):
        self.events = [
            {"name": "周末狂欢", "type": "promotion", "floor": "全楼层",
             "description": "全场满300减50", "start": "周六10:00", "end": "周日22:00"},
            {"name": "新品发布会", "type": "event", "floor": "1F",
             "description": "兰蔻新品首发体验", "start": "周五14:00", "end": "周五17:00"},
            {"name": "亲子乐园", "type": "activity", "floor": "3F",
             "description": "巴拉巴拉亲子DIY", "start": "周六10:00", "end": "周六12:00"},
            {"name": "美食节", "type": "promotion", "floor": "4F",
             "description": "餐饮5折起", "start": "本周", "end": "本周末"},
        ]
        self.push_rules = {
            "promotion": {"trigger": "路过对应楼层", "frequency": "一次"},
            "event": {"trigger": "兴趣匹配", "frequency": "一次"},
            "activity": {"trigger": "带小孩顾客", "frequency": "一次"},
        }

    def get_relevant_events(self, visitor_interests=None, current_floor=None, with_children=False):
        """获取相关活动"""
        relevant = []
        for event in self.events:
            score = 0
            if current_floor and (event["floor"] == current_floor or event["floor"] == "全楼层"):
                score += 2
            if visitor_interests:
                for interest in visitor_interests:
                    if interest in event["description"]:
                        score += 1
            if with_children and "亲子" in event["description"]:
                score += 3
            if score > 0:
                relevant.append({**event, "relevance": score})
        
        return sorted(relevant, key=lambda x: -x["relevance"])

es = MallEventSystem()
print("商场活动推送系统")
print("=" * 55)

print("\n2楼顾客(兴趣:运动)的相关活动:")
for e in es.get_relevant_events(["运动"], "2F"):
    print(f"  🎯 {e['name']} ({e['floor']}) - {e['description']} [相关度:{e['relevance']}]")

print("\n带小孩顾客的相关活动:")
for e in es.get_relevant_events(["童装"], "3F", with_children=True):
    print(f"  👨‍👩‍👧 {e['name']} ({e['floor']}) - {e['description']} [相关度:{e['relevance']}]")

print("\n✅ 活动推送验证通过")
✅ 验证通过 商场活动推送系统 ======================================================= 2楼顾客(兴趣:运动)的相关活动: 🎯 周末狂欢 (全楼层) - 全场满300减50 [相关度:2] 带小孩顾客的相关活动: 👨‍👩‍👧 亲子乐园 (3F) - 巴拉巴拉亲子DIY [相关度:5] 👨‍👩‍👧 周末狂欢 (全楼层) - 全场满300减50 [相关度:2] ✅ 活动推送验证通过

📌 商场场景特殊挑战

⚠️ 特殊挑战

挑战方案
人多拥挤社交导航+低速模式
声音嘈杂远场降噪+屏幕辅助
店铺变动云端地图实时更新
节假日人流动态路线+避峰引导

📌 练习

📝 练习 1

实现智能路线优化:根据实时人流量数据,避开拥挤区域,推荐最舒适购物路线。

📝 练习 2

设计AR导航:机器人屏幕显示AR箭头引导顾客到目标店铺。

📝 练习 3

实现购物清单管理:顾客输入购物清单,机器人规划最优路线并跟踪完成进度。

📌 成就

🏆 本课成就

◀ 上一课 📚 目录 下一课 ▶