亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gantt.cpp

?? 一個用于JSP神經網絡的演示軟件
?? CPP
字號:
#ifndef Gantt_CPP
#define Gantt_CPP

#include <iostream>
#include "Gantt.h"

GanttChart::GanttChart( int n, int m, int** machine, int** protime, double** data):res(false),loopfail(0)
{
	int i;
	this->n = n;
	this->m = m;

	matrix = new double*[n*m];
	for(i = 0; i < n*m; i++)
	{
		matrix[i] = new double[n*m+1];
	}
	if (data!=NULL)
	{
	    setMatrix(data);
	}

	this->machine = new int*[n];
	for (i = 0; i < n; i++)
	{
		(this->machine)[i] = new int[m];
	}
	if (machine != NULL)
	{
		setMachine(machine);
	}

	this->protime = new int*[n];
	for (i = 0; i < n; i++)
	{
		(this->protime)[i] = new int[m];
	}
	if (protime != NULL)
	{
		setProTime(protime);
	}

	proorder = new int*[n];
	for(i = 0; i < n; i++)
	{
		proorder[i] = new int[m];
	}	
	GetOrder();

	machorder = new int*[n];
	for (i = 0; i < n; i++)
	{
		machorder[i] = new int[m];
	}

	ganttPic = new GanttUnit*[m];
	for (i = 0; i < m; i++)
	{
		ganttPic[i] = new GanttUnit[n];
	}
	
	machstep = new int[m];
	for (i = 0; i < m; i++ )
	{
		machstep[i] = 0;
	}

	checked = new bool*[m];
	for (i = 0; i < m; i++)
	{
		checked[i] = new bool[n];
	}
}

/*
GanttChart::GanttChart(HNN* hnet)
{
	GanttChart(hnet->n, hnet->m, hnet->v, hnet->machine, hnet->protime);
}
*/

GanttChart::~GanttChart()
{
	int i;
	for (i = 0; i < n*m; i++)
	{
		delete []matrix[i];
	}
	delete []matrix;

	for (i = 0; i < n; i++)
	{
		delete []machine[i];
		delete []protime[i];
		delete []proorder[i];
		delete []machorder[i];
	}
	delete []machine;
	delete []protime;
	delete []proorder;
	delete []machorder;

	for (i = 0; i < m; i++)
	{
		delete []ganttPic[i];
	}
	delete []ganttPic;

	delete []machstep;
	
	for (i = 0; i < m; i++)
	{
		delete []checked[i];
	}
	delete []checked;

}

void GanttChart::setMatrix(double** data)
{
	for (int i = 0; i < n*m; i++)
	{
		for (int j = 0; j<n*m+1; j++)
		{
			matrix[i][j] = data[i][j];
		}
	}
}

void GanttChart::setMachine(int** machine)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			(this->machine)[i][j] = machine[i][j];
		}
	}
	
}


void GanttChart::setProTime(int** protime)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			(this->protime)[i][j] = protime[i][j];
		}
	}
}


bool GanttChart::constructGantt()
{
	int i,j;
	res = false;

	for (i = 0; i < m; i++ )
	{
		machstep[i] = 0;
	}
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			machorder[i][j] = -1;	
		}
	}
		
	//遞歸由換位矩陣構造甘特圖,
	//并自動修正可能出現的同一機器上前后任務的加工時間重疊
	//暫時忽略同一任務中前后工序的加工時間重疊情況
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			if (matrix[i*m+j][0] > 0.5)
			{
				if (machine[i][0] != j+1)	return false;
				
				int step = machstep[j];
				if (step > 0) 
				{
					int temp = step-1;
					while (temp>=0 && ganttPic[j][temp].start >= protime[i][proorder[i][j]]) temp--;
					for (int x = step-1; x > temp; x--)
					{
						ganttPic[j][x+1] = ganttPic[j][x];
						machorder[ganttPic[j][x+1].job-1][ganttPic[j][x+1].order-1]++;
					}
					
					step = temp+1;
					if (step > 0)
					{
						ganttPic[j][step].start = ganttPic[j][step-1].end;
						ganttPic[j][step].end = ganttPic[j][step-1].end +protime[i][proorder[i][j]];
					}
					else 
					{
						ganttPic[j][step].start = 0;
						ganttPic[j][step].end = protime[i][proorder[i][j]];
					}
				}
				else
				{	
					ganttPic[j][step].start = 0;
					ganttPic[j][step].end = protime[i][proorder[i][j]];
				}	
				
				ganttPic[j][step].job = i+1;
				ganttPic[j][step].order = proorder[i][j]+1;
				ganttPic[j][step].machine = j+1;
				machstep[j]++;
				machorder[i][proorder[i][j]] = step;

				findNextUnit(i*m+j, ganttPic[j][step].end);
			}
		}	
	}

	//檢查是否所有工序都被分配了機器時間
	if (checkJobNum() == false)  return false;

	//檢查在所生成的工序-機器雙搜索圖中是否有環
	if (dfscheck() == false)
	{
		if (checkJobTime() == false)	return false;		
	}
	else
	{
		//自動修正可能出現的同一任務中前后工序的加工時間重疊情況
		AdjustJobs();
	}

	res = true;
	return true;
}


void GanttChart::findNextUnit(int p, int startTime)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			if (matrix[i*m+j][p+1] > 0.5)
			{
				if (machorder[i][proorder[i][j]]!=-1) continue;
				int step = machstep[j];

			    if (step > 0 && ganttPic[j][step-1].end > startTime) 
				{
				   int temp = step-1;
				   while (temp>0 && ganttPic[j][temp].start >= startTime+protime[i][proorder[i][j]]) temp--;
				   for (int x = step-1; x > temp; x--)
				   {
						ganttPic[j][x+1] = ganttPic[j][x];
						machorder[ganttPic[j][x+1].job-1][ganttPic[j][x+1].order-1]++;
				   }
					
					step = temp+1;
					if (step > 0)
					{
						ganttPic[j][step].start = ganttPic[j][step-1].end;
						ganttPic[j][step].end = ganttPic[j][step-1].end +protime[i][proorder[i][j]];
					}
					else 
					{
						ganttPic[j][step].start = startTime;
						ganttPic[j][step].end = startTime+protime[i][proorder[i][j]];
					}
				}
				else
				{	
					ganttPic[j][step].start = startTime;
					ganttPic[j][step].end = startTime+protime[i][proorder[i][j]];
				}	

				ganttPic[j][step].job = i+1;
				ganttPic[j][step].order = proorder[i][j]+1;
				ganttPic[j][step].machine = j+1;
				machstep[j]++;
				machorder[i][proorder[i][j]] = step;
				
				findNextUnit(i*m+j, ganttPic[j][step].end);
			}
		}
	}
}

bool GanttChart::checkJobNum()
{
	//檢查是否所有工序都被分配了機器時間
	for (int i = 0; i < m; i++)
	{
		if (machstep[i] < n)	
			return false;
	}

	return true;
}

bool GanttChart::checkJobTime()
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m-1; j++)
		{
			int order = machorder[i][j];
			int mach = machine[i][j]-1;
			if (ganttPic[mach][order].end>ganttPic[mach][order+1].start)
				return false;
		}
	}
}

bool GanttChart::dfscheck()
{
	int i,j;

	//檢查在所生成的工序-機器雙搜索圖中是否有環
	//(環會造成AdjustJobs搜索的死鎖)
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			checked[i][j] = false;
		}
	}
	
	for (i = 0; i < m; i++)
	{
		if (ganttPic[i][0].order == 1)
		{
			if (checkLoops(i,0) ==  false) 
			{
				loopfail++;
				return false;
			}
		}
	}
}

bool GanttChart::checkLoops(int mach, int mastep)
{
	if (checked[mach][mastep] == true)	return false;	
	checked[mach][mastep] = true;

	if (mastep < n-1)
	{
		if (checkLoops(mach, mastep+1) == false) return false;
	}

	if (ganttPic[mach][mastep].order < m)
	{
		int job = ganttPic[mach][mastep].job-1;
		int order = ganttPic[mach][mastep].order-1;
		if (checkLoops(machine[job][order+1]-1, machorder[job][order+1]) == false)	return false;
	}

	checked[mach][mastep] = false;
	return true;
}


void GanttChart::AdjustJobs()
{
	int i, j, k;
	int num = n*m;
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			checked[i][j] = false;
		}
	}
	
	while (1)
	{
		//按照甘特圖中工序的排列順序,依次遍歷檢查
		for (i = 0; i < m; i++)
		{
			//每個機器上的第一個任務
			if (checked[i][0] == false)
			{
				int job = ganttPic[i][0].job-1;
				int order = ganttPic[i][0].order-1;

				//若本工序為任務中的第一個工序,則起始時間一定為0
				if (order == 0) 
				{
					checked[i][0] = true;
					ganttPic[i][0].start = 0;
					ganttPic[i][0].end = protime[job][0];
					num --;
				}
				//否則必須考慮任務中的工序時間重疊問題
				else 
				{	
					int preorder = machorder[job][order-1];
					int premach = machine[job][order-1]-1;
					if (checked[premach][preorder] == true)
					{	
						checked[i][0] = true;
						ganttPic[i][0].start = ganttPic[premach][preorder].end;
						ganttPic[i][0].end = ganttPic[i][0].start + protime[job][order];
						num --;
					}
				}
				if (num == 0)	
				{
					return;
				}
			}

			//每個機器上的其它任務
			for (j = 1; j < n; j++)
			{
				if (checked[i][j] == true)	continue;

				int job = ganttPic[i][j].job-1;
				int order = ganttPic[i][j].order-1;
				if (checked[i][j-1] == false) continue;

				//若本工序為任務中的第一個工序,則只用考慮避免機器上時間重疊問題
				if (order == 0)
				{
					checked[i][j] = true;
					ganttPic[i][j].start = ganttPic[i][j-1].end;
					ganttPic[i][j].end = ganttPic[i][j].start + protime[job][order];
					num --;
				}
				//否則必須同時考慮機器和任務中的工序時間重疊問題
				else 
				{
					int preorder = machorder[job][order-1];
					int premach = machine[job][order-1]-1;
					if (checked[premach][preorder] == true)
					{
						checked[i][j] = true;
						ganttPic[i][j].start = ganttPic[i][j-1].end > ganttPic[premach][preorder].end ? ganttPic[i][j-1].end : ganttPic[premach][preorder].end;
						ganttPic[i][j].end = ganttPic[i][j].start + protime[job][order];
						num --;
					}
					
				}	
				if (num == 0)	
				{
					return;
				}
			}
		}
		
	}

}

void GanttChart::drawGantt(GanttHis* his, int s)
{
	if(res == 0)	return;

	int h = 50;//圖距左端的距離
	int l = 40;//圖距上端的距離
	int unit = 20;//一個時間單位在圖中的長度
	int height = 20;//甘特圖塊的高度
	int span = 60;//兩個機器分配圖之間的距離
	int wl = 3;//文字與直線之間的距離
	int start = s*(span*m+l);
	LineHis templ;
	TextHis tempt;
	CPoint p;

	for (int i = 0; i < m; i++)
	{
		CString text;
		text.Format("M%d: ",i+1);
		p.x = 10;
		p.y = 25+i*span+start;
		tempt.pos = p;
		tempt.word = text;
		(his->texthis).push_back(tempt);

		int end = ganttPic[i][n-1].end;
		p.x = h;
		p.y = l+i*span+start;
		templ.start = p;
		p.x = h+end*unit;
		templ.end = p;
		(his->linehis).push_back(templ);

		for (int j = 0; j < n; j++)
		{
			text.Format("%d",ganttPic[i][j].start);
			p.x = h+unit*ganttPic[i][j].start-wl;
			p.y = l+i*span+wl+start;
			tempt.pos = p;
			tempt.word = text;
			(his->texthis).push_back(tempt);
			p.x = h+unit*ganttPic[i][j].start;
			p.y = l+i*span-height+start;
			templ.start = p;
			p.x = h+unit*ganttPic[i][j].start;
			p.y = l+i*span+start;
			templ.end = p;
			(his->linehis).push_back(templ);
 

			text.Format("%d%d%d",ganttPic[i][j].job,ganttPic[i][j].order,ganttPic[i][j].machine);
			p.x = h+unit*(ganttPic[i][j].start+ganttPic[i][j].end)/2-8;
			p.y = l+i*span-height-15+start;
			tempt.pos = p;
			tempt.word = text;
			(his->texthis).push_back(tempt);	 
			p.x = h+unit*ganttPic[i][j].start;
			p.y = l+i*span-height+start;
			templ.start = p;	 
			p.x = h+unit*ganttPic[i][j].end;
			p.y = l+i*span-height+start;
			templ.end = p;
			(his->linehis).push_back(templ);
			

			text.Format("%d",ganttPic[i][j].end);
			p.x = h+unit*ganttPic[i][j].end-wl;
			p.y = l+i*span+wl+start;
			tempt.pos = p;
			tempt.word = text;
			(his->texthis).push_back(tempt);	
			p.x = h+unit*ganttPic[i][j].end;
			p.y = l+i*span-height+start;
			templ.start = p;
			p.x = h+unit*ganttPic[i][j].end;
			p.y = l+i*span+start;
			templ.end = p;
			(his->linehis).push_back(templ);
		}
	}

}


void GanttChart::drawNeroOutputs(GanttHis* his)
{
	if(res == 0)	return;

	CString text;
	TextHis tempt;
	CPoint p;
	int left = 20;//起始點距左邊距離
	int top = 10;//起始點距上方距離
	int unit = 30;//列之間距離
	int span = 30;//行之間距離

	for (int i = 0; i < n*m; i++)
	{
		for (int j = 0; j<n*m+1; j++)
		{
			text.Format("%d ",(int)matrix[i][j]);
			p.x = left+j*unit;
			p.y = top+i*span;
			tempt.pos = p;
			tempt.word = text;
			(his->texthis).push_back(tempt);
		}
	}

}

void GanttChart::GetOrder()
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			proorder[i][machine[i][j]-1] = j;//j為工序數減1
		}
	}
}
	

/*
GanttUnit** GanttChart::getGuantt()
{
	
	int i, j;
	GanttUnit** g = new GanttUnit*[m];
	for (i = 0; i < m; i++)
	{
		g[i] = new GanttUnit[n];
	}

	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			g[i][j] = (this->ganttPic)[i][j];
		}
	}
	return g;
	
}
*/

int GanttChart::getMaxTime()
{
	if (res == false)  return HUGENUM;

	int maxTime = 0;
	for (int i = 0; i < m; i++)
	{
		if (ganttPic[i][n-1].end > maxTime)
		{
			maxTime = ganttPic[i][n-1].end;
		}
	}
	return maxTime;
}


bool GanttChart::isValid()
{
	return res;
}

#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成a人片国产精品| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 国产精品每日更新| 久久人人超碰精品| 欧美va亚洲va| 国产欧美综合色| 中日韩免费视频中文字幕| 国产精品久久综合| 一区二区在线观看免费| 丝袜美腿亚洲色图| 国内外精品视频| 不卡的av在线播放| 欧美日韩一区二区三区四区| 欧美一卡2卡3卡4卡| 精品国产乱码久久久久久免费 | 丝袜美腿亚洲一区| 蜜臀av一区二区| 国产综合久久久久久鬼色| 成人国产精品免费观看视频| 欧美丝袜丝nylons| 精品少妇一区二区三区在线视频| 久久久久久久免费视频了| 欧美国产精品专区| 亚洲成人高清在线| 国产一区二三区好的| 色婷婷精品大视频在线蜜桃视频| 欧美日韩中文一区| 久久综合久色欧美综合狠狠| 亚洲视频电影在线| 精品一区二区三区视频在线观看 | 亚洲精品伦理在线| 日本欧洲一区二区| kk眼镜猥琐国模调教系列一区二区| 欧美影院一区二区| 中文久久乱码一区二区| 天天色天天爱天天射综合| 成人免费三级在线| 日韩欧美高清dvd碟片| 亚洲精品亚洲人成人网| 国产在线视视频有精品| 在线日韩av片| 久久精品视频一区二区三区| 亚洲电影一级片| 国产成人av网站| 欧美精品aⅴ在线视频| 国产精品二三区| 狠狠狠色丁香婷婷综合激情| 欧美日韩中文字幕精品| 亚洲人成亚洲人成在线观看图片| 老汉av免费一区二区三区| 欧美亚洲动漫精品| 亚洲三级免费观看| 国产成人午夜精品影院观看视频| 欧美一区二区精品在线| 一区二区高清在线| 成人精品免费看| 亚洲精品在线电影| 免费在线观看成人| 日韩一区二区三区电影| 图片区小说区区亚洲影院| 97se狠狠狠综合亚洲狠狠| 国产精品视频yy9299一区| 国产精品综合二区| 欧美成人福利视频| 免费看欧美女人艹b| 欧美丰满一区二区免费视频| 亚洲综合在线视频| 91福利精品第一导航| 亚洲男同性恋视频| 91在线国产观看| 亚洲人成亚洲人成在线观看图片| 99免费精品视频| 亚洲欧美日韩电影| 91久久精品国产91性色tv| 亚洲老司机在线| 精品视频一区三区九区| 亚欧色一区w666天堂| 欧美精品一卡二卡| 青青草97国产精品免费观看无弹窗版| 91精品国产色综合久久不卡电影| 日日夜夜免费精品视频| 欧美一卡在线观看| 狠狠色综合日日| 国产欧美一区视频| 色综合一个色综合| 亚洲一区二区三区中文字幕在线| 欧美日韩成人在线一区| 蜜桃久久久久久| 国产日韩av一区| 91福利在线免费观看| 日韩国产高清在线| 国产丝袜在线精品| 99国产精品久久久久久久久久| 亚洲女与黑人做爰| 日韩一区和二区| 成人99免费视频| 午夜激情一区二区| 久久久久久一二三区| jiyouzz国产精品久久| 午夜久久久影院| 久久久久国产精品人| 色妹子一区二区| 毛片av一区二区三区| 中文av一区特黄| 欧美精品99久久久**| 成人午夜激情在线| 亚洲123区在线观看| 欧美激情综合在线| 欧美日韩国产一二三| 国产成人精品免费一区二区| 亚洲免费观看在线视频| 日韩欧美高清dvd碟片| 99re免费视频精品全部| 久久精品国产亚洲一区二区三区| 国产精品美女久久久久久2018| 69堂精品视频| 91视频在线观看免费| 国产综合久久久久影院| 亚洲一区在线观看视频| 久久久精品影视| 欧美一级欧美一级在线播放| gogo大胆日本视频一区| 国产一区二区在线观看免费| 亚洲一级片在线观看| 亚洲国产精品成人综合| 精品久久久久久无| 7777精品伊人久久久大香线蕉超级流畅| 国产成人av资源| 国产一区二区三区在线观看免费视频 | 久久精品欧美日韩| 欧美一区二区三区在线观看视频 | 91精品国产高清一区二区三区蜜臀 | 日韩高清一级片| 一区二区三区欧美在线观看| 日本一区二区高清| 欧美va亚洲va| 日韩精品一区二区三区老鸭窝| 欧美日韩在线播放三区四区| 99免费精品视频| 99国内精品久久| 99精品视频一区二区三区| 国内精品国产成人| 久久不见久久见免费视频7| 天堂蜜桃一区二区三区| 首页国产丝袜综合| 亚洲日本成人在线观看| 久久久久9999亚洲精品| 精品日产卡一卡二卡麻豆| 精品毛片乱码1区2区3区| 欧美一级免费观看| 欧美成人vps| 日韩美女一区二区三区四区| 欧美日本在线观看| 在线不卡中文字幕播放| 欧美一区二区久久| 欧美不卡一区二区三区四区| 久久尤物电影视频在线观看| 久久久一区二区三区| 国产欧美日韩不卡免费| 日韩理论片在线| 亚洲永久免费视频| 日本欧美大码aⅴ在线播放| 九色porny丨国产精品| 国产成人精品午夜视频免费| 92精品国产成人观看免费| 91极品视觉盛宴| 日韩亚洲欧美一区二区三区| 久久色在线观看| 亚洲区小说区图片区qvod| 亚洲成av人片一区二区梦乃| 日韩黄色片在线观看| 久久 天天综合| 一本在线高清不卡dvd| 欧美一区二区三区免费| 26uuu亚洲| 中文字幕在线不卡| 视频一区二区三区入口| 国精产品一区一区三区mba视频| 波波电影院一区二区三区| 欧美久久一二三四区| 国产午夜精品理论片a级大结局| 17c精品麻豆一区二区免费| 亚洲成av人影院| 国产在线精品不卡| 91久久香蕉国产日韩欧美9色| 精品少妇一区二区三区日产乱码| 国产精品久久久久三级| 婷婷夜色潮精品综合在线| 成人精品小蝌蚪| 777色狠狠一区二区三区| 中文字幕精品一区二区精品绿巨人| 亚洲一区在线观看网站| 国产成人亚洲综合a∨婷婷图片| 欧美色爱综合网| 国产精品国产三级国产专播品爱网| 一区二区三区四区在线| 国产伦精品一区二区三区免费| 91国偷自产一区二区开放时间 | va亚洲va日韩不卡在线观看| 欧美福利一区二区|