python: Bit Operation Algorithm
项目结构# encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bit Operation Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/4 22:05 # User : geovindu # Product : PyCharm # Project : PyBitOperation # File : bfs_combine.py BFS位掩码子集遍历首饰礼盒最优搭配算法 约束总价上限、总克重上限找出价值利用率最高组合 职责纯算法计算无业务入参校验 from collections import deque from domain.entity.jewelry import Jewelry class BfsJewelryCombiner: def __init__(self, jewel_list: list[Jewelry], max_weight: float, max_price: float): self.jewels jewel_list self.n len(jewel_list) self.max_w max_weight self.max_p max_price def search_best_combine(self) - tuple[list[str], float, float]: 返回选中首饰ID列表、总重量、总价格 best_mask 0 best_value 0 queue deque() queue.append((0, 0.0, 0.0)) while queue: mask, cur_w, cur_p queue.popleft() # 计算当前组合价值 cur_value cur_p / cur_w if cur_w ! 0 else 0 if cur_value best_value: best_value cur_value best_mask mask # 扩展子集 for idx in range(self.n): if not (mask (1 idx)): new_mask mask | (1 idx) new_w cur_w self.jewels[idx].weight new_p cur_p self.jewels[idx].price if new_w self.max_w and new_p self.max_p: queue.append((new_mask, new_w, new_p)) # 解析掩码 select_ids [] total_w 0.0 total_p 0.0 for i in range(self.n): if best_mask (1 i): select_ids.append(self.jewels[i].jewel_id) total_w self.jewels[i].weight total_p self.jewels[i].price return select_ids, total_w, total_p # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bit Operation Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/4 22:05 # User : geovindu # Product : PyCharm # Project : PyBitOperation # File : bit_array.py 位图BitArray极致内存压缩千万级ID查重、假货黑名单批量过滤 1bit标记一个首饰ID存在状态1000万数据仅占用约1.2MB内存 class BitArray: def __init__(self, size: int): self.size size self._array bytearray((size 7) // 8) def set(self, index: int): 标记索引为存在 :param index: :return: if 0 index self.size: pos index // 8 bit index % 8 self._array[pos] | (1 bit) def unset(self, index: int): 标记索引为不存在 :param index: :return: if 0 index self.size: pos index // 8 bit index % 8 self._array[pos] ~(1 bit) def get(self, index: int) - bool: 查询是否存在 :param index: :return: if 0 index self.size: pos index // 8 bit index % 8 return (self._array[pos] (1 bit)) ! 0 return False def batch_check(self, index_list: list[int]) - list[bool]: 批量查询 :param index_list: :return: return [self.get(idx) for idx in index_list] def batch_set(self, index_list: list[int]): 批量标记 :param index_list: :return: for idx in index_list: self.set(idx) # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bit Operation Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/4 22:05 # User : geovindu # Product : PyCharm # Project : PyBitOperation # File : gale_shapley.py Gale-Shapley稳定婚配算法 结合位掩码计算偏好匹配度用于导购-客户双向稳定匹配 职责只实现匹配数学逻辑不介入业务流程编排 from domain.entity.customer import Customer from domain.entity.guide import Guide class GaleShapleyMatcher: def __init__(self, guide_list: list[Guide], customer_list: list[Customer]): self.guides guide_list self.customers customer_list self.guide_dict {g.guide_id: g for g in guide_list} self.customer_dict {c.customer_id: c for c in customer_list} # 匹配缓存 self.guide_match dict() self.customer_match dict() # 导购待追求客户指针 self.guide_ptr {g.guide_id: 0 for g in guide_list} def _get_customer_rank(self, guide: Guide, customer_id: str) - int: 导购视角客户优先级排序 :param guide: :param customer_id: :return: return guide.customer_priority.index(customer_id) def _get_guide_rank(self, customer: Customer, guide_id: str) - int: 客户视角导购优先级匹配度越高排名越靠前 :param customer: :param guide_id: :return: guide self.guide_dict[guide_id] score customer.match_score(guide.skill_mask) return -score def match(self) - dict: 执行稳定匹配返回{客户ID:导购ID} :return: free_guides [g.guide_id for g in self.guides] while free_guides: g_id free_guides.pop(0) guide self.guide_dict[g_id] ptr self.guide_ptr[g_id] if ptr len(guide.customer_priority): continue c_id guide.customer_priority[ptr] self.guide_ptr[g_id] 1 customer self.customer_dict[c_id] # 客户单身直接配对 if c_id not in self.customer_match: self.guide_match[g_id] c_id self.customer_match[c_id] g_id else: old_g_id self.customer_match[c_id] # 对比新旧导购客户选择更优 if self._get_guide_rank(customer, g_id) self._get_guide_rank(customer, old_g_id): self.guide_match[g_id] c_id self.customer_match[c_id] g_id del self.guide_match[old_g_id] free_guides.append(old_g_id) else: free_guides.append(g_id) return self.customer_match from api.match_api import api_match_guide_customer from api.combine_api import api_get_jewelry_combine from api.inventory_filter_api import api_create_filter_service from domain.entity.customer import Customer from domain.entity.guide import Guide from domain.entity.jewelry import Jewelry from domain.valueobject.bit_mask import PreferenceBitMask from domain.domain_rule.match_rule import MatchDomainRule if __name__ __main__: # 测试1GS导购客户匹配规则校验生效 # 构造离岗导购 g1 Guide(G001, PreferenceBitMask.DIAMOND | PreferenceBitMask.GOLD | MatchDomainRule.GUIDE_OFFLINE_MASK, [C001, C002]) g2 Guide(G002, PreferenceBitMask.JADE | PreferenceBitMask.PEARL | (128), [C002, C001]) c1 Customer(C001, PreferenceBitMask.DIAMOND | PreferenceBitMask.HIGH_PRICE, [G001, G002]) c2 Customer(C002, PreferenceBitMask.JADE, [G002, G001]) match_result api_match_guide_customer([g1, g2], [c1, c2]) print(导购客户稳定匹配结果带规则校验) print(match_result) # 测试2BFS首饰搭配材质互斥规则校验 jewel_data [ Jewelry(J001, PreferenceBitMask.GOLD, 2.2, 1280), Jewelry(J002, PreferenceBitMask.PLATINUM, 1.5, 2680), # 铂金和黄金互斥 Jewelry(J003, PreferenceBitMask.PEARL, 1.1, 890), Jewelry(J004, PreferenceBitMask.K_GOLD, 2.8, 1660), ] combine_res api_get_jewelry_combine(jewel_data, max_w5.0, max_p4000) print(\n首饰最优搭配互斥规则校验) print(combine_res) # 测试3位图查重黑名单过滤 filter_service api_create_filter_service(10000000) filter_service.register_jewel_index(J001, 1) filter_service.register_jewel_index(J002, 2) filter_service.batch_mark_inventory([J001, J002]) repeat filter_service.check_repeat([J001, J005]) filter_service.blacklist.add_fake(J999) safe filter_service.filter_blacklist([J001, J999]) print(\n库存查重结果) print(repeat) print(过滤黑名单合法商品) print(safe) # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bit Operation Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/4 22:35 # User : geovindu # Product : PyCharm # Project : PyBitOperation # File : match_rule.py 导购-客户匹配 领域约束规则 DDD定位领域业务规则仅负责匹配前置合法性校验、硬性门槛判断 职责 1. 校验导购/客户实体合法性 2. 匹配准入门槛约束在岗、会员等级、品类承接限制 3. 禁止跨约束匹配的判定 无算法实现、无业务流程编排、无存储读写 from domain.entity.customer import Customer from domain.entity.guide import Guide from domain.valueobject.bit_mask import PreferenceBitMask class MatchDomainRule: # 全局匹配硬性常量约束 # 导购离岗标记位 GUIDE_OFFLINE_MASK 1 30 # 客户黑名单标记位 CUSTOMER_BLACK_MASK 1 31 # 高奢品类必须资深导购承接掩码 LUXURY_MASK PreferenceBitMask.HIGH_PRICE | PreferenceBitMask.DIAMOND staticmethod def is_guide_valid(guide: Guide) - tuple[bool, str]: 校验导购是否可参与匹配 :return: (是否合法, 不合法原因) if not isinstance(guide, Guide): return False, 实体类型错误非导购Guide对象 if not guide.guide_id or len(guide.guide_id.strip()) 0: return False, 导购ID不能为空 if len(guide.customer_priority) 0: return False, 导购未配置客户接待优先级列表无法参与匹配 # 判定导购离岗 if (guide.skill_mask MatchDomainRule.GUIDE_OFFLINE_MASK) ! 0: return False, f导购[{guide.guide_id}]当前离岗禁止分配客户 return True, 导购校验通过 staticmethod def is_customer_valid(customer: Customer) - tuple[bool, str]: 校验客户是否可参与匹配 :param customer: :return: if not isinstance(customer, Customer): return False, 实体类型错误非客户Customer对象 if not customer.customer_id or len(customer.customer_id.strip()) 0: return False, 客户ID不能为空 if len(customer.priority_list) 0: return False, 客户未配置导购偏好优先级无法参与匹配 # 客户黑名单拦截 if (customer.preference_mask MatchDomainRule.CUSTOMER_BLACK_MASK) ! 0: return False, f客户[{customer.customer_id}]处于黑名单禁止分配导购接待 return True, 客户校验通过 staticmethod def check_luxury_match_limit(guide: Guide, customer: Customer) - tuple[bool, str]: 高奢业务强制约束选购钻石/高价奢侈品客户仅资深导购可承接 :param guide: :param customer: :return: customer_need_luxury (customer.preference_mask MatchDomainRule.LUXURY_MASK) ! 0 if not customer_need_luxury: return True, 非高奢需求无导购等级限制 # 用高位bit标记导购资深身份 senior_tag 1 28 if (guide.skill_mask senior_tag) 0: return False, f客户[{customer.customer_id}]存在高奢需求导购[{guide.guide_id}]非资深导购禁止匹配 return True, 高奢需求匹配资格校验通过 staticmethod def batch_check_match_entrance(guide_list: list[Guide], customer_list: list[Customer]) - tuple[list[Guide], list[Customer], list[str]]: 批量准入校验过滤不合格导购、客户返回合法集合异常日志 :return: 合法导购列表、合法客户列表、异常描述列表 :param guide_list: :param customer_list: :return: valid_guides [] valid_customers [] error_logs [] for guide in guide_list: ok, msg MatchDomainRule.is_guide_valid(guide) if ok: valid_guides.append(guide) else: error_logs.append(f导购过滤{msg}) for customer in customer_list: ok, msg MatchDomainRule.is_customer_valid(customer) if ok: valid_customers.append(customer) else: error_logs.append(f客户过滤{msg}) return valid_guides, valid_customers, error_logs # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bit Operation Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/4 22:04 # User : geovindu # Product : PyCharm # Project : PyBitOperation # File : blacklist.py 假货黑名单实体假货编码集合 class BlackList: def __init__(self): self.fake_ids: set[str] set() def add_fake(self, jewel_id: str): self.fake_ids.add(jewel_id) def batch_add(self, id_list: list[str]): self.fake_ids.update(id_list) # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bit Operation Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/4 22:04 # User : geovindu # Product : PyCharm # Project : PyBitOperation # File : customer.py 客户领域实体唯一ID、偏好掩码、优先级清单 from domain.valueobject.bit_mask import PreferenceBitMask class Customer: def __init__(self, customer_id: str, preference_mask: int, priority_list: list[str]): self.customer_id customer_id self.preference_mask: int preference_mask # 位掩码偏好 self.priority_list: list[str] priority_list # 个人偏好优先级GS算法排序依据 def match_score(self, guide_preference_mask: int) - int: 计算和导购偏好重合度重合bit数量 :param guide_preference_mask: :return: same_bits self.preference_mask guide_preference_mask return bin(same_bits).count(1) # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bit Operation Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/4 22:04 # User : geovindu # Product : PyCharm # Project : PyBitOperation # File : guide.py 导购领域实体擅长品类掩码、客户接待优先级清单 class Guide: def __init__(self, guide_id: str, skill_mask: int, customer_priority: list[str]): self.guide_id guide_id self.skill_mask: int skill_mask self.customer_priority: list[str] customer_priority # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bit Operation Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/4 22:07 # User : geovindu # Product : PyCharm # Project : PyBitOperation # File : jewelry.py 首饰实体唯一编码、材质掩码、重量、单价、搭配分组标记 class Jewelry: def __init__(self, jewel_id: str, mask: int, weight: float, price: float, group_tag: int 0): self.jewel_id jewel_id self.mask mask self.weight weight self.price price self.group_tag group_tag # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bit Operation Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/4 22:03 # User : geovindu # Product : PyCharm # Project : PyBitOperation # File : bit_mask.py 值对象首饰品类、材质、风格偏好固定比特定义全局唯一 1bit1个偏好标签64bit支持64类偏好可无限扩容 class PreferenceBitMask: # 材质掩码 GOLD 1 0 K_GOLD 1 1 PLATINUM 1 2 DIAMOND 1 3 JADE 1 4 PEARL 1 5 RUBY 1 6 SAPPHIRE 1 7 # 风格掩码 LUXURY 1 10 SIMPLE 1 11 RETRO 1 12 MINIMALIST 1 13 # 价位档位掩码 LOW_PRICE 1 20 MID_PRICE 1 21 HIGH_PRICE 1 22 classmethod def get_all_masks(cls) - dict: 获取全部掩码字典用于解码 attr_dict {} for attr in dir(cls): if not attr.startswith(__) and isinstance(getattr(cls, attr), int): attr_dict[attr] getattr(cls, attr) return attr_dict # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bit Operation Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/4 22:02 # User : geovindu # Product : PyCharm # Project : PyBitOperation # File : bit_helper.py 底层位运算通用工具类基础设施层仅提供基础原子操作 职责位与、或、异或、掩码生成、子集遍历、位判断无业务逻辑 class BitHelper: staticmethod def add_mask(source: int, mask: int) - int: 添加标记 或运算 :param source: :param mask: :return: return source | mask staticmethod def remove_mask(source: int, mask: int) - int: 移除标记 与取反 :param source: :param mask: :return: return source (~mask) staticmethod def has_mask(source: int, mask: int) - bool: 判断是否包含指定标记 :param source: :param mask: :return: return (source mask) mask staticmethod def has_any_mask(source: int, mask_list: list[int]) - bool: 包含任意一个掩码 :param source: :param mask_list: :return: union_mask 0 for m in mask_list: union_mask | m return (source union_mask) 0 staticmethod def get_all_sub_mask(max_len: int): 生成0~2^n-1所有子集掩码迭代器 :param max_len: :return: for mask in range(0, 1 max_len): yield mask # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bit Operation Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/4 22:02 # User : geovindu # Product : PyCharm # Project : PyBitOperation # File : base_storage.py 仓储顶层抽象依赖倒置领域层不依赖具体存储实现 from abc import ABC, abstractmethod class BaseStorage(ABC): abstractmethod def save(self, key, value): pass abstractmethod def get(self, key): pass abstractmethod def batch_save(self, data_dict: dict): pass abstractmethod def batch_exist_check(self, keys: list) - list[bool]: pass # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bit Operation Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/4 22:03 # User : geovindu # Product : PyCharm # Project : PyBitOperation # File : memory_storage.py from infrastructure.storage.base_storage import BaseStorage class MemoryStorage(BaseStorage): def __init__(self): self._data_map dict() def save(self, key, value): self._data_map[key] value def get(self, key): return self._data_map.get(key, None) def batch_save(self, data_dict: dict): self._data_map.update(data_dict) def batch_exist_check(self, keys: list) - list[bool]: return [k in self._data_map for k in keys]# encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bit Operation Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/4 22:08 # User : geovindu # Product : PyCharm # Project : PyBitOperation # File : combine_api.py from application.combine_app_service import JewelryCombineAppService from domain.entity.jewelry import Jewelry combine_service JewelryCombineAppService() def api_get_jewelry_combine(jewel_list: list[Jewelry], max_w: float, max_p: float): :param jewel_list: :param max_w: :param max_p: :return: return combine_service.get_best_combine(jewel_list, max_w, max_p) # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bit Operation Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/4 22:09 # User : geovindu # Product : PyCharm # Project : PyBitOperation # File : inventory_filter_api.py from application.inventory_app_service import InventoryFilterAppService def api_create_filter_service(max_size: int) - InventoryFilterAppService: :param max_size: :return: return InventoryFilterAppService(max_size) # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bit Operation Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/4 22:08 # User : geovindu # Product : PyCharm # Project : PyBitOperation # File : match_api.py from application.match_app_service import GuideCustomerMatchAppService from domain.entity.customer import Customer from domain.entity.guide import Guide match_service GuideCustomerMatchAppService() def api_match_guide_customer(guides: list[Guide], customers: list[Customer]) - dict: :param guides: :param customers: :return: return match_service.do_match(guides, customers) # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bit Operation Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/4 22:06 # User : geovindu # Product : PyCharm # Project : PyBitOperation # File : combine_app_service.py from domain.algorithm.bfs_combine import BfsJewelryCombiner from domain.entity.jewelry import Jewelry from domain.domain_rule.combine_rule import CombineDomainRule class JewelryCombineAppService: def get_best_combine(self, jewel_list: list[Jewelry], max_weight: float, max_price: float): :param jewel_list: :param max_weight: :param max_price: :return: # 1、领域规则过滤合法首饰 valid_jewels, err_log CombineDomainRule.batch_filter_available_jewels(jewel_list) if len(valid_jewels) 0: return { code: -1, msg: 无合法首饰可搭配, error: err_log, select_jewel_ids: [], total_weight: 0, total_price: 0 } # 2、BFS算法计算最优组合 combiner BfsJewelryCombiner(valid_jewels, max_weight, max_price) ids, w, p combiner.search_best_combine() # 3、组装组合掩码做最终全量合规校验 combine_mask 0 select_jewel_obj [] for j in valid_jewels: if j.jewel_id in ids: combine_mask | j.mask select_jewel_obj.append(j) check_ok, check_msg CombineDomainRule.full_combine_check(combine_mask, select_jewel_obj, w, p, max_weight, max_price) return { code: 0 if check_ok else -2, msg: check_msg if not check_ok else 搭配方案合规, filter_error: err_log, select_jewel_ids: ids, total_weight: round(w, 2), total_price: round(p, 2) } # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bit Operation Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/4 22:08 # User : geovindu # Product : PyCharm # Project : PyBitOperation # File : inventory_app_service.py from domain.algorithm.bit_array import BitArray from domain.entity.blacklist import BlackList class InventoryFilterAppService: def __init__(self, max_inventory_num: int): self.bit_array BitArray(max_inventory_num) self.blacklist BlackList() self.id_index_map dict() self.index_id_map dict() def register_jewel_index(self, jewel_id: str, idx: int): 首饰ID与位图索引绑定 :param jewel_id: :param idx: :return: self.id_index_map[jewel_id] idx self.index_id_map[idx] jewel_id def batch_mark_inventory(self, id_list: list[str]): 批量标记在库首饰 :param id_list: :return: idx_list [self.id_index_map[i] for i in id_list if i in self.id_index_map] self.bit_array.batch_set(idx_list) def check_repeat(self, check_ids: list[str]) - list[tuple[str, bool]]: 查重True已存在重复 :param check_ids: :return: res [] for jid in check_ids: idx self.id_index_map.get(jid, -1) exist self.bit_array.get(idx) if idx ! -1 else False res.append((jid, exist)) return res def filter_blacklist(self, check_ids: list[str]) - list[str]: 过滤黑名单返回合法首饰ID :param check_ids: :return: safe_list [jid for jid in check_ids if jid not in self.blacklist.fake_ids] return safe_list # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bit Operation Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/4 22:06 # User : geovindu # Product : PyCharm # Project : PyBitOperation # File : match_app_service.py 应用服务编排GS算法、实体组装、参数预处理不写核心算法 from domain.algorithm.gale_shapley import GaleShapleyMatcher from domain.entity.customer import Customer from domain.entity.guide import Guide from domain.domain_rule.match_rule import MatchDomainRule class GuideCustomerMatchAppService: def do_match(self, guide_list: list[Guide], customer_list: list[Customer]) - dict: :param guide_list: :param customer_list: :return: # 1. 执行领域前置约束校验 valid_guides, valid_customers, error_logs MatchDomainRule.batch_check_match_entrance(guide_list, customer_list) # 无合法对象直接返回空 if len(valid_guides) 0 or len(valid_customers) 0: return {code: -1, msg: 无合法导购/客户匹配终止, error: error_logs, match_result: {}} # 2. 执行GS算法匹配 matcher GaleShapleyMatcher(valid_guides, valid_customers) raw_result matcher.match() # 3. 返回结构化结果 return { code: 0, msg: 匹配成功, error_log: error_logs, match_data: raw_result }调用# encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bit Operation Algorithm # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/8/4 22:02 # User : geovindu # Product : PyCharm # Project : PyBitOperation # File : main.py from api.match_api import api_match_guide_customer from api.combine_api import api_get_jewelry_combine from api.inventory_filter_api import api_create_filter_service from domain.entity.customer import Customer from domain.entity.guide import Guide from domain.entity.jewelry import Jewelry from domain.valueobject.bit_mask import PreferenceBitMask from domain.domain_rule.match_rule import MatchDomainRule if __name__ __main__: # 测试1GS导购客户匹配规则校验生效 # 构造离岗导购 g1 Guide(G001, PreferenceBitMask.DIAMOND | PreferenceBitMask.GOLD | MatchDomainRule.GUIDE_OFFLINE_MASK, [C001, C002]) g2 Guide(G002, PreferenceBitMask.JADE | PreferenceBitMask.PEARL | (128), [C002, C001]) c1 Customer(C001, PreferenceBitMask.DIAMOND | PreferenceBitMask.HIGH_PRICE, [G001, G002]) c2 Customer(C002, PreferenceBitMask.JADE, [G002, G001]) match_result api_match_guide_customer([g1, g2], [c1, c2]) print(导购客户稳定匹配结果带规则校验) print(match_result) # 测试2BFS首饰搭配材质互斥规则校验 jewel_data [ Jewelry(J001, PreferenceBitMask.GOLD, 2.2, 1280), Jewelry(J002, PreferenceBitMask.PLATINUM, 1.5, 2680), # 铂金和黄金互斥 Jewelry(J003, PreferenceBitMask.PEARL, 1.1, 890), Jewelry(J004, PreferenceBitMask.K_GOLD, 2.8, 1660), ] combine_res api_get_jewelry_combine(jewel_data, max_w5.0, max_p4000) print(\n首饰最优搭配互斥规则校验) print(combine_res) # 测试3位图查重黑名单过滤 filter_service api_create_filter_service(10000000) filter_service.register_jewel_index(J001, 1) filter_service.register_jewel_index(J002, 2) filter_service.batch_mark_inventory([J001, J002]) repeat filter_service.check_repeat([J001, J005]) filter_service.blacklist.add_fake(J999) safe filter_service.filter_blacklist([J001, J999]) print(\n库存查重结果) print(repeat) print(过滤黑名单合法商品) print(safe)输出

相关新闻

2026最权威的五大AI学术助手实际效果

2026最权威的五大AI学术助手实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 有这样一种一键生成论文的工具, 它依靠高效算法伴着海量学术资源, 正重塑着学术写作模式, 它…

2026/10/11 3:18:06 阅读更多 →
FreeSCADA:基于.NET/WPF/XAML技术栈的企业级开源SCADA系统架构设计

FreeSCADA:基于.NET/WPF/XAML技术栈的企业级开源SCADA系统架构设计

FreeSCADA:基于.NET/WPF/XAML技术栈的企业级开源SCADA系统架构设计 【免费下载链接】FreeSCADA 项目地址: https://gitcode.com/gh_mirrors/fr/FreeSCADA FreeSCADA是一款基于微软.NET技术栈构建的开源数据采集与监视控制系统,专为工业自动化场景…

2026/10/8 11:59:41 阅读更多 →
告别传统OCR:Unlimited-OCR-6bit如何让Apple Silicon性能提升300%

告别传统OCR:Unlimited-OCR-6bit如何让Apple Silicon性能提升300%

告别传统OCR:Unlimited-OCR-6bit如何让Apple Silicon性能提升300% 【免费下载链接】Unlimited-OCR-6bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/Unlimited-OCR-6bit Unlimited-OCR-6bit是百度官方Unlimited-OCR模型的6位仿射量化MLX转…

2026/9/25 4:31:17 阅读更多 →

最新新闻

UE5 C++ JSON读写:FJsonObject与FJsonValue完全解析

UE5 C++ JSON读写:FJsonObject与FJsonValue完全解析

最近在某个项目的存档模块里折腾 JSON 读写,UE5 的 C 侧 API 绕来绕去,最后发现核心就两个类:FJsonObject和FJsonValue。如果你也在跟教程学 UE5 C 的 JSON 部分,到了第 61-3 节这里刚好进入最绕的一段——类继承链、各种 Value 子…

2026/10/13 13:37:18 阅读更多 →
低代码平台定制化能力边界:从需求分级到选型落地

低代码平台定制化能力边界:从需求分级到选型落地

低代码/无代码平台这两年风头很猛,几乎每个做企业服务的团队都在聊。但落到实际选型时,大家心里其实都悬着一个问题:这种拖拖拽拽就能搭出来的系统,到底能不能扛住企业里那些“奇奇怪怪”的定制化需求?我接触过不少项目…

2026/10/13 13:37:18 阅读更多 →
智能体技能库实战:从函数堆砌到可编排技能体系

智能体技能库实战:从函数堆砌到可编排技能体系

那段时间我正好在做一个内部数据分析Agent,功能倒是不复杂,但技能函数越堆越多,从最初的十几个一路涨到八十多个。真正让我警醒的是一次线上失误:模型在众多工具里挑了一个相近但错误的函数去执行,把周报数据算成了残缺…

2026/10/13 13:37:18 阅读更多 →
数据复制实战:HDFS副本策略、机架感知与DistCp一致性校验

数据复制实战:HDFS副本策略、机架感知与DistCp一致性校验

做大数据这些年,我越来越确信一件事:分布式系统里“数据复制”才是那个平时看不见、出事全靠它的底层保命机制。节点掉盘、误删目录、磁盘静默损坏、跨集群迁移容灾,每一件都绕不开“复制”两个字。这篇文章想把数据复制的核心技术拆开讲清楚…

2026/10/13 13:37:18 阅读更多 →
CSAPP第九章精要:虚拟内存机制与malloc实现原理

CSAPP第九章精要:虚拟内存机制与malloc实现原理

1. 为什么学完CSAPP第九章,我反而更不敢写malloc了?刚带完一届某高校系统编程实训课,有个现象特别有意思:学生把《深入理解计算机系统》(CSAPP)第九章“虚拟存储器”从9.1读到9.5,笔记记得密密麻…

2026/10/13 13:37:18 阅读更多 →
入侵检测与入侵防御:IDS和IPS的区别、原理与部署实践

入侵检测与入侵防御:IDS和IPS的区别、原理与部署实践

入侵检测和入侵防御这两个概念,从名字上只差两个字,但真实网络里的差别相当大。很多刚接触安全建设的人,习惯把二者当成“功能差不多的同类设备”,结果通常到部署那一刻才反应过来:一个只能看,一个真的动手…

2026/10/13 13:36:17 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →