算法设计与分析——分支限界法——装载问题

《C系列-实例相关》C语言实例二 通过学习和设计银行家算法,了解银行家算法避免死锁的处理原理。死锁问题的出现容易导致进程进入不安全状态,银行家算法的使用,当进程请求一组资源的时候,系统必须确认是否具有足够的资源,以及给他分配资源后,自身进程是否 会陷入不安全状态。通过键盘输入进程的数目、资源种类数目、各类资源提供的最大限度、个进程和各类资源已有库存、个进程和各类资源的总需求量。1.对于第i层的结点e,已装载的集装箱的总重量为e.w,剩余集装箱重量为r, 定义结点e的上届函数为e.w+r.其中,n=5,W=10,w={5,2,6,4,3} 阅读详情

有一批共个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集装箱i的重量为Wi,且装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船。如果有,找出一种装载方案。

容易证明:如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。
(1)首先将第一艘轮船尽可能装满;
(2)将剩余的集装箱装上第二艘轮船。
思想:
在算法的循环体中,首先检测当前扩展结点的左儿子结点是否为可行结点。如果是则将其加入到活结点队列中。然后将其右儿子结点加入到活结点队列中(右儿子结点一定是可行结点)。2个儿子结点都产生后,当前扩展结点被舍弃。

活结点队列中的队首元素被取出作为当前扩展结点,由于队列中每一层结点之后都有一个尾部标记-1,故在取队首元素时,活结点队列一定不空。当取出的元素是-1时,再判断当前队列是否为空。如果队列非空,则将尾部标记-1加入活结点队列,算法开始处理下一层的活结点。

节点的左子树表示将此集装箱装上船,右子树表示不将此集装箱装上船。设bestw是当前最优解;ew是当前扩展结点所相应的重量;r是剩余集装箱的重量。则当ew+r<bestw时,可将其右子树剪去,因为此时若要船装最多集装箱,就应该把此箱装上船。另外,为了确保右子树成功剪枝,应该在算法每一次进入左子树的时候更新bestw的值。

为了在算法结束后能方便地构造出与最优值相应的最优解,算法必须存储相应子集树中从活结点到根结点的路径。为此目的,可在每个结点处设置指向其父结点的指针,并设置左、右儿子标志。

 找到最优值后,可以根据parent回溯到根节点,找到最优解。

优先队列写法:

#include<iostream>
#include<queue>//优先队列的头文件
using namespace std;
//子集树中节点的定义
class bbnode{ 
	public:
		bbnode *parent;//指向父节点的指针 
		bool Lchild;//是否是左孩子结点的标记 
};
//优先队列中节点的定义 
class  HeapNode{
	public:
	bbnode *ptr;  //指向活结点在子集树中相应节点的指针
	int uweight;  //活结点的优先级(上界) 
	//优先级的定义:从根节点到节点x的路径相应的载重量加上剩余集装箱的重量之和
	int level;   //活结点在子集树中所处的层次 
}; 
struct compare{
	bool const operator()(HeapNode *&a,HeapNode *&b){
		return (a->uweight) < (b->uweight);//最大堆 
		
	}
};
//该函数是将新产生的活结点加入到子集树中,并将这个节点插入到表示活结点优先队列的最大堆中 
void AddLiveNode(priority_queue<HeapNode*,vector<HeapNode*>,compare> &Q,bbnode *parent,bool isLeft,int uWeight,int level)
{
	//先在子集树中建立这个节点
	bbnode *b = new bbnode;
	b->parent = parent;
	b->Lchild = isLeft;
	
	//再在优先队列中新建一个节点
	HeapNode *h = new HeapNode;
	h->ptr = b;//将刚在添加到子集树中的新节点b再赋值给将要添加到优先队列中的节点h 
	h->uweight = uWeight;
	h->level = level; 
	//将新建的节点添加到优先队列
	Q.push(h); 
	 	 
}

int MaxLoading(int *weight,int n,int *bestx,int c)
{
	priority_queue<HeapNode*,vector<HeapNode*>,compare> Heap;
	int i=0;// 表示当前所在子集树的层次
	int now_weight=0;//表示当前已装载的重量
	int node_priority=0; //优先级————装载的最大上界=当前装载量+剩余集装箱的重量
	
	HeapNode *H;//用于保存从优先队列出来的节点 
	bbnode *B;//子集树上的扩展节点
	int *remains; //剩余集装箱 , 记载未装的货物
	remains = new int[n];
	remains[n-1]=0;//当到达最后的叶子节点时,没有剩余的货物 
	for(int j=n-2;j>=0;j--){	//计算当到达指定层时的剩余数组 
		remains[j]=remains[j+1]+weight[j+1];
	}
	 
	 while(i!=n)//没有到达叶子节点时 ,到达第i层 
	 {
	 	if(now_weight+weight[i]<=c)//即当前的重量能够装的下  =进入左子树 左孩子 
		 {
		 	node_priority=(now_weight+weight[i]) +remains[i];//优先级 =当前装载量+剩余集装箱的重量
		 	AddLiveNode(Heap,B,true,node_priority,i+1);
		 	
		 }
		// 进入右子树  右孩子 
		  
		  	node_priority=(now_weight) +remains[i];//优先级 =当前装载量+剩余集装箱的重量
		 	AddLiveNode(Heap,B,false,node_priority,i+1);
		  
		  
		H = Heap.top();		//查询优先队列队头结点 
		Heap.pop();		//队头结点出队 
		i=H->level;
		B=H->ptr;	//记录当前到达的结点 
		now_weight=H->uweight - remains[i-1];		//计算当前已经装载量  
	  }
	  
	  
	 	// 记录已装载货物 
	for(int j=n-1;j>=0;j--){
		bestx[j]=B->Lchild? 1:0;
		B=B->parent;
	}
	return now_weight; 		//返回最优装载量  
 } 
int main()
{
	int n;			//货物数  
	int shipNum;			//货船数量 
	int bestw;  			//最优装载量 
	
	int weight[n];			//货物总重量 
	int bestx[n];			//最优的装载序列 
	int c1=0;				//第一艘船的装载重量 
	int c2=0;				//第二艘船的装载重量 
	cout<<"请输入货物数:";
	cin>>n;
	cout<<"请输入货船的数量:";
	cin>>shipNum;
	cout<<"请输入货物的重量序列:";
	for(int i=0;i<n;i++)
	{
		cin>>weight[i];
	 }
	 cout<<"请输入两艘船的载重量:";
	 cin>>c1>>c2;
	 int maxc=0;//船的最大装载重量 
	 int sumc=c1+c2;//船的装载重和 
	 
	 if(c1>c2)
	 	maxc=c1;
	else 
		maxc=c2;
		 
	int maxweight=0;//货物中的最大重量
	int sumweight=0;				//货船总重量 
	for(int i=0;i<n;i++)
	{
		if(weight[i]>maxweight)
		{
			maxweight=weight[i];
		}
		sumweight+=weight[i];
	 }
	 
	 if(maxweight>maxc)
	 {
		printf("货物重量超过货船的载重量,无法装载!");
		return 0;
	  } 
	  
	  if(sumweight>sumc){
		printf("货物总重量超过货船的总载重量,无法装载!");
		return 0;
	}
	MaxLoading(weight,n,bestx,c1);
	cout<<"装载序列为:"; 
	for(int i=0;i<n;i++)
	{
		cout<<bestx[i]<<" ";
	 }
	cout<<endl;
	cout<<"第1艘船的最优装载量为:"<<MaxLoading(weight,n,bestx,c1)<<endl;
	
	 
	 cout<<"装载的货物为:";
	for(int i=0;i<n;i++)
	{
		if(bestx[i]!=0)
		cout<<weight[i]<<" ";
	}
	cout<<endl;
	cout<<"第2艘船的最优装载量为:"<<sumweight-MaxLoading(weight,n,bestx,c1)<<endl;
		 cout<<"装载的货物为:";
	for(int i=0;i<n;i++)
	{
		if(bestx[i]!=1)
		cout<<weight[i]<<" ";
	}
	
 } 

在这里插入图片描述
堆写法:

#include<iostream>
#include<queue>//优先队列的头文件
using namespace std;

class bbnode{ 
	public:
		bbnode *parent;//指向父节点的指针 
		bool Lchild;//是否是左孩子结点的标记 
};
//优先队列中节点的定义 
class  HeapNode{
	public:
	operator double() const{return uweight;}
	int operator <= (HeapNode hn) const{return uweight<=hn.uweight;	}
	int operator <	(HeapNode hn) const{return uweight<hn.uweight;	}
	int operator >= (HeapNode hn) const{return uweight>=hn.uweight;	}
	int operator >	(HeapNode hn) const{return uweight>hn.uweight;	}
	int operator == (HeapNode hn) const{return uweight==hn.uweight;	}
	HeapNode(){}
	bbnode *ptr;  //指向活结点在子集树中相应节点的指针
	int uweight;  //活结点的优先级(上界) 
	//优先级的定义:从根节点到节点x的路径相应的载重量加上剩余集装箱的重量之和
	int level;   //活结点在子集树中所处的层次 
}; 
class MaxHeap
{
public:
	MaxHeap(int n);    //构造函数,N表示堆中能存储的最大元素的个数 
	void Insert(HeapNode heapNode);  //向堆中插入一个结点 
	void DeleteMax(HeapNode &heapNode);  //删除堆中的最大结点 
private:
	int size;            
	HeapNode *MH;       
	
	void Delete(HeapNode &heapNode,int index);  //删除堆中标号为index的元素,index从1开始,即1表示最大元素 
	void SiftUp(int index);          //将堆中标号为index的元素,向上调整,保证堆结构 
	void SiftDown(int index);      //将堆中标号为index的元素,向下调整,保证堆结构 
};

MaxHeap::MaxHeap(int n)
{
	size=0;
	MH=new HeapNode[n];
}

void MaxHeap::SiftUp(int index)
{
	if(index<=1)
		return;
	bool done=false;
	do
	{
		if(MH[index]>MH[index/2])
		{
			HeapNode tmp=MH[index];
			MH[index]=MH[index/2];
			MH[index/2]=tmp;
		}
		else
			done=true;
		
		index=index/2;
	}while(index>1&&!done);
}

void MaxHeap::SiftDown(int index)
{
	if(2*index>size)
		return;
	bool done=false;
	do
	{
		index=2*index;
		if(index+1<=size&&MH[index+1]>MH[index])
			index=index+1;
		if(MH[index/2]<MH[index])
		{
			HeapNode tmp=MH[index];
			MH[index]=MH[index/2];
			MH[index/2]=tmp;
		}
		else
			done=true;
	}while(2*index<=size&&!done);
}

void MaxHeap::Insert(HeapNode heapNode)
{
	size+=1;
	MH[size]=heapNode;
	SiftUp(size);
}

void MaxHeap::Delete(HeapNode &heapNode,int index)
{
	if(index<1||index>size)
	{
		return;
	}
	HeapNode x=MH[index],y=MH[size];
	heapNode=MH[index];
	size-=1;
	if(index==size+1)
		return;
	MH[index]=y;//将原来堆中的最后一个放到要被删除的位置,再继续调整堆 
	if(y>=x)
		SiftUp(index);
	else
		SiftDown(index);
}

void MaxHeap::DeleteMax(HeapNode &heapNode)
{
	Delete(heapNode,1);
}
//子集树中节点的定义


//该函数是将新产生的活结点加入到子集树中,并将这个节点插入到表示活结点优先队列的最大堆中 
void AddLiveNode(MaxHeap &Q,bbnode *parent,bool isLeft,int uWeight,int level)
{
	//先在子集树中建立这个节点
	bbnode *b = new bbnode;
	b->parent = parent;
	b->Lchild = isLeft;
	
	//再在优先队列中新建一个节点
	HeapNode H;
	H.ptr = b;//将刚在添加到子集树中的新节点b再赋值给将要添加到优先队列中的节点h 
	H.uweight = uWeight;
	H.level = level; 
	//将新建的节点添加到优先队列
	Q.Insert(H); 
	 	 
}

int MaxLoading(int *weight,int n,int *bestx,int c)
{
	MaxHeap *Maxhp=new MaxHeap(100);;
	int i=0;// 表示当前所在子集树的层次
	int now_weight=0;//表示当前已装载的重量
	int node_priority=0; //优先级————装载的最大上界=当前装载量+剩余集装箱的重量
	
	HeapNode H;//用于保存从优先队列出来的节点 
	bbnode *B;//子集树上的扩展节点
	int *remains; //剩余集装箱 , 记载未装的货物
	remains = new int[n];
	remains[n-1]=0;//当到达最后的叶子节点时,没有剩余的货物 
	for(int j=n-2;j>=0;j--){	//计算当到达指定层时的剩余数组 
		remains[j]=remains[j+1]+weight[j+1];
	}
	 
	 while(i!=n)//没有到达叶子节点时 ,到达第i层 
	 {
	 	if(now_weight+weight[i]<=c)//即当前的重量能够装的下  =进入左子树 左孩子 
		 {
		 	node_priority=(now_weight+weight[i]) +remains[i];//优先级 =当前装载量+剩余集装箱的重量
		 	AddLiveNode(*Maxhp,B,true,node_priority,i+1);
		 	
		 }
		// 进入右子树  右孩子 
		  
		  	node_priority=(now_weight) +remains[i];//优先级 =当前装载量+剩余集装箱的重量
		 	AddLiveNode(*Maxhp,B,false,node_priority,i+1);
		  
		  
	Maxhp->DeleteMax(H);		//查询优先队列队头结点 
	
		i=H.level;
		B=H.ptr;	//记录当前到达的结点 
		now_weight=H.uweight - remains[i-1];		//计算当前已经装载量  
	  }
	  
	  
	 	// 记录已装载货物 
	for(int j=n-1;j>=0;j--){
		bestx[j]=B->Lchild? 1:0;
		B=B->parent;
	}
	return now_weight; 		//返回最优装载量  
 } 
int main()
{
	int n;			//货物数  
	int shipNum;			//货船数量 
	int bestw;  			//最优装载量 
	
	int weight[n];			//货物总重量 
	int bestx[n];			//最优的装载序列 
	int c1=0;				//第一艘船的装载重量 
	int c2=0;				//第二艘船的装载重量 
	cout<<"请输入货物数:";
	cin>>n;
	cout<<"请输入货船的数量:";
	cin>>shipNum;
	cout<<"请输入货物的重量序列:";
	for(int i=0;i<n;i++)
	{
		cin>>weight[i];
	 }
	 cout<<"请输入两艘船的载重量:";
	 cin>>c1>>c2;
	 int maxc=0;//船的最大装载重量 
	 int sumc=c1+c2;//船的装载重和 
	 
	 if(c1>c2)
	 	maxc=c1;
	else 
		maxc=c2;
		 
	int maxweight=0;//货物中的最大重量
	int sumweight=0;				//货船总重量 
	for(int i=0;i<n;i++)
	{
		if(weight[i]>maxweight)
		{
			maxweight=weight[i];
		}
		sumweight+=weight[i];
	 }
	 
	 if(maxweight>maxc)
	 {
		printf("货物重量超过货船的载重量,无法装载!");
		return 0;
	  } 
	  
	  if(sumweight>sumc){
		printf("货物总重量超过货船的总载重量,无法装载!");
		return 0;
	}
	
	MaxLoading(weight,n,bestx,c1);
	
	cout<<"装载序列为:"; 
	for(int i=0;i<n;i++)
	{
		cout<<bestx[i]<<" ";
	 }
	cout<<endl;
	cout<<"第1艘船的最优装载量为:"<<MaxLoading(weight,n,bestx,c1)<<endl;
	
	 
	 cout<<"装载的货物为:";
	for(int i=0;i<n;i++)
	{
		if(bestx[i]!=0)
		cout<<weight[i]<<" ";
	}
	cout<<endl;
	cout<<"第2艘船的最优装载量为:"<<sumweight-MaxLoading(weight,n,bestx,c1)<<endl;
		 cout<<"装载的货物为:";
	for(int i=0;i<n;i++)
	{
		if(bestx[i]!=1)
		cout<<weight[i]<<" ";
	}
	
 } 

0034算法笔记——【分支限界法】最优装载问题 问题描述       有一批共个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集装箱i的重量为Wi,且装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船。如果有,找出一种装载方案。       容易证明:如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。       (1)首先将第一艘轮船尽可能装满;      (2)将剩余的集装箱装上第二艘轮船。 阅读详情

相关推荐

优先队列式分支限界法 解装载问题

继续学习装载问题 上一篇我们学习了用队列式分支限界法求解,这一次采用优先队列式分支限界法来求解。 有一批共n个集装箱要装上2艘载重量分别为c1,c2的轮船,其中集装箱i的重量为wi,且要求确定是否有一个合理的装载方案可将这n个集装箱装上这2艘轮船。 可证明,采用如下策略可以得到一个最优装载方案:先尽可能的将第一艘船装满,其次将剩余的集装箱装到第二艘船上。 其实质是要求第一艘船的最优装载。 其解...

曼车斯基的博客 6498

分支限界---->装载问题

装载问题 一、问题描述 有两艘船,n个货箱。第一艘船的载重量是c1,第二艘船的载重量是c2,wi是货箱i 的重量,且w1+w2+……+wn≤c1+c2。确定是否有一种可将所有n个货箱全部装船的方法。若有的话,找出该方法。 例子: 有两艘船,3个货箱。第一艘船的载重量是50,第二艘船的载重量是50。          当w =[10,40,40]时,有解;          当w =[2...

weixin_34128501的博客 861

【算法】计算机算法设计与分析考试复习要点【原创技术】

所选教材: 计算机算法设计与分析(第3版) 作者: 王晓东 出版社: 电子工业出版社 1.选择范例(10题,共20分) 分支限界法与回溯法都是在问题的解空间树T上搜索问题的解,二者(B)。 A.求解目标不同,搜索方式相同B.求解目标不同,搜索方式也不同 C.求解目标相同,搜索方式不同D.求解目标相同,搜索方式也相同 下列是动态规划算法基本要素的是

kc15963的专栏 5294

分支界限法&&用分支限界法求解装载问题

问题描述 数据访问

One of thre_tigers的博客 6775

分支限界法解决最优装载问题

算法设计与分析用分支限界法解决最优装载问题,,,

分支限界法解决装载问题

分支限界法解决装载问题 C++实现。 分支限界法类似于回溯法,也是一种在问题的解空间树T中搜索问题解的算法。

分支限界法最大装载问题——算法设计分析6.3老师留的作业

老师要我们用分支限界法,挺难的,我到处搜索终于找着一个简单易修改的程序,正所谓站在巨人的肩膀上就不累嘛。具体的我加了个队列的排序法(挺简单的)是sort(Q)还有一个加入右孩子是否有必要的判断。还有就是:特别讨厌scanf表示不用,不写注释也很讨厌,程序原来的模样就是0.0,所以scanf我改成了别的。 #include <stdio.h> #include <stdlib.h> //存储结构队列 typedef struct QNode{ int data; struct QN

weixin_45035564的博客 1296

分支限界法 装载问题

#include #include #include #include using namespace std; ifstream infile; ofstream outfile; class Node { friend int func(int*, int, int, int*); public: int ID; double weight;//物品的重量 }; bool comp1(Node a, Node b) //定义比较规则 { return a.weight > b.weight; } class Load; class bbnode; class Current { friend Load; friend struct Comp2; private: int upweight;//重量上界 int weight;//结点相应的重量 int level;//活结点在子集树中所处的层次 bbnode* ptr;//指向活结点在子集树中相应结点的指针 }; struct Comp2 { bool operator () (Current *x, Current *y) { return x->upweightupweight; } }; class Load { friend int func(int*, int, int, int*); public: int Max0(); private: priority_queue<Current*, vector, Comp2>H;//利用优先队列(最大堆)储存 int limit(int i); void AddLiveNode(int up, int cw, bool ch, int level); bbnode *P;//指向扩展结点的指针 int c;//背包的容量 int n;//物品的数目 int *w;//重量数组 int cw;//当前装载量 int *bestx;//最优解方案数组 }; class bbnode { friend Load; friend int func( int*, int, int, int*); bbnode* parent; bool lchild; }; //结点中有双亲指针以及左儿子标志 int Load::limit(int i) //计算结点所相应重量的上界 { int left,a; left= c - cw;//剩余容量 a = cw; //b是重量上界,初始值为已经得到的重量 while (i <= n && w[i] parent = P; b->lchild = ch; Current* N = new Current; N->upweight = up; N->weight = cw; N->level = level; N->ptr = b; H.push(N); } int Load::Max0() { int i = 1; P = 0; cw = 0; int bestw = 0; int up = limit(1); while (i != n + 1) { int wt = cw + w[i]; //检查当前扩展结点的左儿子结点 if (wt bestw) bestw =wt; AddLiveNode(up,wt, true, i + 1); } up = limit(i + 1); //检查当前扩展结点的右儿子结点 if (up >= bestw)//如果右儿子可行 { AddLiveNode(up,cw, false, i + 1); } Current* N = H.top(); //取队头元素 H.pop(); P = N->ptr; cw = N->weight; up = N->upweight; i = N->level; } bestx = new int[n + 1]; for (int j = n; j > 0; --j) { bestx[j] = P->lchild; P = P->parent; } return cw; } int func(int *w, int c, int n, int *bestx) //调用Max0函数对子集树的优先队列式进行分支限界搜索 { int W = 0; //初始化装载的总质量为0 Node* Q = new Node[n]; for (int i = 0; i < n; ++i) { Q[i].ID = i + 1; Q[i].weight = w[i+1]; W += w[i+1]; } if (W <= c)//如果足够装,全部装入 return W; sort(Q, Q + n, comp1); //首先,将各物品按照重量从大到小进行排序; Load K; K.w = new int[n + 1]; for (int j = 0; j < n; j++) K.w[j + 1] = w[Q[j].ID]; K.cw = 0; K.c = c; K.n = n; int bestp = K.Max0(); for (int k = 0; k < n; k++) { bestx[Q[k].ID] = K.bestx[k + 1]; } delete []Q; delete []K.w; delete []K.bestx; return bestp; } int main() { int*w,*Final; int c,n,i,best; infile.open("input.txt",ios::in); if(!infile) { cerr<<"open error"<>c; infile>>n; w=new int[n+1]; for(i=1;i>w[i]; infile.close(); Final = new int[n+1]; best = func( w, c, n, Final); outfile.open("output.txt",ios::out); if(!outfile) { cerr<<"open error"<<endl; exit(1); } outfile << best << endl; for (int i = 1; i <= n; ++i) { outfile<<Final[i]<<" "; } outfile.close(); return 0; }

【装载问题(最大堆)】“分支限界法”——《算法设计与分析(第五版)》

【装载问题(最大堆)】“分支限界法”——《算法设计与分析(第五版)》

NI‘CE’XIAN‘s blog 873

基于Windows环境的OGG远程抽取异常(经典模式)OGG-02830 Formatting error

MOS提供的解决方法,根据MOS的提示是由于使用的OGG版本太新了,经典模式下已经弃用了这种远程抽取方式。问题:Windows环境下启用远程抽取ADG备库的数据,在启动抽取进程的时候出现如下错误提示。

Mrzhou的博客 379

MIC卡的OFED驱动安装

 IB网络和OFED驱动安装 IB InfiniBand是一个统一的互联结构,可以处理存储I/O、网络I/O和进程间通信(IPC)。它可以将磁盘阵列、SANs、LANs、服务器和集群服务器进行互联,也可以连接外部网络(比如WAN、VPN、互联网)。设计InfiniBand的目的主要是用于企业数据中心,大型的或小型的。目标主要是实现高的可靠性、可用性、可扩展性和高的性能。Inf

beglorious的专栏 5105

【算法设计zxd】第6章 回溯法

6.1 回溯法的设计技术 : 四皇后问题 皇后可以吃掉——同行 同列 对角线 活结点:可以生成子节点 扩展结点: 死结点:不能再进行子节点生成的 回溯法: 在约束条件下对解空间树进行深度优先搜索的过 程,并在搜索过程中剪去那些不满足条件的分支。 问题的解: 为n元组(X1 ,…,Xi,…Xn),其中Xi 选自有限集S·, 当选出一组值X=(x1 ,…,xi,…xn)能够使评价函数P(x1 ,…,xi,…xn ) 满足问题的某种约束条件或到达极值。 .

iivan_cpp的博客 980

LM339 vs LM358:手把手教你选对比较器和运放(附电路设计避坑指南)

本文深入比较了LM339比较器与LM358运算放大器的核心差异,包括内部架构、输出结构和典型应用场景。通过实测数据和电路设计案例,揭示了选型要点和常见设计陷阱,帮助工程师在电源监控、传感器信号调理等场景中做出正确选择。

convnet3designer的博客 355

装载问题——优先队列

装载问题——优先队列一、装载问题1、装载问题描述二、优先队列1、基本介绍2、标准三、算法描述四、代码实现新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表F...

逊志时敏的博客 5116

基于STM32的工业设备状态监测系统

工业设备的预测性维护需求日益增长,本文设计了一款基于STM32的智能监测终端,可实时采集设备振动、温度、电流等关键参数,通过边缘计算分析设备健康状态,实现故障预警与能效优化。系统支持4G/LoRa远程通信,适用于工厂、发电站等工业场景。本系统实现了工业设备关键参数的实时监测,故障识别准确率达到92%。:STM32F429(带FPU,支持浮点运算)多参数联合判据(振动+温度+电流突变检测)ACS712电流检测模块(0-30A)FFT频谱分析(识别轴承故障特征频率)故障代码生成(支持16种预设故障类型)

stm32d1219的博客 1321

[前沿技术] AMD FSR 1.0源码解析:EASU算法实现细节与优化策略

本文深入解析了AMD FSR 1.0技术的核心——EASU(边缘自适应空间升频)算法。通过剖析其源码,详细阐述了EASU如何利用12-tap采样窗口、基于Lanczos滤波器的多项式近似以及自适应的边缘检测机制,在无需AI模型的情况下实现高质量图像放大。文章重点揭示了其极致的GPU优化策略,包括寄存器利用、采样优化和避免动态分支,为理解高性能图形算法提供了绝佳范例。

docker7nomad的博客 540

算法分析与设计 第十次理论作业

TOC]

没事发发博客 753

基于Simulink的双向DC-DC变换器在储能系统中的应用仿真

摘要:本文详细介绍了基于Simulink的双向DC-DC变换器在光伏储能系统中的仿真实现。主要内容包括:1)采用非隔离型双向Buck-Boost拓扑作为储能系统枢纽;2)针对750V直流微网中的20kWh锂电池接口场景进行建模;3)详细阐述双闭环控制器设计(电压外环+电流内环)、工作模式判断逻辑等关键步骤;4)通过仿真验证了系统在功率阶跃和模式切换下的性能。文章提供了完整的建模流程和控制方法,为储能系统接口设计提供了实用参考。

amy_mhd的博客 178

C++——《算法分析与设计》实验报告——箱子装载问题

实验名称: 箱子装载问题 实验地点: 实验目的: 1、 理解和复习所学各种算法的概念; 2、 掌握和复习所学各种算法的基本要素; 3、 掌握各种算法的优点和区别; 4、 通过应用范例掌握选择最佳算法的设计技巧与策略; 实验原理 回溯法原理: 从开始结点出发,以深度优先方式搜索整个解空间。这个节点成为活结点,同时也成为当前的扩展节点。在当前的扩展节点处,搜索向纵深方向一致一个...

无限迭代中...... 2350

基于 Qt C++ 的战术通信终端

logMessage(QString("新客户端连接来自: %1:%2").arg(incomingTcpSocket->peerAddress().toString()).arg(incomingTcpSocket->peerPort()));logMessage(QString("服务器已启动,在 [%1]:%2 监听IPv6连接...").arg(ui->lineEditAddress->text()).arg(port));

寒寒豆豆软件公司的博客 77

YOLOv11涨点改进| CVPR 2026 |独家创新首发、特征融合改进篇| 引入FAAFusion傅里叶角对准融合模块,促进高低频特征融合,增强模型在小目标、密集目标检测和旋转目标检测任务高效涨点

🔥本文提出FAAFusion傅里叶角对准融合模块,用于改进YOLOv11网络模型。该模块通过在特征金字塔融合阶段对齐高低层特征的方向信息,缓解传统FPN直接融合带来的方向冲突问题。FAAFusion利用傅里叶旋转等变性原理,在频域估计主方向并进行特征对齐,显著提升了多尺度特征表达的一致性与有效性。实验表明,该方法在DOTA等遥感数据集上取得了新的最先进水平,特别适用于旋转目标检测任务。文章详细介绍了模块原理、结构优势,并提供了三种不同的YOLOv11改进配置方案和完整的核心代码实现。

Ai缝合怪、助力小伙伴高效发论文 152

educoder算法设计与分析 实验六 分支限界法拓展

实验六 分支限界法拓展第1关:装载问题 (FIFO 优先队列法)第2关:装载问题 (最优队列法) 第1关:装载问题 (FIFO 优先队列法) 题目描述:   有一批共个集装箱要装上 2 艘载重量分别为 C1 和 C2 的轮船,其中集 装箱 i 的重量为 Wi ,且 装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船。如果有,找出一种装载方案。 容易证明:如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。 (1)首先将第一艘轮船尽可能装满; (2)将剩余的集装箱装上第二艘轮船。

xingcheng12345的博客 1467

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

算法分析与设计-期末复习-第五章+第六章+填空题+写出递归方程问题

首先计算每种物品单位重量的价值Vi/Wi,然后,依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。1)求解目旳:回溯法旳求解目旳是找出解空间树中满足约束条件旳所有解,而分支限界法旳求解目旳则是找出满足约束条件旳一种解,或是在满足约束条件旳解中找出在某种意义下旳最优解。序号有点问题,影响不大,内容都是各种资料整合和我自己归纳总结的,不喜勿喷,感觉扔回收站可惜了,所以分享出来,能有帮上你的忙就最好不过了,更多复习资料,可以去看我的合集。在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。

weixin_65169788的博客 1003

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

算法设计与分析--期末复习重点总结

本文采用流行的c++语言作为算法描述手段,文中所列算法均已上机调试过。内容包括算法概要,递归与分治,动态规划,贪心算法,回溯法,分支限界法,随机算法。后续内容在一个月内更新,敬请期待。

qq_62795094的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java分支限界实现装载问题_队列式分支限界法 解装载问题

装载问题有一批共n个集装箱要装上2艘载重量分别为c1,c2的轮船,其中集装箱i的重量为wi,且要求确定是否有一个合理的装载方案可将这n个集装箱装上这2艘轮船。可证明,采用如下策略可以得到一个最优装载方案:先尽可能的将第一艘船装满,其次将剩余的集装箱装到第二艘船上。其实质是要求第一艘船的最优装载。 其解空间树是一棵子集树。《算法设计与分析》-王晓东著 一书P159中给出的java算法是不完全正确的。...

weixin_39956350的博客 656

西北工业大学 算法设计与分析 复习提纲

(是博主当时考前搜刮网上资料+自己整理的一些考点,可供参考(博主是蠢蛋 有些备注写得很糟糕是为了自己能尽量理解,碎碎念也很多 dbqdbq。

AAAkiraa的博客 1717
上一篇: 算法设计与分析——分治与递归——整数划分问题
下一篇: 数据结构——最大堆最小堆
943802606
博客等级 码龄6年 1万+粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值