贪心法_多机调度问题

stm32教程之三重ADC交错采样 ps:本文基于stm32F407ZGT6单片机 stm32F4单片机单通道采集的最大采样率为2.4M,所以有时会难以满足较高频率的采样,于是查阅芯片手册,发现stm32F4支持多重ADC采集,利用每个通道的转换时间,错位采样,从而提高采样率,最大把采样率开到2.4*3=7.2M. (去年初学ADC时研究的,基于cube和HAL库的三重ADC交错采样参考资料不多,我也是研究了一段时间,写下这篇博客希望可以帮助到更多人。) 示意图如下: 以下是官方例子的说明, In this ex... 阅读详情

设有 n 个独立的作业 { 1 , 2 , .. , n },由 m 台相同的机器进行加工处理。
作业 i 所需的处理时间为 ti。现约定,任何作业可以在任何一台机器上加工处理,
但未完工前不允许中断处理。任何作业不能拆分成更小的作业。
多机调度问题要求给出一种作业调度方案,使所给的 n 个作业在尽可能短的时间内
由 m 台机器加工处理完成。

分析:
这个问题是一个NP完全问题,到目前为止还没有一个有效的解法。
对于这一类问题,用贪心选择策略有时可以设计出较好的近似算法。
采用最长处理时间作业优先的贪心选择策略可以设计出解多机调度问题的较好的近似算法。

按此策略,
当 n <= m 时,只要将机器 i 的[0,ti]时间区间分配给作业i即可。

当 n > m 时,首先将 n 个作业依其所需的处理时间从大到小排序。
 然后依此顺序将作业分配给空闲的处理机。

<<<< 简单一句话,让最空闲的机器做最繁重的任务 >>>>

// 以上问题与分析来自
// 《计算机算法设计与分析(第2版)》
// 电子工业出版社
// 以下程序为 zerodspace 源创

////////////////////////////////////////////////////////////////////////////////
// 程序员: http://blog.youkuaiyun.com/zerodspace
// 时间: 20:46 2005-10-22
// 功能: 贪心法——多机调度问题
// 系统: VC++.NET Win32控制台项目
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// machineWork.h
//
#pragma once

#define maxWork 100
#define maxMachine 100

class machineWork
{
public:
 machineWork(void);
 ~machineWork(void);

 void SetMachine( int machine );
 void SetWorks( double times[] , int works );
 bool Arrange();
 void Sort( int timeId[] );
 void Print();
private:
 //double times[maxWork];
 double timesUnsorted[maxWork];
 int graph[maxMachine][maxWork];
 double machinesTime[maxMachine];
 int machines;
 int works;
};

////////////////////////////////////////////////////////////////////////////////
// machineWork.cpp
//
#include "StdAfx.h"
#include "./machinework.h"

machineWork::machineWork(void)
{
}

machineWork::~machineWork(void)
{
}
//
//
void machineWork::Sort( int timeId[] )
{
 for( int i = 0 ; i < works ; i++ )
  timeId[i] = i;
 for( int i = 0 ; i < works - 1 ; i++ )
 {
  double min = timesUnsorted[ timeId[i] ];
  int p = i;
  for( int j = i + 1 ; j < works ; j++ )
  {
   if( this->timesUnsorted[ timeId[j] ] > min )
   {
    min = this->timesUnsorted[ timeId[j] ];
    p = j;
   }
  }
  int t = timeId[i];
  timeId[i] = timeId[p];
  timeId[p] = t;
 }
}
//
//
void machineWork::SetMachine( int machines )
{
 this->machines = machines;
}
//
//
void machineWork::SetWorks( double times[] , int works )
{
 this->works = works;
 for( int i = 0 ; i < works ; i++ )
  timesUnsorted[i] = times[i];
}
//
//
bool machineWork::Arrange()
{
 int timeId[maxWork];
 Sort( timeId );
 //某一工作安排后,对机器的工作时间进行排序
 //index[i]保存机器编号
 int index[maxMachine];
 //graph[i][0]表示机器i中已经安排了几项任务
 for( int i = 0 ; i < machines ; i++ )
  graph[i][0] = 0;
 //机器已经安排的工作时间
 for( int i = 0 ; i < works ; i++ )
  machinesTime[ i ] = 0.0;
 //index[0]所指向的 graph[ index[0] ][0] 的值是最小的
 for( int i = 0 ; i < machines ; i++ )
  index[i] = i;
 //给 i 号作业分配机器
 for( int i = 0 ; i < works ; i++ )
 {
  //把作业分配给 index[0] 所指向的机器
  graph[ index[0] ][0]++;
  graph[ index[0] ][ graph[index[0]][0] ] = timeId[i];
  machinesTime[ index[0] ] += timesUnsorted[ timeId[i] ];
  //对机器的已经安排的工作时间进行排序
  int j = 0;
  while( j < machines - 1 && machinesTime[ index[ j ] ] > machinesTime[ index[ j+1 ] ] )
  {
   int t = index[j];
   index[j] = index[j+1];
   index[j+1] = t;
   j++;
  }
 }
 return true;
}
//
//
void machineWork::Print()
{
 printf( "----------------------------------------/n" );
 for( int i = 0 ; i < works ; i++ )
  printf( "工作 %d 所需要的时间 %5.f/n" , i , timesUnsorted[i] );
 printf( "/n" );


 for( int i = 0 ; i < machines && i < works ; i++ )
 {
  printf( "机器 %d 工作总时间 %.f = " , i , machinesTime[i] );
  printf( "%.f " , timesUnsorted[ graph[i][1] ] );
  for( int j = 2 ; j <= graph[i][0] ; j++ )
   printf( "+ %.f " , timesUnsorted[ graph[i][j] ] );
  printf( "/n" );
 }
 printf( "/n" );


 for( int i = 0 ; i < machines ; i++ )
 {
  printf( "机器 %d 上的工作安排 " , i );
  for( int j = 1 ; j <= graph[i][0] ; j++ )
   printf( "%d " , graph[i][j] );
  printf( "/n" );
 }
 printf( "----------------------------------------/n" );
}
//
//


////////////////////////////////////////////////////////////////////////////////
// greedy.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "machineWork.h"
#include "conio.h"

int _tmain(int argc, _TCHAR* argv[])
{
 double t[maxWork] = { 2 , 14 , 4 , 16 , 6 , 5 , 3 };
 machineWork w;
 w.SetMachine( 10 );
 w.SetWorks( t , 7 );
 w.Arrange();

 w.Print();

 getch();
 return 0;
}

////////////////////////////////////////////////////////////////////////////////
// 新建项目 win32控制台项目 greedy
// 添加 一般C++类 machineWork
// 写代码

Arcgis加载在线地图(内涵各种在线地图) 这三个在线地图是最常用的在线地图,其他几个类型的在线地图请自行查看。,加载出在线图层说明连接成功,点击。1、首先打开Arcgis,找到。 阅读详情

相关推荐

RTL优化与PPA分析:数字电路设计的关键技术

在数字集成电路设计中,RTL(寄存器传输级)优化是提升芯片性能、降低功耗和减小面积的核心技术。通过PPA(Power-Performance-Area)指标的平衡,工程师可以在不同时序约束下实现设计的最优化。本文基于Synopsys Design Compiler和开源工具Yosys的实验数据,展示了RTL优化在算术单元和控制逻辑中的显著效果,特别是在乘法器和除法器等复杂运算模块中。文章还探讨了AI辅助工具在RTL优化中的应用潜力,为数字电路设计提供了实用的技术参考和工程实践建议。

weixin_42186387的博客 619

python 数据结构与算法——贪心算法

区间调度

颹蕭蕭 1980

开源 AHB不对称半桥反激电路设计(六)死区时间,谐振腔电流,谐振电感函数表达式

电流跌落可以使副边电流峰值和有效值降低,减小损耗,但如果开关管 S2 导通期间,谐振电流谐等于励磁电流,即副边电流A 点降至 0,会在原边变压器内形成环流,产生损耗,同时也不利于副边同步整流管驱动的正常工作,为了保证开关管 S2 导通期。在开关管 S1 和开关管 S2 均关断的死区时间内,谐振电流给原边开关管结电容和副边整流管结电容充放电,因此会引起开关 S1 关断瞬间电流跌落与开关 S2 关断瞬间电流震荡现象,受寄生参数影响原边谐振电流波形和副边电流波形如图。降到最低,变压器以最高效率向副边传递能量。

【Simon】的博客 1228

贪心算法解决多机调度问题

首先,按照作业完成时间将作业从大到小排序,为{16,14,6,5,4,3,2}然后分别将16,14,6安排在M1,M2,M3三台机器上,然后进行比较。贪心算法只考虑眼前利益,不通盘考虑问题的所有可能,每一步做出当时看起来最佳的选择(局部最优选择)利用贪心算法求解的问题往往具有两个重要的特性,贪心选择性质和最优子结构性质。作业项数为你n,机器数为m。最优子结构,当一个问题的最优解包含其子问题的最优解释,称此问题具有最优子结构性质问题的最优子结构性质,是该问题是否可用贪心算法求解的关键。

weixin_62434171的博客 5557

ROS教程(四):RVIZ使用教程(详细图文)

前言 根据前面的教程已经学会了创建功能包,那么本篇文章主要内容则是通过节点来发布数据至RVIZ

Leslie的博客 17万+

别再手动切换了!用SP3485+三极管搞定RS485自动收发电路(附完整原理图)

本文详细介绍了如何利用SP3485芯片和三极管设计RS485自动收发电路,解决传统手动切换带来的IO资源占用和软件复杂度问题。通过原理分析、电路设计拆解和实战注意事项,帮助工程师打造稳定可靠的自动收发通信模块,显著提升系统性能和可靠性。

weixin_26833939的博客 512

多机调度问题

多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。。

weixin_70337339的博客 1024

数据分析(二):学生成绩预测分析报告

表1 特征变量描述变量描述school学生的学校sex学生的性别age学生的年龄address学生的家庭住址类型famsize家庭规模Pstatus父母同居状况Medu母亲的教育Fedu父亲的教育Mjob母亲的工作Fjob父亲的工作reason选择学校的理由guardian学生监护人traveltime从家到学校的时间studytime每周学习时间failures过去的类失败次数schoolsup额外的教育支持famsup家庭教育支持。

m0_73963149的博客 4414

贪心算法-详解

贪心:每一个阶段都选择局部最优,从而达到全局最优。即总是选择当前看来最好的选择。 又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。 贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。 贪心算法与动态规划的不同在于它对每个子问题的解决方案都做出选择,不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回

记忆的永恒的博客 648

分布式系统中的“无状态”和“有状态”详解

有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如 tomcat 中的 session。例如登录:用户登录后,我们把登录者的信息保存在服务端 session 中,并且给用户一个 cookie 值,记录对应的 session。然后下次请求,用户携带 cookie 值来,我们就能识别到对应 session,从而找到用户的信息。

AI天才研究院 2万+

SAP MM ME21N保存前检查增强

想在ME21N保存前做一些数据检查, 可以做一个增强功能,  运行 CMOD 新增,   增强接口 输入 MM06E005  (  EXIT_SAPMM06E_012 ) ,在 NCLUDE ZXM06U43 .  里写代码功能。  例子如下: *&---------------------------------------------------------------------*

heng0757的专栏 1万+

多机调度问题【贪心算法】

多机调度问题 设有n个独立的作业,由m台相同的机器进行加工处理。作业i所需的处理时间为t[i]。 任何作业可以在任何一台机器上面加工处理,但未完工之前不允许中断处理。任何作业不能拆分成更小的作业。 要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。 思路: 贪心求解多机调度问题的贪心策略是最长处理时间作业优先,即把处理时间最长的作业分配给最先空闲的机器,这样可以保证处理时间长的作业优先处理,从而在整体上获得尽可能短的处理时间。按照最长处理时间作业优先的贪心策略,当m&

qq_45865242的博客 7635

DeerFlow 系列教程 第四篇 | Sandbox 沙箱与 Sub-agent 子智能体协作详解

DeerFlow 系列教程第四篇介绍了两个关键子系统:Sandbox 沙箱系统和Sub-agent子智能体协作机制。沙箱系统通过虚拟路径映射、权限白名单、命令审计和容器隔离四重机制,为Agent提供安全的代码执行环境,使其能在隔离环境中执行文件操作和脚本运行。系统采用分层架构设计,包含应用层、工具层、审计层等,核心是定义标准交互接口的抽象基类。虚拟路径系统将Agent操作的虚拟路径映射到实际路径,确保安全性。这些功能使DeerFlow从对话助手进化为能处理复杂任务的Super Agent平台。

weixin_43674738的博客 284

【贪心法】多机调度问题

问题描述   设有n个独立的作业{1, 2, …, n},由m台相同的机器{M1, M2, …, Mm}进行加工处理,作业i所需的处理时间为ti(1≤i≤n),每个作业均可在任何一台机器上加工处理,但不可间断、拆分。多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。   设7个独立作业{1, 2, 3, 4, 5...

欢迎来到关关雎鸠儿的博客 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

贪心法求解多机调度问题

问题描述 设有n个独立的作业{1,2,…,n},由m台相同的机器{1,2, …,m}进行加工处理,作业i所需的处理时间为ti(1≤i≤n),每个作业均可在任何一台机器上加工处理,但未完工前不允许中断,任何作业也不能拆分成更小的子作业。 多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。 问题求解 贪心法求解多机调度问题的贪心策略是最长处理时间作业优先,...

LixDemon的博客 3279

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【数据结构和算法设计】算法篇(7) 贪心法 多机调度、最优装载问题

7.8 求解最优装载问题 【问题描述】有 nnn 个集装箱要装上一艘载重量为 WWW 的轮船,其中集装箱 i (1≤i≤n)i\ (1\le i \le n)i (1≤i≤n) 的重量为 wiw_iwi​ 。不考虑集装箱的体积限制,现要选出尽可能多的集装箱装上轮船,使它们的重量之和不超过 WWW 。 【问题求解】5.3.1小节讨论了简单装载问题,采用回溯法选出尽可能少的集装箱个数。这里的最优解是选出尽可能多的集装箱个数,并采用贪心法求解。当重量限制为 WWW 时,wiw_iwi​ 越小、

memcpy0的博客 2091

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

贪心法之多机调度问题

多机调度问题的贪心算法解决方案 本文介绍了使用贪心算法解决多机调度问题的方法。该问题要求将n个作业分配给m台机器,使得最大完成时间最小。文章提出采用最长处理时间优先(LPT)的贪心策略,即先将作业按处理时间降序排序,再将每个作业分配给当前最空闲的机器。这种策略能有效平衡各机器的工作负载。 文中提供了C++、Python和Java三种语言的实现代码,均包含以下关键步骤: 输入作业和机器信息 按作业处理时间降序排序 贪心分配作业到最空闲机器 输出调度结果 该算法的时间复杂度主要取决于排序步骤,使用冒泡排序时为O

2301_80785839的博客 480

多机调度问题避坑指南:贪心法常见误区与优化技巧

本文深入剖析了使用贪心法解决多机调度问题的常见误区与优化技巧。针对PTA等场景,重点解析了为何长作业优先(LPT)策略优于短作业优先,并提供了基于最小堆的高效实现方案。文章还探讨了应对离群值、初始分配优化等进阶技巧,帮助开发者提升算法效率与代码鲁棒性,避免陷入性能陷阱。

bush的博客 85

贪心法——多机调度问题

贪心法——多机调度问题 问题: 设有n个独立的作业{1, 2, … , n},由m台相同的机器进行加工处理,作业i的处理时间为ti,任何作业不可以拆分为更小作业,且作业未完工前不允许中断处理。 多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。 分析: 这个问题是NP完全问题,到目前为止还没有有效的解法。对于这一类问题,用贪心选择策略有时可以设计出较好的近似算法——贪心得不到最优解的情形,但是可以得到近似最优解(即一种较优的解)。 采用可以设计出解多机调度问题的

qq_43513855的博客 937

贪心法求解多机调度问题c++

#include<iostream> using namespace std; int t[7][2] = { 2,1,14,2,4,3,16,4,6,5,5,6,3,7 }, d[3] = {0,0,0}; void MultiMachine(int t[7][2], int n, int d[3], int m) { int S[3][7]; int rear[3]; int i, j, k; for (i = 0; i < m; i++) { S[i][0] = t[i

无名小卒的博客 1647

pta实战:贪心法在多机调度问题中的高效应用

本文深入探讨了贪心法在解决多机调度问题中的高效应用,重点解析了最长处理时间优先(LPT)贪心算法的核心原理与实现。通过PTA实战案例,详细展示了如何利用排序和优先队列(堆)数据结构,将任务分配给当前最闲的机器,以实现负载均衡和最小化总完成时间。该策略以其接近最优解的性能和O(n log n)的高效时间复杂度,成为工程实践中的首选方案。

yolo5detector的博客 394

贪心法-多机调度问题

问题: 设有n个独立的作业{1, 2, …, n}, 由m台相同的机器进行加工处理. 作业i所需时间为t i. 约定:任何作业可以在任何一台机器上加工处理, 但未完工前不允许中断处理,任何作业不能拆分成更小的子作业。要求给出一种作业调度方案,使所给的n 个作业在尽可能短的时间内由m台机器加工处理完成。 贪心策略: 最长处理时间作业优先,即把处理时间最长的作业分配给最先空闲的机器。 贪心法: 贪心法是在已知信息下做出局部最优解,且做出贪心选择后不会再改变选择,贪心法的核心是贪心策略的选择。 贪心法的一般过程:

weixin_47487155的博客 1184

多机调度问题(贪心法)

题目:  设有n个独立的作业{1, 2, …, n},由m台相同的机器{M1, M2, …, Mm}进行加工处理,作业i所需的处理时间为ti(1≤i≤n),每个作业均可在任何一台机器上加工处理,但不可间断、拆分。多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。     伪代码为: 将数组t[n]由大到小排序,对应的作业序号存储在数组p[n]中;

化甘 4536

【算法】多机调度问题(贪心法)

#include<iostream> using namespace std; int S[3][7]; // 假设3台机器处理7个作业 void MultiMachine(int t[],int d[],int p[],int n,int m) { int rear[3]; // S[i]为存储机器i处理作业的队列,rear[i]为队尾下标 int i,j,k; // 安排前m个作业 for(i=0;i<m;i++){ S[i][0] = i+1; rear[.

C_xixixixi的博客 631

算法设计与分析实验三:贪心法实现TSP问题和多机调度问题

【实验目的】 1、掌握贪心算法求解问题的一般特征和步骤; 2、使用贪心算法编程,求解TSP问题和多机调度问题。 TSP问题 一、实验内容: 采用最近邻点策略:从任意城市出发每次在没有到过的城市中选择最近的一个,直到经过了所有的城市,最后回到出发城市。 如图为最近邻点贪心策略求解TSP问题的过程。 设图G中n个顶点的编号为{1,2,……,n},cij表示顶点i到顶点j的代价(1<=i,j<=n),集合V存储图的顶点,集合P存储经过的边,从顶点w出发采用最近邻点策略求解TSP问题的算法如下: 二

努力学习的小菜同学 2445

[pta]5-3求解多机调度问题(贪心法)

设有n个独立的作业{1,2,…,n},由m台相同的机器{1,2, …,m}进行加工处理,作业i所需的处理时间为ti(1≤i≤n),每个作业均可在任何一台机器上加工处理,但未完工前不允许中断,任何作业也不能拆分成更小的子作业。多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。

wzj05467的博客 1753
上一篇: 应用题_将一数字分解连续整数和
下一篇: 登录、注册中校验码的简单实现
zeroDspace
博客等级 码龄21年 21粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值