堆的实现

堆是一棵完全二叉树,所谓的完全二叉树的意思是所有的叶子节点都处于某一层,或者处于两个相邻的层并且最底层的叶子节点处于最左侧。但是堆具有的一个特殊性质是:每个节点上的值都小于(大于)或等于那个节点上的值。
下面的代码是以小于为实现。堆可以做为一个优先队列的实现,可以成为一种排序方式。
public class Heap<E extends Comparable<E>> {
private E[] data=(E[])new Object[10]; //用数组实现
int top=-1; //用来指向元素存到数组哪个位置了
public Heap(){

}
public Heap(Collection<E> coll){
for(E e:coll){
add(e);
}
}
public Heap(E[] coll){
for(E e:coll){
add(e);
}
}
//判断是否为空树
public boolean isEmpty(){
return top==-1;
}
//返回index的左子树位置
private int leftChildIndex(int index){
return 2*index+1;
}
//返回index的右子树位置
private int rightChildIndex(int index){
return 2*index+2;
}
//返回index的父亲位置
private int parentChildIndex(int index){
return (index-1)/2;
}
//实现加入操作
public void add(E target){
//判断是否超出数组大小,如果超出重新创建一个并复制原来的数组到新数组中
if(top==data.length-1){
E[] tempdata=(E[])new Object[data.length+5];
int j=0;
for(int i=0;i<data.length;i++){
tempdata[j++]=data[i];
}
data=tempdata;
}
//以下操作是真正加入到堆中
top=top+1; //指针下移
data[top]=target; //加入到末尾
//加入后可能出现不是堆了,进行堆化操作
int index=top;
int parent=parentChildIndex(index);
while(parent>=0){
//如果父亲比孩子节点大,交换位置
if(data[parent].compareTo(data[index])>0){
swap(parent,index);
index=parent;
parent=parentChildIndex(index);
}else{
return ;
}
}
}
//删除操作
public E remove(){
E temp=data[0]; //删除第一个
data[0]=data[top];//把最尾部的元素来取代这个位置
top--;
//以下是进行堆化操作
int index=0;
int leftchild=leftChildIndex(index);
int rightchild=rightChildIndex(index);
//只要孩子节点没超出执行以下操作
//如果当前节点比孩子节点大(如果都比两个大那么跟其中小)跟其交换
while(leftchild<=top||rightchild<=top){
if((data[index].compareTo(data[leftchild])>0)&&(data[leftchild].compareTo(data[rightchild])<0)){
swap(index,leftchild);
index=leftchild;
leftchild=leftChildIndex(index);
rightchild=rightChildIndex(index);
}else if(data[index].compareTo(data[rightchild])>0){
swap(index,rightchild);
index=rightchild;
leftchild=leftChildIndex(index);
rightchild=rightChildIndex(index);
}else{
break;
}
}
return temp;
}
//交换位置i,j位置元素
private void swap(int i,int j){
E temp=null;
temp=data[i];
data[i]=data[j];
data[j]=temp;
}
}
内容概要:本文介绍了一种基于蒙特卡洛模拟和拉格朗日优化方法的电动汽车充电站有序充电调度策略,重点针对分时电价机制下的分散式优化问题。通过Matlab代码实现,构建了考虑用户充电需求、电网负荷平衡及电价波动的数学模【电动汽车充电站有序充电调度的分散式优化】基于蒙特卡诺和拉格朗日的电动汽车优化调度(分时电价调度)(Matlab代码实现)型,采用拉格朗日乘子法处理约束条件,结合蒙特卡洛方法模拟大量电动汽车的随机充电行为,实现对充电功率和时间的优化分配,旨在降低用户充电成本、平抑电网峰谷差并提升充电站运营效率。该方法体现了智能优化算法在电力系统调度中的实际应用价值。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事新能源汽车、智能电网相关领域的工程技术人员。; 使用场景及目标:①研究电动汽车有序充电调度策略的设计与仿真;②学习蒙特卡洛模拟与拉格朗日优化在能源系统中的联合应用;③掌握基于分时电价的需求响应优化建模方法;④为微电网、充电站运营管理提供技术支持和决策参考。; 阅读建议:建议读者结合Matlab代码深入理解算法实现细节,重点关注目标函数构建、约束条件处理及优化求解过程,可尝试调整参数设置以观察不同场景下的调度效果,进一步拓展至多目标优化或多类型负荷协调调度的研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值