决策树方法根据指定条件筛选方案
代码功能说明
-
条件类:
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.修改并保存文件后,重启网络执行&#…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
