`
zl-2577
  • 浏览: 81012 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java实现的关键路径的算法

阅读更多
基本概念:
在关键路径法中,一般有以下一些时间参数:

最早开始时间(Early Start)活动最早开始时间由所有前置活动中最后一个最早结束时间确定。

最早结束时间(Early Finish)活动的最早结束时间由活动的最早开始时间加上其工期确定。

最迟结束时间(Late Finish)一个活动在不耽误整个项目的结束时间的情况下能够最迟开始的时间。它等于所有紧后工作中最早的一个最晚开始时间。

最迟开始时间(Late Start)一个活动在不耽误整个项目的结束时间的情况下能够最早开始的时间。它等于活动的最迟结束时间减去活动的工期。

总时差(Total Float) 指一项活动在不影响整体计划工期的情况下最大的浮动时间。

自由时差(Free Float)指活动在不影响其紧后工作的最早开始时间的情况下可以浮动的时间。

*
*
算法原理-前导图(PDM)法:
对于活动的最早开始和最早结束时间,采用正推法计算,其算法如下所示:

1.将第一个活动的最早开始时间设置为1.

2.在活动的最早开始时间上加上其工期,得到活动的最早结束时间。

3.根据该活动与后置活动的逻辑关系,计算后置活动应该的最早开始时间,并与其已有的最早开始时间对比,如果其后置活动还没有设置最早开始时间,则将此时间设为其最早开始时间,如果此时间早于其后置活动已有的最早开始时间,则保留后置活动的原有最早开始时间,如果此时间迟于其后置活动已有的最早开始时间,则将此时间设置为后置活动的最迟开始时间。

4.重复步骤2和3,直到所有活动的时间被计算完为止。

对于以上所示的最早时间的计算过程,可以以公式的形式表示如下:

当活动间的逻辑关系为SS,则计算如下

ESj=max{ ESi + STS}

当活动间的逻辑关系为FS,则计算如下

ESj= max{ESi+ Di+ FTS}

当活动间的逻辑关系为FF,计算如下

ESj= max{ESi+ Di - Dj +FTF}

当活动间的逻辑关系为SF,计算如下

ESj=max{ ESi - Dj +STF}

在计算出各个活动的最早开始和结束时间之后,就可以计算活动的自由时差,在计算前导图(PDM)的自由时差时应注意,由于引入了多种逻辑关系,并且活动间可以存在延时,所以其计算方法与箭线图(ADM)的计算方法不一样。

对于前导图(PDM)的活动间,除了延时还可以存在时间间隔(LAG),一般可以按照下面的方式计算。

当活动间的逻辑关系为SS,则计算如下

LAGi-j= ESj- ESi- STS

当活动间的逻辑关系为FS,则计算如下

LAGi-j= ESj- EFi- FTS

当活动间的逻辑关系为FF,计算如下

LAGi-j= EFj- EFi- FTF

当活动间的逻辑关系为SF,计算如下

LAGi-j= EFj- ESi- STF

则对于任意一个活动,其自由时差为

FFi=min{ LAGi-j}

最后一个活动的自由时差为0.

对于总时差,终点节点的总时差为0,对于其它任意一个节点,总时差按照下式进行计算

TFi=min{TFj+ LAGi-j}

对于任意一个活动的最晚开始时间可以由其最早开始时间加上总时差得到,同样,其最晚开始时间可以由最早结束时间加上其总时差得到,公式表示如下

LSi=ESi+TFi

LFi=EFi+TFi


package com.ryan.activity;

import java.util.LinkedList;
import java.util.List;

/**
 * TASK基础类
 *
 * @author ryan
 */
public class Task {
	private String taskNumber;//任务编号
	private String logic;//任务之间的逻辑关系
	
	private double earlyStartTime;//最早开始时间
	private double earlyFinishTime;//最早结束时间
	private double lateStartTime;//最晚开始时间
	private double lateFinishTime;//最晚结束时间
	private double dut;//执行时间
	private double delayTime;//延迟时间
	private double slack;//机动时间
	
	private String[] logicArray;//任务之间的逻辑关系
	private double[] earlyStartTimeArray;//最早开始时间
	private double[] earlyFinishTimeArray;//最早结束时间
	private double[] lateStartTimeArray;//最晚开始时间
	private double[] lateFinishTimeArray;//最晚结束时间
	private double[] dutArray;//执行时间
	private double[] delayTimeArray;//延迟时间
	private double[] slackArray;//机动时间
	
	private boolean isCalEST = false;//是否计算了最早开始时间
	private boolean isCalEFT = false;//是否计算了最早结束时间
	private boolean isCalLST = false;//是否计算了最晚开始时间
	private boolean isCalLFT = false;//是否计算了最晚结束时间
	private boolean isCalSlack = false;//是否计算了机动时间
	
	private boolean isCalETArray = false;//是否计算了最早开始时间
	private boolean isCalLTArray = false;//是否计算了最晚开始时间
	private boolean isCalSlackArray = false;//是否计算了机动时间
	
	private boolean isCriticalPath = false;//是否是关键路径
	
	private List<Task> previousTasks = new LinkedList<Task>();//前置任务集合
	private List<Task> nextTasks = new LinkedList<Task>();//后置任务集合

	/*
	 * 计算最早开始时间 
	 */
	public void calculateET(){
		if(!this.isCalEST()){
			double est = 0.0d;//临时存放最早开始时间
			boolean isTmp = false;//标记是否执行了逻辑关系中的代码
			if(this.getPreviousTasks().size()==0){//第一个任务是没有前置任务的,所以其最早开始时间是0
				this.earlyStartTime = est;
				this.isCalEST = true;
			} else {			
				if("FS".equals(logic)){//ES= max{ES(前)+ Dur(前)+ FTS}
					for(Task previousTask : this.getPreviousTasks()){
						if(previousTask.getEarlyFinishTime()>est && previousTask.isCalEFT()){
							
							est = previousTask.getEarlyFinishTime();
							isTmp = previousTask.isCalEFT();
						}
					}
					est = est + this.getDelayTime();
				}else if("FF".equals(logic)){//ES= max{ES(前)+ Dur(前) - Dur +FTF}
					for(Task previousTask : this.getPreviousTasks()){
						if(previousTask.getEarlyFinishTime()>est && previousTask.isCalEFT()){
							est = previousTask.getEarlyFinishTime();
							isTmp = previousTask.isCalEFT();
						}
					}
					est = est + this.getDelayTime() - this.getDut();
				}else if("SS".equals(logic)){//ES=max{ ES(前) + STS}
					for(Task previousTask : this.getPreviousTasks()){
						if(previousTask.getEarlyStartTime()>est && previousTask.isCalEST()){
							est = previousTask.getEarlyStartTime();
							isTmp = previousTask.isCalEST();
						}
					}
					est = est + this.getDelayTime();
				}else if("SF".equals(logic)){//ES=max{ ES(前) - Dur +STF}
					for(Task previousTask : this.getPreviousTasks()){
						if(previousTask.getEarlyStartTime()>est && previousTask.isCalEST()){
							est = previousTask.getEarlyStartTime();
							isTmp = previousTask.isCalEST();
						}
					}
					est = est - this.getDut() + this.getDelayTime();
				}
				if(isTmp){
					this.earlyStartTime = est;
					this.isCalEST = true;
				}		
			}
		}
		if(!this.isCalEFT() && this.isCalEST()){			
			this.earlyFinishTime = this.getEarlyStartTime() + this.getDut();
			this.isCalEFT = true;
		}
	}
	
	/*
	 *计算最晚时间 
	 */
	public void calculateLT(){
		if(!this.isCalLST()){
			calculateLT(this.nextTasks,this);				
		}
		if(!this.isCalLFT()){			
			calculateLT(this.nextTasks,this);			
		}
	}
	
	
	/*
	 * task的后置任务nextTasks
	 */
	public void calculateLT(List<Task> nextTasks,Task task){
		double tmpSlack = 0.0d;//临时时间差
		boolean isTmp = false;//标记
		if(nextTasks.size()==0 ){				
			if(task.isCalEST() && task.isCalEFT()){
				task.lateFinishTime = task.getEarlyFinishTime();
				task.slack = 0.0d;
				task.isCalLFT = true;
				task.isCalSlack = true;
				task.lateStartTime = task.getEarlyStartTime();
				task.slack = 0.0d;
				task.isCalLST = true;
				task.isCalSlack = true;
			}			
		} else{
			for(int i = 0; i<nextTasks.size(); i++){
				Task nextTask = nextTasks.get(i);	
				if(!nextTask.isCalLFT())
					return;
				if(!nextTask.isCalLST())
					return;
				if(nextTask.isCalSlack){
					double _tmp = tmpSlack;//临时时间间隔
					if("FS".equals(nextTask.logic) && nextTask.isCalEST() && task.isCalEFT()){//Slack = min{slack后+ES后-EF-FTS}
						_tmp =  nextTask.getSlack() + nextTask.getEarlyStartTime() - task.getEarlyFinishTime() - nextTask.getDelayTime();
						isTmp = true;				
					}else if("FF".equals(nextTask.logic)  && nextTask.isCalEFT() && task.isCalEFT()){//Slack = min{slack后+EF后-EF-FTF}
						_tmp =  nextTask.getSlack() + nextTask.getEarlyFinishTime() - task.getEarlyFinishTime() - nextTask.getDelayTime();
						isTmp = true;			
					}else if("SF".equals(nextTask.logic) && nextTask.isCalEFT() && task.isCalEST()){//Slack = min{slack后+EF后-ES-STF}
						_tmp =  nextTask.getSlack() + nextTask.getEarlyFinishTime() - task.getEarlyStartTime() - nextTask.getDelayTime();
						isTmp = true;			
					}else if("SS".equals(nextTask.logic)  && nextTask.isCalEST() && task.isCalEST()){//Slack = min{slack后+ES后-ES-STS}
						_tmp =  nextTask.getSlack() + nextTask.getEarlyStartTime() - task.getEarlyStartTime() - nextTask.getDelayTime();							
						isTmp = true;
					}
					if(i==0){						
						tmpSlack = _tmp;
					}					
					if(_tmp < tmpSlack ){
						tmpSlack = _tmp;
					}			
				}														
			}
			
		}
		if(isTmp && task.isCalEST() && task.isCalEFT()){//isTmp标记为true,说明已经经过计算。
			task.lateFinishTime = task.getEarlyFinishTime() + tmpSlack;
			task.setSlack(tmpSlack);
			task.isCalLFT = true;
			task.isCalSlack = true;
			task.lateStartTime = task.getEarlyStartTime() + tmpSlack;
			task.setSlack(tmpSlack);
			task.isCalLST = true;
			task.isCalSlack = true;
			
		}
	}		
	
	/* 
	 * 计算最早开始和最早结束时间
	 * */
	public void calculateETArray(){
		if(!this.isCalETArray()){
			double[] dutArray = this.getDutArray();
			double[] delayTimeArray = this.getDelayTimeArray();
			String[] logicArray = this.getLogicArray();
			double[] earlyStartTimeArray = new double[dutArray.length];
			double[] earlyFinishTimeArray = new double[dutArray.length];
			int ETCount = 0;
			for (int i=0;i<dutArray.length;i++) {
				this.setDelayTime(delayTimeArray[i]);
				this.setLogic(logicArray[i]);
				this.setDut(dutArray[i]);
				this.calculateET();
				earlyStartTimeArray[i] = this.getEarlyStartTime();
				earlyFinishTimeArray[i] = this.getEarlyFinishTime();
				ETCount++;
				
			}
			if(ETCount==dutArray.length){
				this.setEarlyStartTimeArray(earlyStartTimeArray);
				this.setEarlyFinishTimeArray(earlyFinishTimeArray); 
				this.setCalETArray(true);
			}
		}
	}
	/* 
	 * 计算最晚开始和最晚结束时间
	 * */
	public void calculateLTArray(){
		if(!this.isCalLTArray()){
			double[] dutArray = this.getDutArray();
			double[] delayTimeArray = this.getDelayTimeArray();
			String[] logicArray = this.getLogicArray();
			double[] lateStartTimeArray = new double[dutArray.length];
			double[] lateFinishTimeArray = new double[dutArray.length];
			int LTCount = 0;
			for (int i=0;i<dutArray.length;i++) {
				this.setDelayTime(delayTimeArray[i]);
				this.setLogic(logicArray[i]);
				this.setDut(dutArray[i]);
				this.calculateLT();
				lateStartTimeArray[i] = this.getLateStartTime();
				lateFinishTimeArray[i] = this.getLateFinishTime();
				LTCount++;
				}
			
			if(LTCount==dutArray.length){
				this.setLateStartTimeArray(lateStartTimeArray);
				this.setLateFinishTimeArray(lateFinishTimeArray); 
				this.setCalLTArray(true);
			}
		}
	}
	
	/*
	 * taskNumber 任务编号
	 * logic 与前置任务的逻辑关系
	 * dut 任务执行时间
	 *delayTime 提前滞后时间
	 */
	public Task(String taskNumber,String logic, double dut, double delayTime) {
		super();
		this.taskNumber = taskNumber;
		this.logic = logic;
		this.dut = dut;
		this.delayTime = delayTime;
	}
	
	/*
	 * taskNumber 任务编号
	 * logic 与前置任务的逻辑关系
	 * dut 任务执行时间数组
	 * delayTime 提前滞后时间数组
	 */
	public Task(String taskNumber,String[] logicArray, double[] dutArray, double[] delayTimeArray) {
		super();
		this.taskNumber = taskNumber;
		this.logicArray = logicArray;
		this.dutArray = dutArray;
		this.delayTimeArray = delayTimeArray;
	}
	
	public String getTaskNumber() {
		return taskNumber;
	}

	public void setTaskNumber(String taskNumber) {
		this.taskNumber = taskNumber;
	}
	
	public double getDelayTime() {
		return delayTime;
	}
	
	public void setDelayTime(double delayTime) {
		this.delayTime = delayTime;
	}

	public double getDut() {
		return dut;
	}
	
	public void setDut(double dut) {
		this.dut = dut;
	}
	
	public double getEarlyFinishTime() {
		return earlyFinishTime;
	}

	public double getEarlyStartTime() {
		return earlyStartTime;
	}

	public double getLateFinishTime() {
		return lateFinishTime;
	}

	public double getLateStartTime() {
		return lateStartTime;
	}
	
	public double getSlack(){
		return slack;
	}
	
	public void setSlack(double slack){
		this.slack = slack;
	}
	
	public boolean isCalEST(){;
		return isCalEST;
	}
	
	public boolean isCalEFT(){;
		return isCalEFT;
	}
	
	public boolean isCalLST(){
		return isCalLST;
	}

	public boolean isCalLFT(){
		return isCalLFT;
	}

	public boolean isCriticalPath(){
		return isCriticalPath;
	}

	public List<Task> getPreviousTasks() {
		return previousTasks;
	}

	public String getLogic() {
		return logic;
	}

	public void setLogic(String logic) {
		this.logic = logic;
	}
	
	public void setPreviousTasks(List<Task> previousTasks) {
		this.previousTasks = previousTasks;
		for (Task task : this.previousTasks) {
			task.getNextTasks().add(this);
		}
	}
	
	
	public List<Task> getNextTasks() {
		return nextTasks;
	}

	public void setNextTasks(List<Task> nextTasks) {
		this.nextTasks = nextTasks;
	}	
	
	public String[] getLogicArray() {
		return logicArray;
	}

	public void setLogicArray(String[] logicArray) {
		this.logicArray = logicArray;
	}

	public double[] getDelayTimeArray() {
		return delayTimeArray;
	}

	public void setDelayTimeArray(double[] delayTimeArray) {
		this.delayTimeArray = delayTimeArray;
	}

	public double[] getDutArray() {
		return dutArray;
	}

	public void setDutArray(double[] dutArray) {
		this.dutArray = dutArray;
	}

	public double[] getEarlyFinishTimeArray() {
		return earlyFinishTimeArray;
	}

	public void setEarlyFinishTimeArray(double[] earlyFinishTimeArray) {
		this.earlyFinishTimeArray = earlyFinishTimeArray;
	}

	public double[] getEarlyStartTimeArray() {
		return earlyStartTimeArray;
	}

	public void setEarlyStartTimeArray(double[] earlyStartTimeArray) {
		this.earlyStartTimeArray = earlyStartTimeArray;
	}

	public double[] getLateFinishTimeArray() {
		return lateFinishTimeArray;
	}

	public void setLateFinishTimeArray(double[] lateFinishTimeArray) {
		this.lateFinishTimeArray = lateFinishTimeArray;
	}

	public double[] getLateStartTimeArray() {
		return lateStartTimeArray;
	}

	public void setLateStartTimeArray(double[] lateStartTimeArray) {
		this.lateStartTimeArray = lateStartTimeArray;
	}

	public double[] getSlackArray() {
		return slackArray;
	}

	public void setSlackArray(double[] slackArray) {
		this.slackArray = slackArray;
	}


	public boolean isCalSlackArray() {
		return isCalSlackArray;
	}

	public void setCalSlackArray(boolean isCalSlackArray) {
		this.isCalSlackArray = isCalSlackArray;
	}

	public boolean isCalETArray() {
		return isCalETArray;
	}

	public void setCalETArray(boolean isCalETArray) {
		this.isCalETArray = isCalETArray;
	}

	public boolean isCalLTArray() {
		return isCalLTArray;
	}

	public void setCalLTArray(boolean isCalLTArray) {
		this.isCalLTArray = isCalLTArray;
	}

	public void setCriticalPath() {
		if(this.isCalLST() && this.isCalEST()){
			if(this.getLateStartTime()-this.getEarlyStartTime()==0)
			this.isCriticalPath = true;
		}
	}
	public void setCriticalPathArray() {
		if(this.isCalLTArray() && this.isCalETArray()){
			//TODO 待完成
		}
	}

	
}




还有一个封装测试类,利用随机数模拟蒙特卡洛模拟法(
http://baike.baidu.com/view/2692033.htm

package com.ryan.activity;

import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.Set;

/**
 * Task的计算逻辑类
 *
 * @author ryan
 */
public class Wbs {
	private List<Task> tasks;//所有任务集合
	private Set<Task> noPreviousTasks;//没有前置任务的任务集合
	private Set<Task> noNextTasks;//没有后置任务的任务集合

	
	/**
	 * @param tasks 所有任务集合
	 * @return 没有前置任务的任务集合
	 */
	public Set<Task> getNoPreviousTasks(List<Task> tasks){	
		if(tasks!=null && tasks.size()>0){
			for(Task task : tasks){
				if(task!=null && task.getPreviousTasks().size()==0){
					this.noPreviousTasks.add(task);
				}
			}
		}
		return this.noPreviousTasks;
	}
	/**
	 * @param tasks 所有任务集合
	 * @return 没有后置任务的任务集合
	 */
	public Set<Task> getNoNextTasks(List<Task> tasks){
		if(tasks!=null && tasks.size()>0){
			for(Task task : tasks){
				if(task!=null && task.getNextTasks().size()==0){
					this.noNextTasks.add(task);
				}
			}
		}
		return this.noNextTasks;
	}
	

	
	
	/**
	 * @param tasks 所有任务
	 * @return  没有前置任务计算完成之后,待计算的任务
	 */
	private Set<Task> calculateNoPreviousEarlyTime(List<Task> tasks){
	//	System.out.println("开始调用calculateNoPreviousEarlyTime(List<Task> tasks)------");
		Set<Task> calTasks = new LinkedHashSet<Task>();
		if(tasks!=null && tasks.size()>0){
			Set<Task> noPreviousTasks = this.getNoPreviousTasks(tasks);
			for(Task task : noPreviousTasks){
		//		System.out.println("没有前置任务的是"+task.getTaskNumber());
				if(!task.isCalEST()&&!task.isCalEFT())
					task.calculateET();
				calTasks.add(task);			
			}
		}
	//	System.out.println("结束调用calculateNoPreviousEarlyTime(List<Task> tasks)------");
		return calTasks;
	}
	
	/**
	 * @param nextTasks 本次待计算的任务
	 * @return  下一次待计算的任务
	 */
	public Set<Task> calculateEarlyTime(Set<Task> nextTasks){
		Set<Task> calTasks = new LinkedHashSet<Task>();
		if(nextTasks!=null && nextTasks.size()>0){	
			Iterator<Task> it = nextTasks.iterator();
			while(it.hasNext()){
				Task task = it.next();
		//		System.out.println("本次需要计算的任务是"+task.getTaskNumber());
				//找到本任务的前置任务看是不是全部计算完成了,
				List<Task> befTask = task.getPreviousTasks();
				//判断本任务的前置任务是不是完全计算完成的计数器
				int count = 0;//计数器
				for(int i=0;i<befTask.size();i++){
					Task bfTask = befTask.get(i);
					if(bfTask.isCalEST() && bfTask.isCalEFT())
						count++;						
				}
				//如果全部计算完成,将本任务的后置任务加入到返回列表里
				if(count==befTask.size()){
					task.calculateET();
		//			System.out.println("已经计算了"+task.getTaskNumber());
					calTasks.addAll(task.getNextTasks());
				//如果没有全部计算完成,把本任务加入到计算列表里
				}else{
					calTasks.add(task);
				}
			}
		}
		return calTasks;
	}
	
	/**
	 * @param tasks 所有任务
	 * @return 没有前置任务的下一层需要计算的任务
	 */
	public Set<Task> calNoNextTasksLateTime(List<Task> tasks){
		Set<Task> calTasks = new LinkedHashSet<Task>();
		if(tasks!=null && tasks.size()>0){
			for (Task task : this.getNoNextTasks(tasks)) {
				if(!task.isCalLST()&&!task.isCalLFT())
					task.calculateLT();
				calTasks.add(task);
			}
		}
		return calTasks;
	}
	
	/**
	 * @param nextTasks 本次待计算的任务
	 * @return 下一次需要计算的任务
	 */
	public Set<Task> calculateLateTime(Set<Task> nextTasks){
		Set<Task> calTasks = new LinkedHashSet<Task>();
		if(nextTasks!=null && nextTasks.size()>0){	
			Iterator<Task> it = nextTasks.iterator();
			while(it.hasNext()){
				Task task = it.next();
				//找到本任务的后置任务看是不是全部计算完成了,
				List<Task> nextTask = task.getNextTasks();
				//判断本任务的后置任务是不是完全计算完成的计数器
				int count = 0;//计数器
				for(int i=0;i<nextTask.size();i++){
					Task ntTask = nextTask.get(i);
					if(ntTask.isCalLST()&&ntTask.isCalLFT())
						count++;			
				}
				//如果全部计算完成,将本任务的后置任务加入到返回列表里
				if(count==nextTask.size()){
					task.calculateLT();
		//			System.out.println("计算的是"+task.getTaskNumber());
					calTasks.addAll(task.getPreviousTasks());
				//如果没有全部计算完成,把本任务加入到计算列表里
				}else{
					calTasks.add(task);
				}
			}
		}
		return calTasks;
	}
	
	/*
	 * 计算最早最晚时间
	 */
	public void calculateTime() {
		//计算没有前置任务的任务
		Set<Task> firstTimes = calculateNoPreviousEarlyTime(this.tasks);		
		//依次分层计算后一层的任务EST,EFT
		Set<Task> nextTimes = calculateEarlyTime(firstTimes);
		Set<Task> tmpTasks;
		do{				
			tmpTasks = nextTimes;
			nextTimes = calculateEarlyTime(tmpTasks);
			
		}while(nextTimes.size()>0);
		
		firstTimes.clear();
		nextTimes.clear();
		tmpTasks.clear();
		//计算没有后置任务的任务
		firstTimes = calNoNextTasksLateTime(this.tasks);
		//依次分层计算后一层的任务的LST
		nextTimes = calculateLateTime(firstTimes);
		do{				
			tmpTasks = nextTimes;
			nextTimes = calculateLateTime(tmpTasks);
			
		}while(nextTimes.size()>0);
		
		//打印计算结果
		for (Task task : this.tasks) {
			System.out.println(task.getTaskNumber()+"tnumber=="+task.getEarlyStartTime()+"est==="+task.getEarlyFinishTime()+"eft==="+task.getLateStartTime()+"lst==="+task.getLateFinishTime()+"lft===="+task.isCriticalPath());
		}
	}
	
	
	/**
	 * @param tasks 所有任务
	 * @return  没有前置任务计算完成之后,待计算的任务
	 */
	private Set<Task> calculateNoPreviousEarlyTimeArray(List<Task> tasks){
	//	System.out.println("开始调用calculateNoPreviousEarlyTime(List<Task> tasks)------");
		Set<Task> calTasks = new LinkedHashSet<Task>();
		if(tasks!=null && tasks.size()>0){
			Set<Task> noPreviousTasks = this.getNoPreviousTasks(tasks);
			for(Task task : noPreviousTasks){
		//		System.out.println("没有前置任务的是"+task.getTaskNumber());
				if(!task.isCalETArray()){
					task.calculateETArray();
					System.out.println("计算了第一个"+task.getTaskNumber()+"tnumber=="+task.getEarlyStartTime()+"est==="+task.getEarlyFinishTime()+"eft===");
					
					calTasks.add(task);			
				}
			}
		}
	//	System.out.println("结束调用calculateNoPreviousEarlyTime(List<Task> tasks)------");
		return calTasks;
	}
	
	/**
	 * @param nextTasks 本次待计算的任务
	 * @return  下一次待计算的任务
	 */
	public Set<Task> calculateEarlyTimeArray(Set<Task> nextTasks){
		Set<Task> calTasks = new LinkedHashSet<Task>();
		if(nextTasks!=null && nextTasks.size()>0){	
			Iterator<Task> it = nextTasks.iterator();
			while(it.hasNext()){
				Task task = it.next();
		//		System.out.println("本次需要计算的任务是"+task.getTaskNumber());
				//找到本任务的前置任务看是不是全部计算完成了,
				List<Task> befTask = task.getPreviousTasks();
				//判断本任务的前置任务是不是完全计算完成的计数器
				int count = 0;//计数器
				for(int i=0;i<befTask.size();i++){
					Task bfTask = befTask.get(i);
					if(bfTask.isCalETArray())
						count++;						
				}
				//如果全部计算完成,将本任务的后置任务加入到返回列表里
				if(count==befTask.size()){				
					task.calculateETArray();				
		//			System.out.println("已经计算了"+task.getTaskNumber());
					calTasks.addAll(task.getNextTasks());
				//如果没有全部计算完成,把本任务加入到计算列表里
				}else{
					calTasks.add(task);
				}
			}
		}
		return calTasks;
	}
	
	/**
	 * @param tasks 所有任务
	 * @return 没有前置任务的下一层需要计算的任务
	 */
	public Set<Task> calNoNextTasksLateTimeArray(List<Task> tasks){
		Set<Task> calTasks = new LinkedHashSet<Task>();
		if(tasks!=null && tasks.size()>0){
			for (Task task : this.getNoNextTasks(tasks)) {
				if(!task.isCalLTArray())
					task.calculateLTArray();
				calTasks.add(task);
			}
		}
		return calTasks;
	}
	
	/**
	 * @param nextTasks 本次待计算的任务
	 * @return 下一次需要计算的任务
	 */
	public Set<Task> calculateLateTimeArray(Set<Task> nextTasks){
		Set<Task> calTasks = new LinkedHashSet<Task>();
		if(nextTasks!=null && nextTasks.size()>0){	
			Iterator<Task> it = nextTasks.iterator();
			while(it.hasNext()){
				Task task = it.next();
				//找到本任务的后置任务看是不是全部计算完成了,
				List<Task> nextTask = task.getNextTasks();
				//判断本任务的后置任务是不是完全计算完成的计数器
				int count = 0;//计数器
	
				for(int i=0;i<nextTask.size();i++){
					Task ntTask = nextTask.get(i);
					if(ntTask.isCalLTArray())
						count++;			
				}
				//如果全部计算完成,将本任务的后置任务加入到返回列表里
				if(count==nextTask.size()){
					task.calculateLTArray();
		//			System.out.println("计算的是"+task.getTaskNumber());
					calTasks.addAll(task.getPreviousTasks());
				//如果没有全部计算完成,把本任务加入到计算列表里
				}else{
					calTasks.add(task);
				}
				
			}
		}
		return calTasks;
	}

	/*
	 * 计算最早最晚时间
	 */
	public void calculateTimeArray() {
		//计算没有前置任务的任务
		Set<Task> firstTimes = calculateNoPreviousEarlyTimeArray(this.tasks);		
		//依次分层计算后一层的任务EST,EFT
		Set<Task> nextTimes = calculateEarlyTimeArray(firstTimes);
		Set<Task> tmpTasks;
		do{				
			tmpTasks = nextTimes;
			nextTimes = calculateEarlyTimeArray(tmpTasks);
			
		}while(nextTimes.size()>0);
		
		firstTimes.clear();
		nextTimes.clear();
		tmpTasks.clear();
		//计算没有后置任务的任务
		firstTimes = calNoNextTasksLateTimeArray(this.tasks);
		//依次分层计算后一层的任务的LST
		nextTimes = calculateLateTimeArray(firstTimes);
		do{				
			tmpTasks = nextTimes;
			nextTimes = calculateLateTimeArray(tmpTasks);
			
		}while(nextTimes.size()>0);
	
		//打印计算结果
		for (int i =0; i<this.tasks.size();i++) {
			Task task = this.tasks.get(i);
			System.out.println(task.getTaskNumber()+"tnumber=="+task.getEarlyStartTimeArray()[0]+"est==="+task.getEarlyFinishTimeArray()[0]+"eft==="+task.getLateStartTimeArray()[0]+"lst==="+task.getLateFinishTimeArray()[0]+"lft");
		}
	}
	
	public List<Task> getTasks() {
		return tasks;
	}

	public void setTasks(List<Task> tasks) {
		this.tasks = tasks;
	}
	
	public Set<Task> getNoNextTasks() {
		return getNoNextTasks(tasks);
	}

	public Set<Task> getNoPreviousTasks() {
		return getNoPreviousTasks(tasks);
	}
	
	/*
	 * tasks 所有任务集合
	 */
	public Wbs(List<Task> tasks) {
		super();
		this.tasks = tasks;
		this.noNextTasks = new LinkedHashSet<Task>();
		this.noPreviousTasks = new LinkedHashSet<Task>();
	}
	
	public static void main(String args[]){
//		String[] l1 = {"FS"};
//		double[] d1 = {15};
//		double[] dl1 = {0};
//		Task t1 = new Task("1",l1,d1,dl1);
//		String[] l2 = {"FS"};
//		double[] d2 = {20};
//		double[] dl2 = {-5};
//		Task t2 = new Task("2",l2,d2,dl2);
//		String[] l3 = {"FS"};
//		double[] d3 = {26};
//		double[] dl3 = {0};
//		Task t3 = new Task("3",l3,d3,dl3);
//		String[] l4 = {"SS"};
//		double[] d4 = {18};
//		double[] dl4 = {10};
//		Task t4 = new Task("4",l4,d4,dl4);
//		String[] l5 = {"FS"};
//		double[] d5 = {15};
//		double[] dl5 = {0};
//		Task t5 = new Task("5",l5,d5,dl5);
//		String[] l6 = {"FS"};
//		double[] d6 = {38};
//		double[] dl6 = {0};
//		Task t6 = new Task("6",l6,d6,dl6);
//		String[] l7 = {"FS"};
//		double[] d7 = {25};
//		double[] dl7 = {-5};
//		Task t7 = new Task("7",l7,d7,dl7);
//		String[] l8 = {"FS"};
//		double[] d8 = {15};
//		double[] dl8 = {5};
//		Task t8 = new Task("8",l8,d8,dl8);
//		String[] l9 = {"SS"};
//		double[] d9 = {18};
//		double[] dl9 = {20};
//		Task t9 = new Task("9",l9,d9,dl9);
//		String[] l10 = {"FS"};
//		double[] d10 = {30};
//		double[] dl10 = {0};
//		Task t10 = new Task("10",l10,d10,dl10);
//		String[] l11 = {"FS"};
//		double[] d11 = {28};
//		double[] dl11 = {5};
//		Task t11 = new Task("11",l11,d11,dl11);
//		String[] l12 = {"FS"};
//		double[] d12 = {140};
//		double[] dl12 = {0};
//		Task t12 = new Task("12",l12,d12,dl12);
//		String[] l13 = {"FS"};
//		double[] d13 = {18};
//		double[] dl13 = {-5};
//		Task t13 = new Task("13",l13,d13,dl13);
//		String[] l14 = {"SS"};
//		double[] d14 = {20};
//		double[] dl14 = {10};
//		Task t14 = new Task("14",l14,d14,dl14);
//		String[] l15 = {"FS"};
//		double[] d15 = {15};
//		double[] dl15 = {0};
//		Task t15 = new Task("15",l15,d15,dl15);
//		String[] l16 = {"FS"};
//		double[] d16 = {33};
//		double[] dl16 = {0};
//		Task t16 = new Task("16",l16,d16,dl16);
//		String[] l17 = {"FS"};
//		double[] d17 = {8};
//		double[] dl17 = {0};
//		Task t17 = new Task("17",l17,d17,dl17);
//		String[] l18 = {"FS"};
//		double[] d18 = {15};
//		double[] dl18 = {0};
//		Task t18 = new Task("18",l18,d18,dl18);
//		String[] l19 = {"FS"};
//		double[] d19 = {17};
//		double[] dl19 = {0};
//		Task t19 = new Task("19",l19,d19,dl19);
//		String[] l20 = {"FS"};
//		double[] d20 = {25};
//		double[] dl20 = {0};
//		Task t20 = new Task("20",l20,d20,dl20);
		
//		Task t1 = new Task("1","FS",15,0);
//		Task t2 = new Task("2","FS",20,-5);
//		Task t3 = new Task("3","FS",26,0);
//		Task t4 = new Task("4","SS",18,10);
//		Task t5 = new Task("5","FS",15,0);
//		Task t6 = new Task("6","FS",38,0);
//		Task t7 = new Task("7","FS",25,-5);
//		Task t8 = new Task("8","FS",15,5);
//		Task t9 = new Task("9","SS",18,20);
//		Task t10 = new Task("10","FS",30,0);
//		Task t11 = new Task("11","FS",28,5);
//		Task t12 = new Task("12","FS",140,0);
//		Task t13 = new Task("13","FS",18,-5);
//		Task t14 = new Task("14","SS",20,10);
//		Task t15 = new Task("15","FS",15,0);
//		Task t16 = new Task("16","FS",33,0);
//		Task t17 = new Task("17","FS",8,0);
//		Task t18 = new Task("18","FS",15,0);
//		Task t19 = new Task("19","FS",17,0);
//		Task t20 = new Task("20","FS",25,0);
//		
//		List<Task> tl1 = new LinkedList<Task>();
//		List<Task> tl2 = new LinkedList<Task>();
//		List<Task> tl3 = new LinkedList<Task>();
//		List<Task> tl4 = new LinkedList<Task>();
//		List<Task> tl5 = new LinkedList<Task>();
//		List<Task> tl6 = new LinkedList<Task>();
//		List<Task> tl7 = new LinkedList<Task>();
//		List<Task> tl8 = new LinkedList<Task>();
//		List<Task> tl9 = new LinkedList<Task>();
//		List<Task> tl10 = new LinkedList<Task>();
//		List<Task> tl11 = new LinkedList<Task>();
//		List<Task> tl12 = new LinkedList<Task>();
//		List<Task> tl13 = new LinkedList<Task>();
//		List<Task> tl14 = new LinkedList<Task>();
//		
//		List<Task> tl = new LinkedList<Task>();
//		
//		tl1.add(t1);		
//		tl2.add(t2);				
//		tl3.add(t4);
//		tl4.add(t6);
//		tl5.add(t3);
//		tl5.add(t5);
//		tl6.add(t7);
//		tl6.add(t8);
//		tl6.add(t9);
//		tl7.add(t10);
//		tl8.add(t12);
//		tl9.add(t13);
//		tl10.add(t14);
//		tl11.add(t11);
//		tl11.add(t15);
//		tl12.add(t16);
//		tl13.add(t17);
//		tl14.add(t18);
//		tl14.add(t19);
//		
//		tl.add(t1);
//		tl.add(t2);
//		tl.add(t3);
//		tl.add(t4);
//		tl.add(t5);
//		tl.add(t6);
//		tl.add(t7);
//		tl.add(t8);
//		tl.add(t9);
//		tl.add(t10);
//		tl.add(t11);
//		tl.add(t12);
//		tl.add(t13);
//		tl.add(t14);
//		tl.add(t15);
//		tl.add(t16);
//		tl.add(t17);
//		tl.add(t18);
//		tl.add(t19);
//		tl.add(t20);
//		
//
//		t2.setPreviousTasks(tl1);
//		t3.setPreviousTasks(tl2);
//		t4.setPreviousTasks(tl2);
//		t5.setPreviousTasks(tl3);
//		t6.setPreviousTasks(tl5);
//		t7.setPreviousTasks(tl4);
//		t8.setPreviousTasks(tl4);
//		t9.setPreviousTasks(tl4);
//		t10.setPreviousTasks(tl6);
//		t11.setPreviousTasks(tl7);
//
//		t13.setPreviousTasks(tl8);
//		t14.setPreviousTasks(tl9);
//		t15.setPreviousTasks(tl10);
//		t16.setPreviousTasks(tl11);
//		t17.setPreviousTasks(tl12);
//		t18.setPreviousTasks(tl13);
//		t19.setPreviousTasks(tl13);
//		t20.setPreviousTasks(tl14);
//		Wbs wbs = new Wbs(tl);
//		Set<Task> task = wbs.getNoPreviousTasks();
//		for (Task task2 : task) {
//			System.out.println("taskNumber=nb="+task2.getTaskNumber());
//		}
//		Set<Task> taskt = wbs.getNoNextTasks();
//		for (Task task2 : taskt) {
//			System.out.println("taskNumber=na="+task2.getTaskNumber());
//		}
//		wbs.calculateTime();
//		wbs.calculateTimeArray();
		
		
		
//		long time1 = System.currentTimeMillis();
//		Task previous = new Task("1","FS",15,0);
//		List<Task> tls = new LinkedList<Task>();
//		tls.add(previous);
//		List<Task> tl = new LinkedList<Task>();
//		tl.add(previous);
//		for(int i = 2;i<=2000;i++){
//			Task tmp = new Task(String.valueOf(i),"FS",15,0); 			
//			tmp.setPreviousTasks(tls);
//			tls = new LinkedList<Task>();
//			tls.add(tmp);
//			tl.add(tmp);
//		}		
//		long time2 = System.currentTimeMillis();
//		System.out.println("构建用时:"+(time2-time1));
//		Wbs wbs = new Wbs(tl);
//		wbs.calculateTime();
//		long time3 = System.currentTimeMillis();
//		System.out.println("计算用时:"+(time3-time2));
	
		
		
		
		
		//数组的计算
		long time1 = System.currentTimeMillis();
		int arrayLength = 200;
		String[] logicarray = new String[arrayLength];
		double[] delaytimearray = new double[arrayLength];
		double[] durtimearray = new double[arrayLength];
		
		Random random = new Random();
        for(int i = 0; i < arrayLength;i++) {
    		//获得200以内的正整数为执行时间数组赋值
        	durtimearray[i] =Math.abs(random.nextInt())%200;
            //获得20以内的整数为浮动时间赋值
        	delaytimearray[i] =Math.abs(random.nextInt()%20);
            //获得4以内的整数为4种逻辑关系赋值
        	int index = Math.abs(random.nextInt())%4;
        	switch (index) {
			case 1:
				logicarray[i]="SS";
				break;
			case 2:
				logicarray[i]="FF";
				break;
			case 3:
				logicarray[i]="SF";
				break;
			default:
				logicarray[i]="FS";
				break;
			}
        }
        
        Task previous = new Task("task1",logicarray,delaytimearray,durtimearray);
        List<Task> tls = new LinkedList<Task>();
        tls.add(previous);
        List<Task> tl = new LinkedList<Task>();
        tl.add(previous);
        for(int i = 2;i<=5000;i++){
    		String[] logicarrayi = new String[arrayLength];
    		double[] delaytimearrayi = new double[arrayLength];
    		double[] durtimearrayi = new double[arrayLength];
    		Random randomi = new Random();
                        
            for(int ii = 0; ii < arrayLength;ii++) {
            	//获得200以内的正整数为执行时间数组赋值
            	durtimearrayi[ii] =Math.abs(randomi.nextInt())%200;
                //获得20以内的整数为浮动时间赋值
            	delaytimearrayi[ii] =Math.abs(randomi.nextInt()%20);
            	//获得4以内的整数为4种逻辑关系赋值
            	int index = Math.abs(randomi.nextInt())%4;
            	switch (index) {
    			case 1:
    				logicarrayi[ii]="SS";
    				break;
    			case 2:
    				logicarrayi[ii]="FF";
    				break;
    			case 3:
    				logicarrayi[ii]="SF";
    				break;
    			default:
    				logicarrayi[ii]="FS";
    				break;
    			}
            }
            
            Task tmp = new Task("task"+i,logicarrayi,delaytimearrayi,durtimearrayi);			
			tmp.setPreviousTasks(tls);
			tls = new LinkedList<Task>();
			int previousCount = Math.abs(randomi.nextInt())%8;
			for(int ii = 0; ii < previousCount;ii++) {
				if(ii<tl.size()){
					tls.add(tl.get(ii));
				}			
			}
			
			tl.add(tmp);
		}		
		long time2 = System.currentTimeMillis();
		System.out.println("构建用时:"+(time2-time1));
		Wbs wbs = new Wbs(tl);
		wbs.calculateTimeArray();
		long time3 = System.currentTimeMillis();
		System.out.println("计算用时:"+(time3-time2));
        
	} 
}




分享到:
评论

相关推荐

    智能车竞赛介绍(竞赛目标和赛程安排).zip

    全国大学生智能汽车竞赛自2006年起,由教育部高等教育司委托高等学校自动化类教学指导委员会举办,旨在加强学生实践、创新能力和培养团队精神的一项创意性科技竞赛。该竞赛至今已成功举办多届,吸引了众多高校学生的积极参与,此文件为智能车竞赛介绍

    集字卡v4.3.4微信公众号原版三种UI+关键字卡控制+支持强制关注.zip

    字卡v4.3.4 原版 三种UI+关键字卡控制+支持获取用户信息+支持强制关注 集卡模块从一开始的版本到助力版本再到现在的新规则版本。 集卡模块难度主要在于 如何控制各种不同的字卡组合 被粉丝集齐的数量。 如果不控制那么一定会出现超过数量的粉丝集到指定的字卡组合,造成奖品不够的混乱,如果大奖价值高的话,超过数量的粉丝集到大奖后,就造成商家的活动费用超支了。我们冥思苦想如何才能限制集到指定字卡组合的粉丝数,后我们想到了和支付宝一样的选一张关键字卡来进行规则设置的方式来进行限制,根据奖品所需的关键字卡数,设定规则就可以控制每种奖品所需字卡组合被粉丝集到的数量,规则可以在活动进行中根据需要进行修改,活动规则灵活度高。新版的集卡规则,在此次政府发布号的活动中经受了考验,集到指定字卡组合的粉丝没有超出规则限制。有了这个规则限制后,您无需盯着活动,建好活动后就无人值守让活动进行就行了,您只需要时不时来看下蹭蹭上涨的活动数据即可。 被封? 无需担心,模块内置有防封功能,支持隐藏主域名,显示炮灰域名,保护活动安全进行。 活动准备? 只需要您有一个认证服务号即可,支持订阅号借用认证服务号来做活动。如果您

    出口设备线体程序详解:PLC通讯下的V90控制与开源FB284工艺对象实战指南,出口设备线体程序详解:PLC通讯与V90控制集成,工艺对象与FB284协同工作,开源学习V90控制技能,出口设备1200

    出口设备线体程序详解:PLC通讯下的V90控制与开源FB284工艺对象实战指南,出口设备线体程序详解:PLC通讯与V90控制集成,工艺对象与FB284协同工作,开源学习V90控制技能,出口设备1200线体程序,多个plc走通讯,内部有多个v90,采用工艺对象与fb284 共同控制,功能快全部开源,能快速学会v90的控制 ,出口设备; 1200线体程序; PLC通讯; 多个V90; 工艺对象; FB284; 功能开源; V90控制。,V90工艺控制:开源功能快,快速掌握1200线体程序与PLC通讯

    基于Arduino与DAC8031的心电信号模拟器资料:心电信号与正弦波的双重输出应用方案,Arduino与DAC8031心电信号模拟器:生成心电信号与正弦波输出功能详解,基于arduino +DAC

    基于Arduino与DAC8031的心电信号模拟器资料:心电信号与正弦波的双重输出应用方案,Arduino与DAC8031心电信号模拟器:生成心电信号与正弦波输出功能详解,基于arduino +DAC8031的心电信号模拟器资料,可输出心电信号,和正弦波 ,基于Arduino;DAC8031;心电信号模拟器;输出心电信号;正弦波输出;模拟器资料,基于Arduino与DAC8031的心电信号模拟器:输出心电与正弦波

    (参考项目)MATLAB口罩识别检测.zip

    MATLAB口罩检测的基本流程 图像采集:通过摄像头或其他图像采集设备获取包含面部的图像。 图像预处理:对采集到的图像进行灰度化、去噪、直方图均衡化等预处理操作,以提高图像质量,便于后续的人脸检测和口罩检测。 人脸检测:利用Haar特征、LBP特征等经典方法或深度学习模型(如MTCNN、FaceBoxes等)在预处理后的图像中定位人脸区域。 口罩检测:在检测到的人脸区域内,进一步分析是否佩戴口罩。这可以通过检测口罩的边缘、纹理等特征,或使用已经训练好的口罩检测模型来实现。 结果输出:将检测结果以可视化方式展示,如在图像上标注人脸和口罩区域,或输出文字提示是否佩戴口罩。

    kernel-debug-devel-3.10.0-1160.119.1.el7.x64-86.rpm.tar.gz

    1、文件内容:kernel-debug-devel-3.10.0-1160.119.1.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/kernel-debug-devel-3.10.0-1160.119.1.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊

    day02供应链管理系统-补充.zip

    该文档提供了一个关于供应链管理系统开发的详细指南,重点介绍了项目安排、技术实现和框架搭建的相关内容。 文档分为以下几个关键部分: 项目安排:主要步骤包括搭建框架(1天),基础数据模块和权限管理(4天),以及应收应付和销售管理(5天)。 供应链概念:供应链系统的核心流程是通过采购商品放入仓库,并在销售时从仓库提取商品,涉及三个主要订单:采购订单、销售订单和调拨订单。 大数据的应用:介绍了数据挖掘、ETL(数据抽取)和BI(商业智能)在供应链管理中的应用。 技术实现:讲述了DAO(数据访问对象)的重用、服务层的重用、以及前端JS的继承机制、jQuery插件开发等技术细节。 系统框架搭建:包括Maven环境的配置、Web工程的创建、持久化类和映射文件的编写,以及Spring配置文件的实现。 DAO的需求和功能:供应链管理系统的各个模块都涉及分页查询、条件查询、删除、增加、修改操作等需求。 泛型的应用:通过示例说明了在Java语言中如何使用泛型来实现模块化和可扩展性。 文档非常技术导向,适合开发人员参考,用于构建供应链管理系统的架构和功能模块。

    基于四旋翼无人机的PD控制研究 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    C#与VB实现欧姆龙PLC的Fins TCP通信案例源码:调用动态链接库进行数据读写,定时器与计数器数据区的简洁读写操作示例,C#与VB实现欧姆龙PLC的Fins TCP通信案例源码:调用动态链接库进

    C#与VB实现欧姆龙PLC的Fins TCP通信案例源码:调用动态链接库进行数据读写,定时器与计数器数据区的简洁读写操作示例,C#与VB实现欧姆龙PLC的Fins TCP通信案例源码:调用动态链接库进行读写操作,涵盖定时器计数器数据区学习案例,C#欧姆龙plc Fins Tcp通信案例上位机源码,有c#和VB的Demo,c#上位机和欧姆龙plc通讯案例源码,调用动态链接库,可以实现上位机的数据连接,可以简单实现D区W区定时器计数器等数据区的读写,是一个非常好的学习案例 ,C#; 欧姆龙PLC; Fins Tcp通信; 上位机源码; 动态链接库; 数据连接; D区W区读写; 定时器计数器; 学习案例,C#实现欧姆龙PLC Fins Tcp通信上位机源码,读写数据区高效学习案例

    可调谐石墨烯超材料吸收体的FDTD仿真模拟研究报告:吸收光谱的化学势调节策略与仿真源文件解析,可调谐石墨烯超材料吸收体:化学势调节光谱的FDTD仿真模拟研究,可调谐石墨烯超材料吸收体FDTD仿真模拟

    可调谐石墨烯超材料吸收体的FDTD仿真模拟研究报告:吸收光谱的化学势调节策略与仿真源文件解析,可调谐石墨烯超材料吸收体:化学势调节光谱的FDTD仿真模拟研究,可调谐石墨烯超材料吸收体FDTD仿真模拟 【案例内容】该案例提供了一种可调谐石墨烯超材料吸收体,其吸收光谱可以通过改变施加于石墨烯的化学势来进行调节。 【案例文件】仿真源文件 ,可调谐石墨烯超材料吸收体; FDTD仿真模拟; 化学势调节; 仿真源文件,石墨烯超材料吸收体:FDTD仿真调节吸收光谱案例解析

    RBF神经网络控制仿真-第二版

    RBF神经网络控制仿真-第二版

    松下PLC与威纶通触摸屏转盘设备控制:FPWINPRO7与EBPRO智能编程与宏指令应用,松下PLC与威纶通触摸屏转盘设备控制解决方案:FPWINPRO7与EBPRO协同工作,实现多工位转盘加工与IE

    松下PLC与威纶通触摸屏转盘设备控制:FPWINPRO7与EBPRO智能编程与宏指令应用,松下PLC与威纶通触摸屏转盘设备控制解决方案:FPWINPRO7与EBPRO协同工作,实现多工位转盘加工与IEC编程模式控制,松下PLC+威纶通触摸屏的转盘设备 松下PLC工程使用程序版本为FPWINPRO7 7.6.0.0版本 威纶通HMI工程使用程序版本为EBPRO 6.07.02.410S 1.多工位转盘加工控制。 2.国际标准IEC编程模式。 3.触摸屏宏指令应用控制。 ,松下PLC; 威纶通触摸屏; 转盘设备控制; 多工位加工控制; IEC编程模式; 触摸屏宏指令应用,松下PLC与威纶通HMI联控的转盘设备控制程序解析

    基于循环神经网络(RNN)的多输入单输出预测模型(适用于时间序列预测与回归分析,需Matlab 2021及以上版本),基于循环神经网络(RNN)的多输入单输出预测模型(matlab版本2021+),真

    基于循环神经网络(RNN)的多输入单输出预测模型(适用于时间序列预测与回归分析,需Matlab 2021及以上版本),基于循环神经网络(RNN)的多输入单输出预测模型(matlab版本2021+),真实值与预测值对比,多种评价指标与线性拟合展示。,RNN预测模型做多输入单输出预测模型,直接替数据就可以用。 程序语言是matlab,需求最低版本为2021及以上。 程序可以出真实值和预测值对比图,线性拟合图,可打印多种评价指标。 PS:以下效果图为测试数据的效果图,主要目的是为了显示程序运行可以出的结果图,具体预测效果以个人的具体数据为准。 2.由于每个人的数据都是独一无二的,因此无法做到可以任何人的数据直接替就可以得到自己满意的效果。 这段程序主要是一个基于循环神经网络(RNN)的预测模型。它的应用领域可以是时间序列预测、回归分析等。下面我将对程序的运行过程进行详细解释和分析。 首先,程序开始时清空环境变量、关闭图窗、清空变量和命令行。然后,通过xlsread函数导入数据,其中'数据的输入'和'数据的输出'是两个Excel文件的文件名。 接下来,程序对数据进行归一化处理。首先使用ma

    【图像识别】手写文字识别研究 附Matlab代码+运行结果.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    旅游管理系统(基于springboot,mysql,java).zip

    旅游管理系统中的功能模块主要是实现管理员;首页、个人中心、用户管理、旅游方案管理、旅游购买管理、系统管理,用户;首页、个人中心、旅游方案管理、旅游购买管理、我的收藏管理。前台首页;首页、旅游方案、旅游资讯、个人中心、后台管理等功能。经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与旅游管理系统实现的实际需求相结合,讨论了Java开发旅游管理系统的使用。 从上面的描述中可以基本可以实现软件的功能: 1、开发实现旅游管理系统的整个系统程序;  2、管理员;首页、个人中心、用户管理、旅游方案管理、旅游购买管理、系统管理等。 3、用户:首页、个人中心、旅游方案管理、旅游购买管理、我的收藏管理。 4、前台首页:首页、旅游方案、旅游资讯、个人中心、后台管理等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流查看及回复相应操作。

    Boost二级升压光伏并网结构的Simulink建模与MPPT最大功率点追踪:基于功率反馈的扰动观察法调整电压方向研究,Boost二级升压光伏并网结构的Simulink建模与MPPT最大功率点追踪:基

    Boost二级升压光伏并网结构的Simulink建模与MPPT最大功率点追踪:基于功率反馈的扰动观察法调整电压方向研究,Boost二级升压光伏并网结构的Simulink建模与MPPT最大功率点追踪:基于功率反馈的扰动观察法调整电压方向研究,Boost二级升压光伏并网结构,Simulink建模,MPPT最大功率点追踪,扰动观察法采用功率反馈方式,若ΔP>0,说明电压调整的方向正确,可以继续按原方向进行“干扰”;若ΔP<0,说明电压调整的方向错误,需要对“干扰”的方向进行改变。 ,Boost升压;光伏并网结构;Simulink建模;MPPT最大功率点追踪;扰动观察法;功率反馈;电压调整方向。,光伏并网结构中Boost升压MPPT控制策略的Simulink建模与功率反馈扰动观察法

    基于matlab平台的图像去雾设计.zip

    运行GUI版本,可二开

    Deepseek相关参考资源文档

    Deepseek相关主题资源及行业影响

    WP Smush Pro3.16.12 一款专为 WordPress 网站设计的图像优化插件开心版.zip

    WP Smush Pro 是一款专为 WordPress 网站设计的图像优化插件。 一、主要作用 图像压缩 它能够在不影响图像质量的前提下,大幅度减小图像文件的大小。例如,对于一些高分辨率的产品图片或者风景照片,它可以通过先进的压缩算法,去除图像中多余的数据。通常 JPEG 格式的图像经过压缩后,文件大小可以减少 40% – 70% 左右。这对于网站性能优化非常关键,因为较小的图像文件可以加快网站的加载速度。 该插件支持多种图像格式的压缩,包括 JPEG、PNG 和 GIF。对于 PNG 图像,它可以在保留透明度等关键特性的同时,有效地减小文件尺寸。对于 GIF 图像,也能在一定程度上优化文件大小,减少动画 GIF 的加载时间。 懒加载 WP Smush Pro 实现了图像懒加载功能。懒加载是一种延迟加载图像的技术,当用户滚动页面到包含图像的位置时,图像才会加载。这样可以避免一次性加载大量图像,尤其是在页面内容较多且包含许多图像的情况下。例如,在一个新闻网站的长文章页面,带有大量配图,懒加载可以让用户在浏览文章开头部分时,不需要等待所有图片加载,从而提高页面的初始加载速度,同时也能

    1. Download this file: https://cdn-media.huggingface.co/frpc-gradio-0.3/frpc-windows-amd64.exe

    Could not create share link. Missing file: C:\Users\xx\.conda\envs\omni\Lib\site-packages\gradio\frpc_windows_amd64_v0.3 1. Download this file: https://cdn-media.huggingface.co/frpc-gradio-0.3/frpc_windows_amd64.exe 2. Rename the downloaded file to: frpc_windows_amd64_v0.3 3. Move the file to this location: C:\Users\xx\.conda\envs\omni\Lib\site-packages\gradio

Global site tag (gtag.js) - Google Analytics