决策树方法根据指定条件筛选方案
代码功能说明
-
条件类:
Condition
类用于定义每个条件的范围,并提供一个方法is_satisfied
来检查输入值是否满足该条件。 -
算法选择器类:
AlgorithmSelector
类负责应用条件并记录不满足的条件。它提供方法apply_condition
用于更新可用算法,get_selected_algorithm
用于返回选中的算法,以及log_failed_conditions
方法用于输出失败的条件信息。 -
规则定义:
rules
字典中定义了每个条件的范围以及对应的适用算法。通过这种方式,您可以轻松扩展或修改条件和算法的对应关系。 -
选择算法:
select_algorithm
函数根据输入值和启用的开关选择合适的算法。它将输入值传递给AlgorithmSelector
进行处理,并最终返回符合条件的算法编号。
可扩展性
- 添加新条件:要添加新条件,只需在
rules
字典中添加新的条件范围和适用算法。 - 修改条件:可以直接修改
rules
中的条件范围或对应的算法集合。 - 启用/禁用条件:可以通过开关参数灵活地启用或禁用某些条件。
class Condition:def __init__(self, min_value, max_value, name):self.min_value = min_valueself.max_value = max_valueself.name = namedef is_satisfied(self, input_value):return self.min_value <= input_value < self.max_valueclass AlgorithmSelector:def __init__(self):self.algorithms = set(range(8)) # 假设有8个算法self.failed_conditions = []def apply_condition(self, condition, input_value, applicable_algorithms):if condition.is_satisfied(input_value):self.algorithms.intersection_update(applicable_algorithms)else:self.failed_conditions.append(f"Condition '{condition.name}' failed. "f"Input value: {input_value}, "f"expected range: [{condition.min_value}, {condition.max_value})")def get_selected_algorithm(self):return next(iter(self.algorithms), -1) # 返回第一个符合条件的算法,若无则返回-1def log_failed_conditions(self):if not self.failed_conditions:print("All conditions passed.")else:print("Failed conditions:")for condition in self.failed_conditions:print(f" - {condition}")# 定义每个条件的范围和适用的算法
rules = {"ISO": [(Condition(0, 200, "ISO 0-200"), {0}),(Condition(200, 800, "ISO 200-800"), {1, 2}),(Condition(800, float('inf'), "ISO 800+"), {2}),],"Facelv": [(Condition(0, 2, "Facelv 0-2"), {0, 3}),(Condition(2, 5, "Facelv 2-5"), {3}),],"Zoom": [(Condition(0, 2.0, "Zoom 0-2.0"), {1}),(Condition(2.0, 3.0, "Zoom 2.0-3.0"), {4}),(Condition(3.0, float('inf'), "Zoom 3.0+"), {4, 5}),],"Face Count": [(Condition(0, 2, "Face Count 0-2"), {2}),(Condition(3, 5, "Face Count 3-5"), {2, 4}),(Condition(6, float('inf'), "Face Count 6+"), {4, 6}),],"Face Size": [(Condition(0, 50, "Face Size 0-50"), {3}),(Condition(50, 100, "Face Size 50-100"), {5}),(Condition(100, float('inf'), "Face Size 100+"), {3, 7}),],
}def select_algorithm(iso, facelv, zoom, face_count, face_size,use_iso=True, use_facelv=True, use_zoom=True, use_face_count=True, use_face_size=False):selector = AlgorithmSelector()# 输入值列表和条件启用的开关inputs = [iso, facelv, zoom, face_count, face_size]switches = [use_iso, use_facelv, use_zoom, use_face_count, use_face_size]# 遍历每个条件for i, (condition_name, conditions) in enumerate(rules.items()):if switches[i]: # 如果该条件启用for condition, applicable_algorithms in conditions:selector.apply_condition(condition, inputs[i], applicable_algorithms)# 输出不满足的条件selector.log_failed_conditions()# 返回选择的算法return selector.get_selected_algorithm()# 示例输入
iso = 300
facelv = 3
zoom = 2.5
face_count = 4
face_size = 75# 启用/禁用各条件的开关
selected_algorithm = select_algorithm(iso, facelv, zoom, face_count, face_size,use_iso=True,use_facelv=True,use_zoom=True,use_face_count=True,use_face_size=False)if selected_algorithm != -1:print(f"根据条件,选择的算法是: {selected_algorithm}")
else:print("未找到符合条件的算法。")
C++实现:
#include <iostream>
#include <vector>
#include <set>
#include <limits>
#include <string>class Condition {
public:Condition(double min_value, double max_value, const std::string& name): min_value(min_value), max_value(max_value), name(name) {}bool isSatisfied(double input_value) const {return min_value <= input_value && input_value < max_value;}const std::string& getName() const {return name;}private:double min_value;double max_value;std::string name;
};class AlgorithmSelector {
public:AlgorithmSelector() : algorithms({0, 1, 2, 3, 4, 5, 6, 7}) {}void applyCondition(const Condition& condition, double input_value, const std::set<int>& applicable_algorithms) {if (condition.isSatisfied(input_value)) {intersectAlgorithms(applicable_algorithms);} else {failed_conditions.push_back("Condition '" + condition.getName() + "' failed. ""Input value: " + std::to_string(input_value) + ", expected range: [" + std::to_string(condition.getMin()) + ", " + std::to_string(condition.getMax()) + ")");}}int getSelectedAlgorithm() const {return algorithms.empty() ? -1 : *algorithms.begin(); // 返回第一个符合条件的算法,若无则返回-1}void logFailedConditions() const {if (failed_conditions.empty()) {std::cout << "All conditions passed." << std::endl;} else {std::cout << "Failed conditions:" << std::endl;for (const auto& condition : failed_conditions) {std::cout << " - " << condition << std::endl;}}}private:std::set<int> algorithms;std::vector<std::string> failed_conditions;void intersectAlgorithms(const std::set<int>& applicable_algorithms) {std::set<int> intersection;for (const auto& algo : algorithms) {if (applicable_algorithms.count(algo) > 0) {intersection.insert(algo);}}algorithms = intersection; // 更新可用算法}
};// 定义每个条件的范围和适用的算法
const std::vector<std::pair<Condition, std::set<int>>> rules[] = {{{0, 200, "ISO 0-200"}, {0}},{{200, 800, "ISO 200-800"}, {1, 2}},{{800, std::numeric_limits<double>::infinity(), "ISO 800+"}, {2}},{{0, 2, "Facelv 0-2"}, {0, 3}},{{2, 5, "Facelv 2-5"}, {3}},{{0, 2.0, "Zoom 0-2.0"}, {1}},{{2.0, 3.0, "Zoom 2.0-3.0"}, {4}},{{3.0, std::numeric_limits<double>::infinity(), "Zoom 3.0+"}, {4, 5}},{{0, 2, "Face Count 0-2"}, {2}},{{3, 5, "Face Count 3-5"}, {2, 4}},{{6, std::numeric_limits<double>::infinity(), "Face Count 6+"}, {4, 6}},{{0, 50, "Face Size 0-50"}, {3}},{{50, 100, "Face Size 50-100"}, {5}},{{100, std::numeric_limits<double>::infinity(), "Face Size 100+"}, {3, 7}}
};int selectAlgorithm(double iso, double facelv, double zoom, double face_count, double face_size,bool use_iso = true, bool use_facelv = true, bool use_zoom = true, bool use_face_count = true, bool use_face_size = true) {AlgorithmSelector selector;// 输入值和启用的开关std::vector<double> inputs = {iso, facelv, zoom, face_count, face_size};std::vector<bool> switches = {use_iso, use_facelv, use_zoom, use_face_count, use_face_size};// 遍历每个条件for (size_t i = 0; i < switches.size(); ++i) {if (switches[i]) { // 如果该条件启用for (const auto& rule : rules[i]) {selector.applyCondition(rule.first, inputs[i], rule.second);}}}// 输出不满足的条件selector.logFailedConditions();// 返回选择的算法return selector.getSelectedAlgorithm();
}int main() {// 示例输入double iso = 300;double facelv = 3;double zoom = 2.5;double face_count = 4;double face_size = 75;// 启用/禁用各条件的开关int selected_algorithm = selectAlgorithm(iso, facelv, zoom, face_count, face_size,true, true, true, true, false);if (selected_algorithm != -1) {std::cout << "根据条件,选择的算法是: " << selected_algorithm << std::endl;} else {std::cout << "未找到符合条件的算法。" << std::endl;}return 0;
}
比较有意思的实现:
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#include <iterator>// 定义规则结构
struct Rule {std::vector<std::pair<double, double>> ranges; // 条件范围std::vector<std::set<int>> actions; // 对应算法的集合
};// 定义规则表,适应同一条件多个范围对应多个算法的情况
std::vector<Rule> rules = {{ {{0, 200}, {200, 800}, {800, 1e9}}, {{0}, {1, 2}, {2}} }, // iso规则{ {{0, 2}, {2, 5}}, {{0, 3}, {3}} }, // facelv规则{ {{0, 2.0}, {2.0, 3.0}, {3.0, 1e9}}, {{1}, {4}, {4, 5}} }, // zoom规则{ {{0, 2}, {3, 5}, {6, 1e9}}, {{2}, {2, 4}, {4, 6}} }, // face_count规则{ {{0, 50}, {50, 100}, {100, 1e9}}, {{3}, {5}, {3, 7}} } // face_size规则
};// 根据输入条件和开关选择最优算法
int select_algorithm(double iso, double facelv, double zoom, double face_count, double face_size,bool use_iso, bool use_facelv, bool use_zoom, bool use_face_count, bool use_face_size) {std::set<int> selected_actions = {0, 1, 2, 3, 4, 5, 6, 7}; // 初始假设有8种算法// 输入条件值std::vector<double> inputs = {iso, facelv, zoom, face_count, face_size};// 各条件是否启用的开关std::vector<bool> switches = {use_iso, use_facelv, use_zoom, use_face_count, use_face_size};// 遍历每个条件for (int i = 0; i < rules.size(); ++i) {if (!switches[i]) continue; // 如果该条件未启用,跳过const Rule& rule = rules[i];std::set<int> current_matching_actions; // 用于存储该条件下匹配的算法// 遍历每个范围,找到满足当前条件的所有算法集合for (int j = 0; j < rule.ranges.size(); ++j) {if (inputs[i] >= rule.ranges[j].first && inputs[i] < rule.ranges[j].second) {current_matching_actions.insert(rule.actions[j].begin(), rule.actions[j].end());}}// 如果当前条件有匹配的算法,取交集if (!current_matching_actions.empty()) {std::set<int> intersection;std::set_intersection(selected_actions.begin(), selected_actions.end(),current_matching_actions.begin(), current_matching_actions.end(),std::inserter(intersection, intersection.begin()));selected_actions = intersection;}}// 返回第一个符合条件的算法return selected_actions.empty() ? -1 : *selected_actions.begin();
}int main() {// 示例输入double iso = 300;double facelv = 3;double zoom = 2.5;double face_count = 4;double face_size = 75;// 启用/禁用各条件的开关bool use_iso = true;bool use_facelv = true;bool use_zoom = true;bool use_face_count = true;bool use_face_size = false; // 例如不使用face_size条件// 调用选择函数int selected_algorithm = select_algorithm(iso, facelv, zoom, face_count, face_size,use_iso, use_facelv, use_zoom, use_face_count, use_face_size);if (selected_algorithm != -1) {std::cout << "根据条件,选择的算法是: " << selected_algorithm << std::endl;} else {std::cout << "未找到符合条件的算法。" << std::endl;}return 0;
}
相关文章:
决策树方法根据指定条件筛选方案
代码功能说明 条件类:Condition 类用于定义每个条件的范围,并提供一个方法 is_satisfied 来检查输入值是否满足该条件。 算法选择器类:AlgorithmSelector 类负责应用条件并记录不满足的条件。它提供方法 apply_condition 用于更新可用算法&a…...
多特征变量序列预测(四) Transformer-BiLSTM风速预测模型
往期精彩内容: 时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较 全是干货 | 数据集、学习资料、建模资源分享! EMD、EEMD、FEEMD、CEEMD、CEEMDAN的区别、原理和Python实现(一)EMD-CSDN博客 EMD、EEM…...
【开源免费】基于SpringBoot+Vue.JS蜗牛兼职平台 (JAVA毕业设计)
本文项目编号 T 034 ,文末自助获取源码 \color{red}{T034,文末自助获取源码} T034,文末自助获取源码 目录 一、系统介绍1.1 平台架构1.2 管理后台1.3 用户网页端1.4 技术特点 二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景…...
Ajax笔记
介绍 Ajax是一种网页开发技术,全称是Asynchronous JavaScript and XML(异步JavaScript和XML)。作用如下: 数据交换:可以通过Ajax给服务器发送请求,并获取服务器响应的数据。即前端动态的发送Ajax到服务器端…...
软考:缓存分片和一致性哈希
缓存分片技术是一种将数据分散存储在多个节点上的方法,它在分布式缓存系统中尤为重要。这项技术的核心目的是提高系统的性能和可扩展性,同时确保数据的高可用性。以下是缓存分片技术的一些关键点: 数据分片:缓存分片涉及将数据分成…...
3109 体验积分值
经验值:1200 时间限制:1000毫秒 内存限制:128MB 合肥市第34届信息学竞赛(2017年) 不许抄袭,一旦发现,直接清空经验! 题目描述 Description 卡卡西和小朋友们做完了烧脑的数字游…...
初识jsp
学习本章节前建议先安装Tomcat web服务器:tomcat下载安装及配置教程_tomcat安装-CSDN博客 1、概念 我的第一个JSP程序: 在WEB-INF目录之外创建一个index.jsp文件,然后这个文件中没有任何内容。将上面的项目部署之后,启动服务器…...
Ansible 的脚本 --- playbooks剧本
playbooks 本身由以下各部分组成 (1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行 (2)Vars:变量 (3)Templates:模板 &a…...
Windows 死机时 系统错误日志分析与故障排除
目录 前言正文 前言 对于服务器异常重启,推荐阅读:详细分析服务器自动重启原因(涉及Linux、Window) 以下主要做一个总结梳理 正文 查看系统事件日志: 可以查看系统事件日志,找出可能导致系统崩溃的错误…...
基于pytorch搭建CNN
先上代码 import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F from torchvision import datasets, transforms import matplotlib.pyplot as plt import numpy as np import pandas as pd import matplotlibmatplotlib.use(tkA…...
C#实现与Windows服务的交互与控制
在C#中,与Windows服务进行交互和控制通常涉及以下几个步骤: 创建Windows服务:首先,需要创建一个Windows服务项目。可以使用Visual Studio中的“Windows 服务 (.NET Framework)”项目模板来创建Windows服务。 配置服务控制事件&am…...
Java和Ts构造函数的区别
java中子类在使用有参构造创建对象的时候不必要必须调用父类有参构造 而js则必须用super()调用父类的有参构造,即使用不到也必须传递 Java 中的处理方式 可选择性参数: 在 Java 中,当子类使用父类的有参构造方法创建对象时,可以只传递需要的参数。如果父…...
植物健康,Spring Boot来助力
3系统分析 3.1可行性分析 通过对本植物健康系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本植物健康系统采用SSM框架,JAVA作为开发语言&#…...
百度文心一言接入流程-java版
百度文心一言接入流程-java版 一、准备工作二、API接口调用-java三、百度Prompt工程参考资料: 百度文心一言:https://yiyan.baidu.com/百度千帆大模型:https://qianfan.cloud.baidu.com/百度千帆大模型文档:https://cloud.baidu.com/doc/WENXINWORKSHOP/index.html千tokens…...
Java 11 新特性深度解析与应用实践
Java 作为一种广泛应用的编程语言,不断演进以满足开发者日益增长的需求和适应技术的发展趋势。Java 11 带来了一系列重要的新特性和改进,这些变化不仅提升了语言的性能和功能,还为开发者提供了更好的开发体验和工具。本文将深入探讨 Java 11 …...
druid 连接池监控报错 Sorry, you are not permitted to view this page.本地可以,发布正式出错
简介: druid 连接池监控报错 Sorry, you are not permitted to view this page. 使用Druid连接池的时候,遇到一个奇怪的问题,在本地(localhost)可以直接打开Druid连接池监控,在其他机器上打开会报错&#…...
[RN与H5] 加载线上H5通信失败问题记录(启动本地H5服务OK)
RT: nextjs项目 在本地启动H5服务, 本地开发都OK 发布到线上后, 效果全无, 经排查发现, 写了基本配置的js脚本在挂载时机上的差异导致 根本原因是...
electron 打包
安装及配置 安装electron包以及electron-builder打包工具 # 安装 electron cnpm install --save-dev electron # 安装打包工具 cnpm install electron-builder -D 参考的package.json文件 其中description和author为必填项目 {"name": "appfile",&qu…...
ChatGLM-6B和Prompt搭建专业领域知识问答机器人应用方案(含完整代码)
目录 ChatGLM-6B部署 领域知识数据准备 领域知识数据读取 知识相关性匹配 Prompt提示工程 领域知识问答 完整代码 本文基于ChatGLM-6B大模型和Pompt提示工程搭建医疗领域知识问答机器人为例。 ChatGLM-6B部署 首先需要部署好ChatGLM-6B,参考 ChatGLM-6B中英双…...
虚拟机配置静态IP地址(人狠话不多简单粗暴)
1.先找到以下位置: 2. 虚拟机中执行vi /etc/sysconfig/network-scripts/ifcfg-ens33 根据上图信息修改配置文件内容: 静态IP地址设置不超过255就行,我这里弄得100,没毛病。 3.修改并保存文件后,重启网络执行&#…...
Android token JJWT
在Android开发领域,JJWT(Java JWT,即Java Json Web Token)库是一个流行的工具,用于处理JSON Web Tokens(JWTs)。JWT是一种轻量级的、自包含的、基于JSON的用于双方之间安全传输信息的简洁的、UR…...
动态规划<一>初识动态规划
目录 认识动态规划 LeetCodeOJ练习 斐波那契数列模型 认识动态规划 1.动态规划是一种用于解决优化问题的算法策略。 2.它的核心原理是把一个复杂的问题分解为一系列相互关联的子问题。通过先求解子问题,并且记录这些子问题的解(通常用一个表格之类的…...
【AIGC】ChatGPT提示词Prompt精确控制指南:Scott Guthrie的建议详解与普通用户实践解析
博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯斯科特古斯里(Scott Guthrie)的建议解读人机交互设计的重要性减轻用户认知负担提高Prompt的易用性结论 💯普通用户视角的分析普通用户…...
2024年10月24日随笔
1024程序员节啊,现在已经是晚上的十点半了,我还在实验室里没走,刚把力扣的每日一题写完,好忙啊,好忙啊,好忙啊,为什么都大三了我还不能做自己的事情,今天老师开会说要给互联网加大赛…...
怎么做系统性能优化
对于软件或系统的性能优化,可以采取多种措施来提高效率和响应速度。这里为您列举一些常见的方法: 1. 代码优化:检查并优化算法复杂度,减少不必要的计算。使用更高效的数据结构和算法。 2. 数据库优化: •索引优化&…...
负载均衡:四层与七层
负载均衡建立在现在网络基础之上,提供一种廉价透明有效的方式扩展网络设备和服务器带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡可分为七层负载与四层负载。 四层负载(目标地址与端口交换) 主要通过报文中…...
【Ubuntu】服务器系统重装SSHxrdpcuda
本文作者: slience_me Ubuntu系统重装操作合集 文章目录 Ubuntu系统重装操作合集1.1 系统安装:1.2 安装openssh-server更新系统包安装OpenSSH服务器检查SSH服务的状态配置防火墙以允许SSH测试SSH连接配置SSH(可选) 1.3 安装远程连…...
ChatGPT的模型训练入门级使用教程
ChatGPT 是由 OpenAI 开发的一种自然语言生成模型,基于 Transformer 架构的深度学习技术,能够流畅地进行对话并生成有意义的文本内容。它被广泛应用于聊天机器人、客户服务、内容创作、编程助手等多个领域。很多人对如何训练一个类似 ChatGPT 的语言模型…...
【OS】2.1.2 进程的状态与转换_进程的组织
✨ Blog’s 主页: 白乐天_ξ( ✿>◡❛) 🌈 个人Motto:他强任他强,清风拂山冈! 🔥 所属专栏:C深入学习笔记 💫 欢迎来到我的学习笔记! 一、进程的状态 1.1.创建态 ……的…...
和为 n 的完全平方数的最少数量
给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。 示…...
wordpress操作/发帖推广哪个平台好
撰文:Offchain Labs编辑:南风编者按:L2 网络 Arbitrum One 自今年 9 月 1 日正式上线以来,因其提供廉价和快速的用户体验而迅速获得了巨大的吸引力。截至发文时,Arbitrum One 网络中的 TVL (总锁仓价值) 已经超过了 22…...
seo如何提高网站排名/营销效果分析怎么写
购买产品链接请点击“阅读原文”https://yao.jk.cn/index.html#/yao-item/263856/0?channelCodeduojin&promoCodeMERCENARY5279360301...
网站制作应该选什么/如何在百度上做广告
v-model v-bind v-on v-if v-for v-html v-pre v-text v-show...
wordpress菜单显示在哪里/网址百度刷排名
苹果设备我参考其他的资料,大多大神写的东西只讲一些概念,必要的判断都没有写,必须iphonex的底部适配的高度是34,所以我对之前的设备适配只做了iphoneX。但是现在新出的设备xs和xr都需要底部适配,所以设备的判断就需要…...
河源和平县建设局网站/免费企业网站建设流程
在控制台转到目录D:\Program Files\DevExpress 2010.2\Components\Tools下,执行下面的命令:ToolboxCreator.exe /ini:toolboxcreator.ini 如果要删除:ToolboxCreator.exe /ini:toolboxcreator.ini /remove 我的操作:1.打开D:\Prog…...
工程施工行业在哪个网站容易找事做/搜索词分析工具
设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行&…...