【坑】different compare function (priority, vector,...)

本文介绍了使用C++实现优先队列和自定义比较函数的方法,通过实例展示了如何基于距离中心点的距离对点进行排序。此外,还提供了一种利用sort函数结合自定义比较器实现相同功能的方案。

priority_queue<Point, vector<Point>, pqCmp>

struct pqCmp {

  bool operator() (const Point& a, const Point& b) const {

    return distance(a,center) < distance(b, center);

  }

};

 

vector<Point> v;

sort(v.begin(), v.end(), cmp);

static bool cmp(const Point& a, const Point& b) {

  return distance(a, center) < distance(b, center);

}

 

转载于:https://www.cnblogs.com/grainy/p/7242798.html

基于NSGA-III算法求解微电网多目标优化调度研究(Matlab代码实现)内容概要:本文围绕基于NSGA-III算法的微电网多目标优化调度展开研究,重点介绍了如何利用该先进多目标进化算法解决微电网系统中多个相互冲突的目标(如运行成本最小化、碳排放最低、供电可靠性最高等)的协同优化问题。文中结合Matlab代码实现,详细阐述了NSGA-III算法的基本原理、在微电网调度模型中的建模过程、约束条件处理、目标函数设计以及仿真结果分析,展示了其相较于传统优化方法在求解高维、非线性、多目标问题上的优越性。同时,文档还提供了丰富的相关研究案例和技术支持背景,涵盖电力系统优化、智能算法应用及Matlab仿真等多个方面。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事能源优化领域的工程技术人员;尤其适合正在进行微电网调度、多目标优化算法研究或撰写相关论文的研究者。; 使用场景及目标:①掌握NSGA-III算法的核心思想及其在复杂能源系统优化中的应用方式;②学习如何构建微电网多目标调度模型并利用Matlab进行仿真求解;③为科研项目、毕业论文或实际工程提供算法实现参考和技术支撑。; 阅读建议:建议读者结合文中提供的Matlab代码实例,逐步调试运行并深入理解算法流程与模型构建细节,同时可参考文档中列出的其他优化案例进行横向对比学习,以提升综合应用能力。
// 任务管理器类 class ParallelTaskManager { public: ParallelTaskManager() : progress(0), stopFlag(false) {} // 注册成员函数任务 template <typename Class, typename Func> void addTask(Class* obj, Func func) { std::lock_guard<std::mutex> lock(tasksMutex); // 封装成员函数为可调用对象 tasks.emplace_back([this, obj, func] { this->executeWrapper(obj, func); }); } // 执行所有任务 void executeAll() { std::vector<std::thread> workers; // 启动任务线程 for (auto& task : tasks) { workers.emplace_back([this, &task] { task(); // 执行封装的成员函数 }); } // 等待任务线程完成 for (auto& t : workers) { t.join(); } } // 获取最终状态 int getFinalState() const { return progress.load(); } private: // 成员函数执行包装器 template <typename Class, typename Func> void executeWrapper(Class* obj, Func func) { try { // 调用成员函数 (obj->*func)(stopFlag); // 检查是否被其他任务终止 if (stopFlag.load()) return; // 成功完成,更新进度 { std::lock_guard<std::mutex> lock(progressMutex); progress.fetch_add(1); } cv.notify_one(); } catch (...) { // 任务失败处理 setFailedState(); } } // 设置失败状态 void setFailedState() { // 使用CAS确保只有一个任务设置失败状态 int expected = progress.load(); while (expected >= 0 && !progress.compare_exchange_weak(expected, -1)) {} // 设置全局终止标志 stopFlag.store(true); cv.notify_all(); } public: // 进度监控函数 void progressMonitor() { std::unique_lockstd::mutex lock(progressMutex); int lastProgress = progress; while (true) { // 等待状态变化或终止信号 cv.wait(lock, [this, &lastProgress] { return progress != lastProgress || progress == -1 || progress == tasks.size() || stopFlag; }); int current = progress.load(); // 更新进度显示(实际项目中替换为UI更新) if (current == -1) { std::cout << "[错误] 任务执行失败!" << std::endl; break; } else if (current == tasks.size()) { std::cout << "[成功] 所有任务完成!" << std::endl; break; } else { lastProgress = progress; std::cout << "进度更新: " << current << "/" << tasks.size() << std::endl; } // 检查终止条件 if (stopFlag.load() || progress == -1 || progress == tasks.size()) { break; } } } private: // 任务列表(封装成员函数的lambda) std::vector<std::function<void()>> tasks; std::mutex tasksMutex; // 进度状态 std::atomic<int> progress; std::mutex progressMutex; std::condition_variable cv; // 终止标志 std::atomic<bool> stopFlag; public: std::thread monitor; }; // ============= 示例任务类 ============= class DataProcessor { public: void process(std::atomic& stopFlag) { std::random_device rd; std::mt19937 gen(rd()); for (int i = 0; i < 8; ++i) { if (stopFlag.load()) return; // 检查终止 // 模拟数据处理 std::this_thread::sleep_for(std::chrono::milliseconds(1000)); // 模拟15%失败率 if (gen() % 100 < 15) { throw std::runtime_error("数据处理错误"); } } } }; class NetworkService { public: void fetchData(std::atomic& stopFlag) { std::random_device rd; std::mt19937 gen(rd()); for (int i = 0; i < 5; ++i) { if (stopFlag.load()) return; // 模拟网络请求 std::this_thread::sleep_for(std::chrono::milliseconds(1500)); // 模拟网络错误 if (gen() % 100 < 1) { throw std::runtime_error("网络连接失败"); } } } }; class FileSystem { public: void loadFiles(std::atomic& stopFlag) { std::random_device rd; std::mt19937 gen(rd()); for (int i = 0; i < 10; ++i) { if (stopFlag.load()) return; // 模拟文件加载 std::this_thread::sleep_for(std::chrono::milliseconds(80)); } } }; int main() { // 创建任务类的实例 DataProcessor processor; NetworkService network; FileSystem fileSys; // 创建任务管理器 ParallelTaskManager manager; // 启动监控线程 manager.monitor = std::thread(&ParallelTaskManager::progressMonitor,&manager); // 注册不同类的成员函数作为任务 manager.addTask(&processor, &DataProcessor::process); manager.addTask(&network, &NetworkService::fetchData); manager.addTask(&fileSys, &FileSystem::loadFiles); std::cout << "开始执行并行任务..." << std::endl; manager.executeAll(); // 获取最终状态 int result = manager.getFinalState(); if (result == -1) { std::cout << "最终状态: 任务失败" << std::endl; } else { std::cout << "最终状态: " << result << "/3 任务成功" << std::endl; } // 通知监控线程退出 manager.monitor.join(); return 0; } 为什么cv.notify_one();时进不去监控线程?
10-11
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值