
项目结构# encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Greedy 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/7/20 21:12 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : constants.py # 珠宝行业计算精度配置 CARAT_DECIMAL 3 MONEY_DECIMAL 2 EPS 1e-6 # 浮点数误差阈值 # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Greedy 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/7/20 21:13 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : exceptions.py class GemBaseError(Exception): 珠宝配石基础异常 pass class GemParamInvalidError(GemBaseError): 宝石参数非法克拉/价格小于等于0 pass class BudgetZeroError(GemBaseError): 预算为0或负数无法配石 pass class StockEmptyError(GemBaseError): 库存无裸石数据 pass # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Greedy 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/7/20 21:14 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : utils.py from Greedy.common.constants import CARAT_DECIMAL, MONEY_DECIMAL def round_carat(val: float) - float: 克拉统一保留3位小数 :param val: :return: return round(val, CARAT_DECIMAL) def round_money(val: float) - float: 金额统一保留2位小数 :param val: :return: return round(val, MONEY_DECIMAL) # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Greedy 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/7/20 21:16 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : gem_entity.py from dataclasses import dataclass from typing import List, Dict, Any from Greedy.common.utils import round_carat, round_money dataclass class GemStone: 宝石库存实体数据库映射模型 stone_name: str 宝石名称标识 total_carat: float 批次总克拉 batch_price: float 整批总价 property def unit_carat_value(self) - float: 单位价格对应克拉性价比贪心核心排序指标 :return: return self.total_carat / self.batch_price dataclass class GemAllocateItem: 单款宝石配石结果明细 stone_name: str use_carat: float use_cost: float dataclass class GemAllocateResultDTO: 配石完整输出DTOERP/API标准返回结构 budget_total: float cost_actual: float budget_remain: float total_carat: float detail_list: List[GemAllocateItem] def to_dict(self) - Dict[str, Any]: 序列化为字典供接口返回 :return: return { 预算总额: round_money(self.budget_total), 实际花费: round_money(self.cost_actual), 剩余预算: round_money(self.budget_remain), 总匹配克拉: round_carat(self.total_carat), 选用裸石明细: [ { 宝石名称: item.stone_name, 取用克拉: round_carat(item.use_carat), 花费金额: round_money(item.use_cost) } for item in self.detail_list ] } # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Greedy 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/7/20 21:18 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : base_repo.py from abc import ABC, abstractmethod from typing import List from Greedy.entity.gem_entity import GemStone class BaseGemRepository(ABC): 宝石仓储抽象层方便切换内存/数据库 仓储抽象基类 abstractmethod def add_gem(self, gem: GemStone) - None: 新增宝石库存 :param gem: :return: pass abstractmethod def get_all_gems(self) - List[GemStone]: 获取全部库存宝石 :return: pass abstractmethod def clear_all(self) - None: 清空库存数据复用实例 :return: pass abstractmethod def count(self) - int: 库存宝石批次数量 :return: pass # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Greedy 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/7/20 21:19 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : gem_memory_repo.py from typing import List from Greedy.repository.base_repo import BaseGemRepository from Greedy.entity.gem_entity import GemStone class GemMemoryRepository(BaseGemRepository): 内存仓储实现 def __init__(self): self._storage: List[GemStone] [] def add_gem(self, gem: GemStone) - None: :param gem: :return: self._storage.append(gem) def get_all_gems(self) - List[GemStone]: :return: return self._storage.copy() def clear_all(self) - None: :return: self._storage.clear() def count(self) - int: :return: return len(self._storage) # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Greedy 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/7/20 21:20 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : sort_strategy.py from abc import ABC, abstractmethod from typing import List from Greedy.entity.gem_entity import GemStone class BaseSortStrategy(ABC): 贪心排序策略抽象可自由扩展排序规则 可扩展排序策略策略模式 abstractmethod def sort(self, gem_list: List[GemStone]) - List[GemStone]: 对宝石列表排序返回有序列表 :param gem_list: :return: pass class UnitValueDescStrategy(BaseSortStrategy): 默认策略性价比单位克拉价值从高到低 def sort(self, gem_list: List[GemStone]) - List[GemStone]: return sorted(gem_list, keylambda x: x.unit_carat_value, reverseTrue) class MaxCaratDescStrategy(BaseSortStrategy): 扩展策略优先总克拉大的宝石 def sort(self, gem_list: List[GemStone]) - List[GemStone]: return sorted(gem_list, keylambda x: x.total_carat, reverseTrue) # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Greedy 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/7/20 21:22 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : base_greedy.py from abc import ABC, abstractmethod from typing import List from Greedy.entity.gem_entity import GemStone, GemAllocateItem class BaseGemGreedy(ABC): 配石贪心算法抽象基类 abstractmethod def calculate(self, gem_list: List[GemStone], budget: float) - List[GemAllocateItem]: 执行贪心计算返回配石明细列表 :param gem_list: :param budget: :return: pass # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Greedy 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/7/20 21:23 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : gem_fraction_greedy.py from typing import List from Greedy.algorithm.base_greedy import BaseGemGreedy from Greedy.algorithm.sort_strategy import BaseSortStrategy, UnitValueDescStrategy from Greedy.entity.gem_entity import GemStone, GemAllocateItem from Greedy.common.constants import EPS from Greedy.common.exceptions import BudgetZeroError class GemFractionGreedy(BaseGemGreedy): 可拆分裸石分数背包贪心算法支持注入不同排序策略 分数背包贪心实现核心算法 def __init__(self, sort_strategy: BaseSortStrategy None): self.sort_strategy sort_strategy or UnitValueDescStrategy() def calculate(self, gem_list: List[GemStone], budget: float) - List[GemAllocateItem]: :param gem_list: :param budget: :return: if budget EPS: raise BudgetZeroError(预算必须大于0) sorted_gems self.sort_strategy.sort(gem_list) remain_budget budget result_items: List[GemAllocateItem] [] for gem in sorted_gems: if remain_budget EPS: break if gem.batch_price remain_budget: use_carat gem.total_carat use_cost gem.batch_price else: ratio remain_budget / gem.batch_price use_carat gem.total_carat * ratio use_cost remain_budget item GemAllocateItem( stone_namegem.stone_name, use_caratuse_carat, use_costuse_cost ) result_items.append(item) remain_budget - use_cost return result_items # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Greedy 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/7/20 21:24 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : gem_allocate_service.py from Greedy.repository.base_repo import BaseGemRepository from Greedy.algorithm.base_greedy import BaseGemGreedy from Greedy.entity.gem_entity import GemStone, GemAllocateResultDTO from Greedy.common.exceptions import GemParamInvalidError, StockEmptyError from Greedy.common.constants import EPS class GemAllocateService: 配石业务服务层统一对外业务入口隔离底层算法与仓储 def __init__(self, repo: BaseGemRepository, greedy_alg: BaseGemGreedy): self.repo repo self.alg greedy_alg def add_stone_stock(self, stone_name: str, total_carat: float, batch_price: float) - None: 业务层新增库存宝石统一参数校验 :param stone_name: :param total_carat: :param batch_price: :return: if total_carat EPS or batch_price EPS: raise GemParamInvalidError(f宝石[{stone_name}]克拉/价格不能小于等于0) gem GemStone(stone_name, total_carat, batch_price) self.repo.add_gem(gem) def allocate(self, budget: float) - GemAllocateResultDTO: 执行完整配石业务流程 :param budget: :return: gem_list self.repo.get_all_gems() if len(gem_list) 0: raise StockEmptyError(当前宝石库存为空无法执行配石) detail_items self.alg.calculate(gem_list, budget) total_carat sum(i.use_carat for i in detail_items) total_cost sum(i.use_cost for i in detail_items) remain budget - total_cost dto GemAllocateResultDTO( budget_totalbudget, cost_actualtotal_cost, budget_remainremain, total_carattotal_carat, detail_listdetail_items ) return dto def clear_stock(self) - None: 清空库存处理下一笔订单 :return: self.repo.clear_all()调用# encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 # 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/7/20 21:29 # User : geovindu # Product : PyCharm # Project : PyAlgorithms # File : GreedyBll.py from Greedy.repository.gem_memory_repo import GemMemoryRepository from Greedy.algorithm.gem_fraction_greedy import GemFractionGreedy from Greedy.algorithm.sort_strategy import MaxCaratDescStrategy from Greedy.service.gem_allocate_service import GemAllocateService from Greedy.common.exceptions import GemBaseError class GreedyBll(object): def demo_case_1(self): 标准场景性价比优先贪心配石 :return: # 1. 组装底层依赖依赖注入 repo GemMemoryRepository() greedy_alg GemFractionGreedy() service GemAllocateService(reporepo, greedy_alggreedy_alg) # 2. 录入仓库裸石库存 service.add_stone_stock(0.8ct白钻, 0.8, 10500) service.add_stone_stock(0.5ct白钻, 0.5, 6800) service.add_stone_stock(0.3ct白钻, 0.3, 4200) service.add_stone_stock(0.2ct粉钻, 0.2, 2800) # 3. 执行配石预算18000 result_dto service.allocate(budget18000) print( 案例1性价比优先配石结果 ) print(result_dto.to_dict()) def demo_case_2(self): 扩展场景切换排序策略优先大克拉宝石 :return: repo GemMemoryRepository() # 注入自定义排序策略 big_carat_strategy MaxCaratDescStrategy() greedy_alg GemFractionGreedy(sort_strategybig_carat_strategy) service GemAllocateService(repo, greedy_alg) service.add_stone_stock(0.8ct白钻, 0.8, 10500) service.add_stone_stock(0.5ct白钻, 0.5, 6800) res service.allocate(budget12000) print(\n 案例2优先大克拉配石结果 ) print(res.to_dict()) def demo(self): :return: try: self.demo_case_1() self.demo_case_2() except GemBaseError as e: print(f业务异常{str(e)})代码实现了一个基于贪心算法的珠宝配石系统主要包含以下功能系统架构采用分层设计包含仓储层、算法层、业务层和实体层支持多种排序策略性价比优先、大克拉优先核心功能添加宝石库存名称、克拉数、价格根据预算自动计算最优配石方案支持宝石的分数分配可拆分实现细节包含参数校验和异常处理提供精确的金融计算保留3位小数精度采用策略模式实现不同排序算法内存仓储实现方便测试应用示例案例1性价比优先配石预算18,000案例2大克拉优先配石预算12,000该系统适用于珠宝行业的配石业务场景可灵活扩展不同的排序策略和算法实现。输出