public MODEL.risk_prj_version_info getPrjVersionInfo(int sim_version_id) { MODEL.risk_prj_version_info projectVersionInfo = new MODEL.risk_prj_version_info(); projectVersionInfo.Sim_version_id = sim_version_id; string sql = "select PRI_ID,DESCRIPTION,COUNT,DURATION_MAX,SIM_STARTTIME,SIM_ENDTIME,HAVE_RESOURCE from risk_prj_version_info where sim_version_id=:simVersionId"; OracleParameter[] parameters = new OracleParameter[] { new OracleParameter(":simVersionId", OracleDbType.Int32, 11) }; parameters[0].Value = sim_version_id; try { using (OracleDataReader reader = SqlHelper.ExecuteQuery(sql, parameters)) { if (reader.Read()) { projectVersionInfo.Pri_id = Int32.Parse(reader["PRI_ID"].ToString()); projectVersionInfo.Desciption = reader["DESCRIPTION"].ToString(); projectVersionInfo.Count = Int32.Parse(reader["COUNT"].ToString()); projectVersionInfo.Duration_max = Int32.Parse(reader["DURATION_MAX"].ToString()); projectVersionInfo.Sim_starttime = reader.GetDateTime(4); projectVersionInfo.Sim_endtime = reader.GetDateTime(5); projectVersionInfo.Duration_max = Int32.Parse(reader["HAVE_RESOURCE"].ToString()); return(projectVersionInfo); } else { return(null); } } } catch (System.Exception ex) { throw ex; } }
public static List <MODEL.risk_task> getCriticalRatio(int simVersionId, int taskAutoId) { try { int taskId; if (taskAutoId == -1) { taskId = -1; } else { taskId = CommonArugment.getTask.getTask(taskAutoId).Task_id; } MODEL.risk_prj_version_info projectVersionInfo = CommonArugment.getProjectVersionInfo.getPrjVersionInfo(simVersionId); List <MODEL.risk_task> taskList = CommonArugment.getTask.getTaskList(projectVersionInfo.Pri_id); for (int i = 0; i < taskList.Count; ++i) { if (taskList[i].Task_nested_parent_id != taskId) { taskList.RemoveAt(i--); } } for (int j = 0; j < taskList.Count; ++j) { taskList[j].CriticalRatio = (double)CommonArugment.getTaskIntance.getCriticalSum(simVersionId, taskList[j].Auto_id) / projectVersionInfo.Count; } return(taskList); } catch (System.Exception ex) { throw ex; } }
public static bool dotTestFunc(int simVersionId) { int index = 2768; int scale = 100; try { List <MODEL.bar_data> barDataList = new List <MODEL.bar_data>(); MODEL.risk_prj_version_info projectVersionInfo = CommonArugment.getProjectVersionInfo.getPrjVersionInfo(simVersionId); double maxProjectTime = CommonArugment.getTaskIntance.getMaxPeriod(simVersionId, index); double minProjectTime = CommonArugment.getTaskIntance.getMinPeriod(simVersionId, index); int range = (int)Math.Ceiling((maxProjectTime - minProjectTime) / scale); for (int i = 1; i < scale; ++i) { MODEL.bar_data barData = new MODEL.bar_data(); barData.ScFrom = i * range + (int)Math.Ceiling(minProjectTime); barData.ScTo = (i + 1) * range + (int)Math.Ceiling(minProjectTime); barData.ScNum = CommonArugment.getTaskIntance.dotTest(simVersionId, barData.ScTo, barData.ScFrom, index); barDataList.Add(barData); } CommonMsg.barDataList = barDataList; return(true); } catch (System.Exception ex) { throw ex; } }
/* * 得到最大关键路径的概率,返回该关键路径的工期 */ public static double getCriticalRouteByMaxRatio(int simVersionId, int taskId, int taskLevel) { try { MODEL.risk_prj_version_info projectVersionInfo = CommonArugment.getProjectVersionInfo.getPrjVersionInfo(simVersionId); if (CommonMsg.taskList != null) { CommonMsg.taskList.Clear(); } if (CommonMsg.linkList != null) { CommonMsg.linkList.Clear(); } CommonMsg.taskList = CommonArugment.getTask.getTaskList(projectVersionInfo.Pri_id); CommonMsg.linkList = CommonArugment.getTask.getLinkList(projectVersionInfo.Pri_id); for (int j = 0; j < CommonMsg.taskList.Count; ++j) { CommonMsg.taskList[j].Value = CommonMsg.taskList[j].AverageProjectTime = CommonArugment.getTaskIntance.getSum(simVersionId, CommonMsg.taskList[j].Auto_id) / projectVersionInfo.Count; CommonMsg.taskList[j].CriticalRatio = (double)CommonArugment.getTaskIntance.getCriticalSum(simVersionId, CommonMsg.taskList[j].Auto_id) / projectVersionInfo.Count; } CommonUtils.getCriticalRoute(); CommonUtils.calInOutDegree(CommonMsg.taskList, CommonMsg.linkList); CommonUtils.calMaxSucceedSize(CommonMsg.taskList, CommonMsg.linkList); double ans = 0; for (int j = 0; j < CommonMsg.taskList.Count; ++j) { if (CommonMsg.taskList[j].Task_nested_parent_id != taskId) { CommonMsg.taskList.RemoveAt(j--); } } for (int j = 0; j < CommonMsg.taskList.Count; ++j) { if (CommonMsg.taskList[j].OutDegree == 0) { ans = CommonMsg.taskList[j].Ve; } } return(ans); } catch (Exception ex) { throw ex; } }
public static List <MODEL.risk_task> getAverageProjectTime(int simVersionId) { try { MODEL.risk_prj_version_info projectVersionInfo = CommonArugment.getProjectVersionInfo.getPrjVersionInfo(simVersionId); List <MODEL.risk_task> taskList = CommonArugment.getTask.getTaskList(projectVersionInfo.Pri_id); for (int j = 0; j < taskList.Count; ++j) { taskList[j].AverageProjectTime = CommonArugment.getTaskIntance.getSum(simVersionId, taskList[j].Auto_id) / projectVersionInfo.Count; } return(taskList); } catch (System.Exception ex) { throw ex; } }
public List <MODEL.risk_prj_version_info> getAll() { string sql = "select PRI_ID,DESCRIPTION,COUNT,DURATION_MAX,SIM_STARTTIME,SIM_ENDTIME,HAVE_RESOURCE,SIM_VERSION_ID from risk_prj_version_info"; OracleParameter parameters = null; try { using (OracleDataReader reader = SqlHelper.ExecuteQuery(sql, parameters)) { List <MODEL.risk_prj_version_info> projectVersionInfoList = new List <MODEL.risk_prj_version_info>(); while (reader.Read()) { MODEL.risk_prj_version_info projectVersionInfo = new MODEL.risk_prj_version_info(); projectVersionInfo.Pri_id = Int32.Parse(reader["PRI_ID"].ToString()); projectVersionInfo.Desciption = reader["DESCRIPTION"].ToString(); projectVersionInfo.Count = Int32.Parse(reader["COUNT"].ToString()); projectVersionInfo.Sim_version_id = Int32.Parse(reader["SIM_VERSION_ID"].ToString()); projectVersionInfo.Duration_max = Int32.Parse(reader["DURATION_MAX"].ToString()); projectVersionInfo.Sim_starttime = reader.GetDateTime(4); projectVersionInfo.Sim_endtime = reader.GetDateTime(5); projectVersionInfo.Have_resource = Int32.Parse(reader["HAVE_RESOURCE"].ToString()); sql = "select prj_name from risk_project where prj_id=:prjId"; OracleParameter parameter = new OracleParameter(":prjId", OracleDbType.Int32, 11); parameter.Value = projectVersionInfo.Pri_id; OracleDataReader prjIdReader = SqlHelper.ExecuteQuery(sql, parameter); if (prjIdReader.Read()) { projectVersionInfo.ProjectName = prjIdReader.GetString(0); } else { projectVersionInfo.ProjectName = "unable to get name"; } prjIdReader.Close(); projectVersionInfoList.Add(projectVersionInfo); } return(projectVersionInfoList); } } catch (System.Exception ex) { throw ex; } }
public bool updatePrjVersionInfo(MODEL.risk_prj_version_info projectVersionInfo) { string sql = "update risk_prj_version_info set SIM_ENDTIME=:simEndTime where SIM_VERSION_ID=:simVersionId"; OracleParameter[] parameters = new OracleParameter[] { new OracleParameter(":simEndTime", OracleDbType.Date, 7), new OracleParameter(":simVersionId", OracleDbType.Int32, 11) }; parameters[0].Value = projectVersionInfo.Sim_endtime; parameters[1].Value = projectVersionInfo.Sim_version_id; try { SqlHelper.ExecuteNonQuery(sql, parameters); return(true); } catch (System.Exception ex) { throw ex; } }
public int savePrjVersionInfo(MODEL.risk_prj_version_info projectVersionInfo) { string sql = "insert into risk_prj_version_info(sim_version_id,pri_id,description,count,DURATION_MAX,SIM_STARTTIME,SIM_ENDTIME,HAVE_RESOURCE) values(RISK_PRJ_VERSION_INFO_AUTOID.nextval,:priId,:myDescription,:myCount,0,:simStartTime,:simEndTime,:haveResource)"; OracleParameter[] parameters = new OracleParameter[] { new OracleParameter(":priId", OracleDbType.Int32, 11), new OracleParameter(":myDescription", OracleDbType.Varchar2, 255), new OracleParameter(":myCount", OracleDbType.Int32, 11), new OracleParameter(":simStartTime", OracleDbType.Date, 7), new OracleParameter(":simEndTime", OracleDbType.Date, 7), new OracleParameter(":haveResource", OracleDbType.Int32, 11), }; parameters[0].Value = projectVersionInfo.Pri_id; parameters[1].Value = projectVersionInfo.Desciption; parameters[2].Value = projectVersionInfo.Count; parameters[3].Value = projectVersionInfo.Sim_starttime; parameters[4].Value = projectVersionInfo.Sim_endtime; parameters[5].Value = projectVersionInfo.Have_resource; try { SqlHelper.ExecuteNonQuery(sql, parameters); sql = "select RISK_PRJ_VERSION_INFO_AUTOID.currval from dual"; parameters = null; using (OracleDataReader reader = SqlHelper.ExecuteQuery(sql, parameters)) { if (reader.Read()) { int id = Int32.Parse(reader.GetValue(0).ToString()); return(id); } return(-1); } } catch (System.Exception ex) { throw ex; } }
//public static bool getBarData(int simVersionId, int scale) //{ // scale = 200; // int range = 0; // double myThink = 0.2; // try // { // List<MODEL.risk_prj_instance> prjInstanceList = CommonArugment.getProjectInstance.getBySimVersion(simVersionId); // double minN1 = prjInstanceList[0].Sim_project_time; // double maxN1 = prjInstanceList[0].Sim_project_time; // double maxN2 = prjInstanceList[0].Sim_project_time; // foreach (MODEL.risk_prj_instance prjInstance in prjInstanceList) // { // if (prjInstance.Sim_project_time < minN1) // { // minN1 = Math.Floor(prjInstance.Sim_project_time); // } // if (prjInstance.Sim_project_time > maxN1) // { // maxN1 = Math.Floor(prjInstance.Sim_project_time); // } // } // maxN2 = maxN1; // while (!isSatisfCreteria(prjInstanceList, maxN2, maxN1, myThink)) // { // double res = 0; // foreach (MODEL.risk_prj_instance prjInstance in prjInstanceList) // { // if (prjInstance.Sim_project_time < maxN2 && prjInstance.Sim_project_time > res) // { // res = prjInstance.Sim_project_time; // } // } // maxN2 = res; // } // range = (int)Math.Ceiling((maxN2 - minN1) / scale); // List<MODEL.bar_data> barDataList = new List<MODEL.bar_data>(); // MODEL.bar_data barData0 = new MODEL.bar_data(); // barData0.ScFrom = 0; // barData0.ScTo = (int)Math.Ceiling(minN1); // barData0.ScNum = CommonArugment.getProjectInstance.getCount(simVersionId, barData0.ScTo, barData0.ScFrom); // barDataList.Add(barData0); // for (int i = 1; i < scale; ++i) // { // MODEL.bar_data barData = new MODEL.bar_data(); // barData.ScFrom = i * range + (int)Math.Ceiling(minN1); // barData.ScTo = (i + 1) * range + (int)Math.Ceiling(minN1); // barData.ScNum = CommonArugment.getProjectInstance.getCount(simVersionId, barData.ScTo, barData.ScFrom); // barDataList.Add(barData); // } // CommonMsg.barDataList = barDataList; // return true; // } catch (System.Exception ex) // { // throw ex; // } //} public static bool getResoueceUse(int simVersionId, int scale, int resourceId) { int range = 0; try { MODEL.risk_prj_version_info info = CommonArugment.getProjectVersionInfo.getPrjVersionInfo(simVersionId); List <MODEL.risk_prj_instance> prjInstanceList = CommonArugment.getProjectInstance.getBySimVersion(simVersionId); List <MODEL.bar_data> barDataList = new List <MODEL.bar_data>(); List <MODEL.risk_task_instance> taskList = CommonArugment.getTaskIntance.getVersionTaskInstance(info.Pri_id, simVersionId); double Avg_projecttime = 0; foreach (MODEL.risk_prj_instance prj in prjInstanceList) { Avg_projecttime += prj.Sim_project_time; } Avg_projecttime = Avg_projecttime / info.Count; double maxN1 = Avg_projecttime; double MinN1 = 0; range = (int)Math.Ceiling((maxN1 - MinN1) / scale); for (int i = 0; i <= scale; ++i) { MODEL.bar_data bar = new MODEL.bar_data(); bar.ScFrom = i * range + (int)MinN1; bar.ScTo = (i + 1) * range + (int)MinN1; if (bar.ScFrom > Avg_projecttime) { break; } foreach (MODEL.risk_task_instance task in taskList) { if (task.Starttime == -1) //概要任务跳过 { break; } if (task.Starttime >= bar.ScFrom && task.Starttime + task.Task_actual_dur_period <= bar.ScTo) //第一种 在中间 { MODEL.risk_task_resource_assignment ass = CommonArugment.getTaskResAssign.findByTaskAutoIdResId(task.Task_auto_id, resourceId); if (ass != null) { bar.Ratio += (double)ass.Assignment_amount; } } else if (task.Starttime <= bar.ScFrom && task.Starttime + task.Task_actual_dur_period > bar.ScFrom && task.Starttime + task.Task_actual_dur_period < bar.ScTo) //第二种 { MODEL.risk_task_resource_assignment ass = CommonArugment.getTaskResAssign.findByTaskAutoIdResId(task.Task_auto_id, resourceId); if (ass != null) { bar.Ratio += (double)ass.Assignment_amount / task.Task_actual_dur_period * (task.Starttime + task.Task_actual_dur_period - bar.ScFrom); } } else if (task.Starttime > bar.ScFrom && task.Starttime < bar.ScTo && task.Starttime + task.Task_actual_dur_period > bar.ScTo)//第三种 { MODEL.risk_task_resource_assignment ass = CommonArugment.getTaskResAssign.findByTaskAutoIdResId(task.Task_auto_id, resourceId); if (ass != null) { bar.Ratio += (double)ass.Assignment_amount / task.Task_actual_dur_period * (bar.ScTo - task.Starttime); } } else if (task.Starttime <= bar.ScFrom && task.Starttime + task.Task_actual_dur_period >= bar.ScTo) //第四种 { MODEL.risk_task_resource_assignment ass = CommonArugment.getTaskResAssign.findByTaskAutoIdResId(task.Task_auto_id, resourceId); if (ass != null) { bar.Ratio += (double)ass.Assignment_amount / task.Task_actual_dur_period * (bar.ScTo - bar.ScFrom); } } } barDataList.Add(bar); } foreach (MODEL.bar_data bar in barDataList) { bar.Ratio = bar.Ratio / info.Count; } CommonMsg.barDataList = barDataList; return(true); } catch (Exception ex) { throw ex; } }
public static bool getCriticalRoute(int simVersionId, int simSequence, int taskId, int taskLevel) { try { MODEL.risk_prj_version_info projectVersionInfo = CommonArugment.getProjectVersionInfo.getPrjVersionInfo(simVersionId); List <MODEL.risk_task_instance> taskIntanceList = CommonArugment.getTaskIntance.getBySeqVer(simVersionId, simSequence); List <MODEL.risk_task> taskList = null; List <MODEL.risk_link> linkList = null; if (taskLevel == 0) { if (DrawImages.calTaskAndLink(projectVersionInfo.Pri_id, taskId)) { taskList = CommonMsg.taskList; linkList = CommonMsg.linkList; } else { return(false); } for (int i = 0; i < taskList.Count; ++i) { if (taskList[i].Task_level != 0) { taskList.Remove(taskList[i]); --i; continue; } } } else { if (DrawImages.calTaskAndLink(projectVersionInfo.Pri_id, taskId)) { taskList = CommonMsg.taskList; linkList = CommonMsg.linkList; } else { return(false); } for (int i = 0; i < taskList.Count; ++i) { if (taskList[i].Task_level != taskLevel || taskList[i].Task_nested_parent_id != taskId) { taskList.Remove(taskList[i]); --i; continue; } } } foreach (MODEL.risk_task_instance taskIntance in taskIntanceList) { for (int i = 0; i < taskList.Count; ++i) { if (taskList[i].Auto_id == taskIntance.Task_auto_id) { taskList[i].Task_is_critical = taskIntance.Task_is_critical; } } } return(true); } catch (System.Exception ex) { throw ex; } }
public bool SimCriticalResource(int projectId, int times, string description, int durationMax, int have_resource) { DateTime startToSimulateTime = DateTime.Now; int versionId = -1; //establish version information MODEL.risk_prj_version_info projectVersionInfo = new MODEL.risk_prj_version_info(projectId, description, times, startToSimulateTime, startToSimulateTime, have_resource); versionId = CommonArugment.getProjectVersionInfo.savePrjVersionInfo(projectVersionInfo);//插入prj_versioninfo if (versionId == -1) { CommonMsg.errMsg = "无法保存项目的版本信息"; return(false); } projectVersionInfo.Sim_version_id = versionId; List <MODEL.risk_task> _taskList = CommonArugment.getTask.getTaskList(projectId); List <MODEL.risk_link> _linkList = CommonArugment.getTask.getLinkList(projectId); List <MODEL.risk_task> _taskStarttimeList = new List <MODEL.risk_task>(); CommonUtils.unionTaskList(_taskList, _linkList); //展开所有节点 List <MODEL.Sequence> priorityArray = calPrioritySequence(_taskList, _linkList); //资源序列 check_priorityArray(priorityArray); //检查优先级 for (int i = 0; i < times; i++) //资源仿真主干循环 { BLL.SimulationWithResources sim = new SimulationWithResources(); sim.calSimShortestPath(projectId, _taskList, _linkList, priorityArray, _taskStarttimeList);//计算最优序列 if (sim.best_seq == null) { CommonArugment.getProjectVersionInfo.deletePrjVersionInfo(versionId); return(false); } MODEL.risk_prj_instance projectInstance = new MODEL.risk_prj_instance(); projectInstance.Sim_sequence = i; projectInstance.Sim_version = versionId; projectInstance.Sim_project_cost = sim.totalMoney; projectInstance.Auto_id = CommonArugment.getProjectInstance.save(projectInstance); //插入instance foreach (MODEL.risk_prj_instance_res res in sim.total_prj_resource) //插入instance_res { res.Instance_id = projectInstance.Auto_id; CommonArugment.getProjectInstance.saveResource(res); } /********************************************************************************************** * 以上为资源特殊 * ***********************************************************************************************/ List <MODEL.risk_task> reversedTaskList = new List <MODEL.risk_task>(); CommonMsg.taskList = CommonArugment.getTask.getTaskList(projectId); List <MODEL.risk_task> taskList = new List <MODEL.risk_task>(); CommonMsg.linkList = CommonArugment.getTask.getLinkList(projectId); foreach (MODEL.risk_task task in _taskList)//taskvaule+ { double max_wait = 0; foreach (MODEL.risk_task_instance_res res in sim.total_wait_resource) { if (task.Auto_id == res.Task_auto_id && max_wait < res.Wait_time) { max_wait = res.Wait_time; } } task.Value += max_wait; foreach (MODEL.risk_task t in CommonMsg.taskList) { if (task.Auto_id == t.Auto_id) { t.Value = task.Value; } } } foreach (MODEL.risk_task task in _taskStarttimeList)//,starttime+ { foreach (MODEL.risk_task t in CommonMsg.taskList) { if (task.Auto_id == t.Auto_id) { t.StartTime = task.StartTime; } } } /********************************************************************************************** * 下面为一般 ************************************************************************************************/ foreach (MODEL.risk_task task in CommonMsg.taskList) { if (task.Task_level == 0) { taskList.Add(task); } } foreach (MODEL.risk_task task in taskList) { if (task.Task_is_summary) { task.Value = CommonUtils.calItsCriticalRoute_res(task.Task_id, versionId, i, sim.total_wait_resource); } } for (int j = 0; j < taskList.Count; ++j) { taskList[j].PreTaskId = new int[taskList.Count]; taskList[j].SucceedTaskId = new int[taskList.Count]; taskList[j].Vl = CommonMsg.maxNumber; } // cal each in/out degree of the task foreach (MODEL.risk_link link in CommonMsg.linkList) { int outDot = link.Task_pre_id; int inDot = link.Task_suc_id; bool outDone = false; bool inDone = false; foreach (MODEL.risk_task task in taskList) { if (task.Task_id == outDot) { task.SucceedTaskId[task.OutDegree++] = inDot; outDone = true; } if (task.Task_id == inDot) { task.PreTaskId[task.InDegree++] = outDot; inDone = true; } if (outDone && inDone) { break; } } } foreach (MODEL.risk_task task in taskList) { task.CalInDegree = task.InDegree; task.CalOutDegree = task.OutDegree; } foreach (MODEL.risk_task task in taskList) { reversedTaskList.Add(task.Clone() as MODEL.risk_task); } //start to topsort Stack <MODEL.risk_task> q = new Stack <MODEL.risk_task>(); foreach (MODEL.risk_task task in taskList) { task.Ve = 0; if (task.CalInDegree == 0) { q.Push(task); } } while (q.Count != 0) { MODEL.risk_task task = q.Pop(); for (int j = 0; j < task.CalOutDegree; ++j) { MODEL.risk_task succeedTask = null; foreach (MODEL.risk_task t in taskList) { if (t.Task_id == task.SucceedTaskId[j]) { succeedTask = t; } } succeedTask.CalInDegree--; if (succeedTask.CalInDegree == 0) { q.Push(succeedTask); } if (succeedTask.Ve < task.Ve + task.Value) { succeedTask.Ve = task.Ve + task.Value; } } if (q.Count == 0) { projectInstance.Sim_project_time = task.Ve + task.Value; } } foreach (MODEL.risk_task task in taskList) { for (int j = 0; j < reversedTaskList.Count; ++j) { if (reversedTaskList[j].Task_id == task.Task_id) { reversedTaskList[j].Ve = task.Ve; } } } //topsort again o(∩_∩)o for (int j = 0; j < reversedTaskList.Count; ++j) { reversedTaskList[j].Vl = CommonMsg.maxNumber; if (reversedTaskList[j].CalOutDegree == 0) { q.Push(reversedTaskList[j]); reversedTaskList[j].Vl = taskList[j].Ve; } } while (q.Count != 0) { MODEL.risk_task task = q.Pop(); for (int j = 0; j < task.CalInDegree; ++j) { MODEL.risk_task preTask = null; foreach (MODEL.risk_task t in reversedTaskList) { if (t.Task_id == task.PreTaskId[j]) { preTask = t; } } preTask.CalOutDegree--; if (preTask.CalOutDegree == 0) { q.Push(preTask); } if (preTask.Vl > task.Vl - preTask.Value) { preTask.Vl = Math.Round(task.Vl - preTask.Value, 2); } } if (q.Count == 0) { MODEL.risk_task ddd = task; } } for (int j = 0; j < taskList.Count; ++j) { MODEL.risk_task_instance taskInstance = new MODEL.risk_task_instance(taskList[j].Auto_id, taskList[j].Task_project_id, taskList[j].Value, i, versionId); taskInstance.Task_ve = taskList[j].Ve; taskInstance.Starttime = Math.Round(taskList[j].StartTime, 2); taskInstance.Task_vl = reversedTaskList[j].Vl; if (Math.Abs(taskInstance.Task_ve - taskInstance.Task_vl) <= 0.001) { taskInstance.Task_is_critical = 1; } else { taskInstance.Task_is_critical = 0; } int task_instance_id = CommonArugment.getTaskIntance.save(taskInstance); foreach (MODEL.risk_task_instance_res res in sim.total_wait_resource) { if (res.Task_auto_id == taskList[j].Auto_id) { res.Instance_id = task_instance_id; CommonArugment.getTaskIntance.saveResource(res); } } } CommonArugment.getProjectInstance.update(projectInstance); } DateTime endSimulateTime = DateTime.Now; TimeSpan ts = new TimeSpan(startToSimulateTime.Ticks).Subtract(new TimeSpan(endSimulateTime.Ticks)).Duration(); CommonMsg.simulateTime = ts.Hours + "小时 " + ts.Minutes + "分 " + ts.Seconds + "秒 " + ts.Milliseconds + "毫秒"; projectVersionInfo.Sim_endtime = endSimulateTime; CommonArugment.getProjectVersionInfo.updatePrjVersionInfo(projectVersionInfo); return(true); }
public static bool calCompressStrategy(int simVersionId, int estimatedDuration) { try { MODEL.risk_prj_version_info projectVersionInfo = CommonArugment.getProjectVersionInfo.getPrjVersionInfo(simVersionId); List <MODEL.risk_task> taskList = CommonUtils.getAllTasks(projectVersionInfo.Pri_id); List <MODEL.risk_link> linkList = CommonUtils.getAllLinks(projectVersionInfo.Pri_id); CommonUtils.calInOutDegree(taskList, linkList); //确定默认方案是平均工期 for (int j = 0; j < taskList.Count; ++j) { taskList[j].AverageProjectTime = CommonArugment.getTaskIntance.getSum(simVersionId, taskList[j].Auto_id) / projectVersionInfo.Count; } //找关键路径 bool endLoop = false; while (!endLoop) { endLoop = true; int maxIndex = 0; double maxRatio = 0; for (int i = 0; i < taskList.Count; ++i) { if (!taskList[i].Finished && taskList[i].InDegree == 0) { endLoop = false; taskList[i].Finished = true; int itsMaxSucceedSize = taskList[i].MaxSucceedSize; foreach (MODEL.risk_link link in linkList) { if (link.Task_pre_id == taskList[i].Task_id) { for (int j = 0; j < taskList.Count; ++j) { if (taskList[j].Task_id == link.Task_suc_id) { --taskList[j].InDegree; taskList[j].MaxSucceedSize += itsMaxSucceedSize; } } } } double curRatio = (double)CommonArugment.getTaskIntance.getCriticalSum(simVersionId, taskList[i].Auto_id) / projectVersionInfo.Count; if (curRatio > maxRatio) { maxRatio = curRatio; maxIndex = i; } } } taskList[maxIndex].Task_is_critical = 1; } CommonUtils.calInOutDegree(taskList, linkList); int averageDuration = Convert.ToInt32(Math.Ceiling(CommonArugment.getProjectInstance.getTotalDuration(simVersionId))); int shrinkDuration = 0; //开始压缩工期 while (shrinkDuration < averageDuration - estimatedDuration) { for (int i = 0; i < taskList.Count; ++i) { MODEL.risk_task task = taskList[i]; if (task.InDegree == 0) { int outDegree = task.OutDegree; if (outDegree > 1) //并行的点,可以压缩哦 { bool[,] searchArray = new bool[outDegree, taskList.Count]; for (int id = 0; id < outDegree; ++id) { for (int jd = 0; jd < taskList.Count; ++jd) { searchArray[id, jd] = false; } } //开始压缩关键路径上的点 foreach (MODEL.risk_link link in linkList) { if (link.Task_pre_id == task.Task_id)//应该有outDegree条link { double curDuration = 0; for (int j = 0; j < taskList.Count; ++j) { if (taskList[j].Task_id == link.Task_suc_id) { curDuration = findCompressDuration(taskList, linkList, j); // searchArray[,j]=true; --taskList[j].InDegree; if (taskList[j].Task_is_critical == 1) { } } } } } } } } } return(true); } catch (Exception ex) { throw ex; } }
/// <summary> /// 支持任务四种逻辑关系的仿真算法 /// </summary> /// <param name="projectId"></param> /// <param name="times"></param> /// <param name="description"></param> /// <param name="durationMax"></param> /// <param name="have_resource"></param> /// <returns></returns> public static bool calCriticalRoute(int projectId, int times, string description, int durationMax, int have_resource) { int versionId = -1; try { DateTime startToSimulateTime = DateTime.Now; //establish version information MODEL.risk_prj_version_info projectVersionInfo = new MODEL.risk_prj_version_info(projectId, description, times, startToSimulateTime, startToSimulateTime, have_resource); versionId = CommonArugment.getProjectVersionInfo.savePrjVersionInfo(projectVersionInfo); if (versionId == -1) { CommonMsg.errMsg = "无法保存项目的版本信息"; return(false); } projectVersionInfo.Sim_version_id = versionId; List <MODEL.risk_task> _taskList = CommonArugment.getTask.getTaskList(projectId); List <MODEL.risk_link> _linkList = CommonArugment.getTask.getLinkList(projectId); for (int i = 0; i < times; ++i) { //establish project instance MODEL.risk_prj_instance projectInstance = new MODEL.risk_prj_instance(); projectInstance.Sim_sequence = i; projectInstance.Sim_version = versionId; projectInstance.Sim_project_cost = 0; projectInstance.Auto_id = CommonArugment.getProjectInstance.save(projectInstance); List <MODEL.risk_task> taskList = new List <MODEL.risk_task>(); List <MODEL.risk_link> linkList = new List <MODEL.risk_link>(); foreach (MODEL.risk_task task in _taskList) { taskList.Add(task.Clone() as MODEL.risk_task); } foreach (MODEL.risk_link link in _linkList) { linkList.Add(link.Clone() as MODEL.risk_link); } CommonUtils.unionTaskList(taskList, linkList); foreach (MODEL.risk_task task in taskList) { if (task.Task_is_summary) { continue; } MODEL.risk_math_expression_arg expression = CommonArugment.getExpression.getExpression(task.Auto_id); if (expression.Actual_value != 0) { task.Value = expression.Actual_value; continue; } double[] values = null; try { values = (double[])CommonUtils.Deserialize(expression.Value); } catch (Exception ex) { CommonMsg.errMsg = ex.Message + "->有的任务结点还没有设置属性,无法进行仿真"; return(false); } switch (expression.Name) { case "三角分布": task.Value = Math.Round(CommonUtils.triangleDistri(values[0], values[1], values[2]), 2); break; case "正态分布": task.Value = Math.Round(CommonUtils.normDistri(values[0], values[1]), 2); break; case "beta分布": task.Value = 10; break; case "固定": task.Value = Math.Round(values[0], 2); break; default: CommonMsg.errMsg = "仿真遇到未知的分布"; return(false); } } //start to simulate foreach (MODEL.risk_link link in linkList) { if (link.Link_type == 1 || link.Link_type == 2) { MODEL.risk_task task = taskList.Find(c => c.Task_id == link.Task_suc_id); task.ExpS++; } else { MODEL.risk_task task = taskList.Find(c => c.Task_id == link.Task_suc_id); task.ExpE++; } } int stopTaskNum = 0; while (true) { if (stopTaskNum == taskList.Count) { break; } for (int j = 0; j < taskList.Count; ++j) { if (taskList[j].NowStatus == 0)//若任务还未开始 { if (taskList[j].ExpS == taskList[j].AccS) { taskList[j].NowStatus = 1; taskList[j].StartTime = projectInstance.Sim_project_time; foreach (MODEL.risk_link link in linkList)//找后继任务 { if (link.Task_pre_id == taskList[j].Task_id) { MODEL.risk_task sucTask = taskList.Find(c => c.Task_id == link.Task_suc_id); if (link.Link_type == 2) { sucTask.AccS++; } else if (link.Link_type == 4) { sucTask.AccE++; } } } } } } double minTime = 99999999; for (int j = 0; j < taskList.Count; ++j) { if (taskList[j].NowStatus == 1)//若任务正在进行中 { if (minTime > taskList[j].Value - taskList[j].Prog) { minTime = taskList[j].Value - taskList[j].Prog; } } } //将时间往前推进 projectInstance.Sim_project_time += minTime; //将所有进行中的任务时间往前推进 for (int j = 0; j < taskList.Count; ++j) { if (taskList[j].NowStatus == 1)//若任务正在进行中 { taskList[j].Prog += minTime; if (taskList[j].Value <= taskList[j].Prog) //任务做够时间了 { if (taskList[j].AccE == taskList[j].ExpE) //任务可以结束了 { taskList[j].NowStatus = 3; //任务结束 taskList[j].EndTime = projectInstance.Sim_project_time; ++stopTaskNum; foreach (MODEL.risk_link link in linkList)//找后继任务 { if (link.Task_pre_id == taskList[j].Task_id) { MODEL.risk_task sucTask = taskList.Find(c => c.Task_id == link.Task_suc_id); if (link.Link_type == 1) { sucTask.AccS++; } else if (link.Link_type == 3) { sucTask.AccE++; } } } } } } } } //从结束任务倒推找关键任务 Stack <MODEL.risk_task> q = new Stack <MODEL.risk_task>(); CommonUtils.calInOutDegree(taskList, linkList); foreach (MODEL.risk_task task in taskList) { if (task.OutDegree == 0) { task.Task_is_critical = 1; q.Push(task); } } while (q.Count != 0) { MODEL.risk_task task = q.Pop(); MODEL.risk_task criticalTask = null; for (int j = 0; j < task.InDegree; ++j) { MODEL.risk_task preTask = taskList.Find(c => c.Task_id == task.PreTaskId[j]); preTask.OutDegree--; if (preTask.OutDegree == 0) { q.Push(preTask); } if (criticalTask == null || preTask.EndTime > criticalTask.EndTime) { criticalTask = preTask; } } if (task.Task_is_critical == 1 && criticalTask != null) { criticalTask.Task_is_critical = 1; } } List <MODEL.risk_task> resultTaskList = new List <MODEL.risk_task>(); foreach (MODEL.risk_task task in _taskList) { resultTaskList.Add(task.Clone() as MODEL.risk_task); } for (int j = 0; j < resultTaskList.Count; ++j) { if (resultTaskList[j].Task_is_summary) { resultTaskList[j].Value = CommonUtils.calTotalTaskValue(taskList, resultTaskList[j]); resultTaskList[j].Task_is_critical = CommonUtils.isSummaryTaskCritical(taskList, resultTaskList[j]); } else { MODEL.risk_task task = taskList.Find(c => c.Task_id == resultTaskList[j].Task_id); resultTaskList[j].Value = task.Value; resultTaskList[j].Task_is_critical = task.Task_is_critical; } } for (int j = 0; j < resultTaskList.Count; ++j) { MODEL.risk_task_instance taskInstance = new MODEL.risk_task_instance(resultTaskList[j].Auto_id, resultTaskList[j].Task_project_id, resultTaskList[j].Value, i, versionId); taskInstance.Task_is_critical = resultTaskList[j].Task_is_critical; CommonArugment.getTaskIntance.save(taskInstance); } CommonArugment.getProjectInstance.update(projectInstance); } DateTime endSimulateTime = DateTime.Now; TimeSpan ts = new TimeSpan(startToSimulateTime.Ticks).Subtract(new TimeSpan(endSimulateTime.Ticks)).Duration(); CommonMsg.simulateTime = ts.Hours + "小时 " + ts.Minutes + "分 " + ts.Seconds + "秒 " + ts.Milliseconds + "毫秒"; projectVersionInfo.Sim_endtime = endSimulateTime; CommonArugment.getProjectVersionInfo.updatePrjVersionInfo(projectVersionInfo); return(true); } catch (System.Exception ex) { if (versionId != -1) { CommonArugment.getProjectVersionInfo.deletePrjVersionInfo(versionId); } throw ex; } }
public static bool calCriticalRouteWithOldMethod(int projectId, int times, string description, int durationMax, int have_resource) { int versionId = -1; try { DateTime startToSimulateTime = DateTime.Now; //establish version information MODEL.risk_prj_version_info projectVersionInfo = new MODEL.risk_prj_version_info(projectId, description, times, startToSimulateTime, startToSimulateTime, have_resource); versionId = CommonArugment.getProjectVersionInfo.savePrjVersionInfo(projectVersionInfo); if (versionId == -1) { CommonMsg.errMsg = "无法保存项目的版本信息"; return(false); } projectVersionInfo.Sim_version_id = versionId; for (int i = 0; i < times; ++i) { //establish project instance MODEL.risk_prj_instance projectInstance = new MODEL.risk_prj_instance(); projectInstance.Sim_sequence = i; projectInstance.Sim_version = versionId; projectInstance.Sim_project_cost = 0; projectInstance.Auto_id = CommonArugment.getProjectInstance.save(projectInstance); CommonMsg.taskList = CommonArugment.getTask.getTaskList(projectId); CommonMsg.linkList = CommonArugment.getTask.getLinkList(projectId); foreach (MODEL.risk_task task in CommonMsg.taskList) { if (task.Task_is_summary) { continue; } MODEL.risk_math_expression_arg expression = CommonArugment.getExpression.getExpression(task.Auto_id); if (expression.Actual_value != 0) { task.Value = expression.Actual_value; continue; } double[] values = null; try { values = (double[])CommonUtils.Deserialize(expression.Value); } catch (Exception ex) { CommonMsg.errMsg = ex.Message + "->有的任务结点还没有设置属性,无法进行仿真"; return(false); } switch (expression.Name) { case "三角分布": task.Value = Math.Round(CommonUtils.triangleDistri(values[0], values[1], values[2]), 2); break; case "正态分布": task.Value = Math.Round(CommonUtils.normDistri(values[0], values[1]), 2); break; case "beta分布": task.Value = 10; break; case "固定": task.Value = Math.Round(values[0], 2); break; default: CommonMsg.errMsg = "仿真遇到未知的分布"; return(false); } } //start to simulate List <MODEL.risk_task> taskList = new List <MODEL.risk_task>(); foreach (MODEL.risk_task task in CommonMsg.taskList) { if (task.Task_level == 0) { taskList.Add(task); } } foreach (MODEL.risk_task task in taskList) { if (task.Task_is_summary) { task.Value = CommonUtils.calItsCriticalRoute(task.Task_id, versionId, i); } } List <MODEL.risk_task> reversedTaskList = new List <MODEL.risk_task>(); for (int j = 0; j < taskList.Count; ++j) { taskList[j].PreTaskId = new int[taskList.Count]; taskList[j].SucceedTaskId = new int[taskList.Count]; taskList[j].Vl = CommonMsg.maxNumber; } //cal each in/out degree of the task foreach (MODEL.risk_link link in CommonMsg.linkList) { int outDot = link.Task_pre_id; int inDot = link.Task_suc_id; bool outDone = false; bool inDone = false; foreach (MODEL.risk_task task in taskList) { if (task.Task_id == outDot) { task.SucceedTaskId[task.OutDegree++] = inDot; outDone = true; } if (task.Task_id == inDot) { task.PreTaskId[task.InDegree++] = outDot; inDone = true; } if (outDone && inDone) { break; } } } foreach (MODEL.risk_task task in taskList) { task.CalInDegree = task.InDegree; task.CalOutDegree = task.OutDegree; } foreach (MODEL.risk_task task in taskList) { reversedTaskList.Add(task.Clone() as MODEL.risk_task); } //start to topsort Stack <MODEL.risk_task> q = new Stack <MODEL.risk_task>(); foreach (MODEL.risk_task task in taskList) { task.Ve = 0; if (task.CalInDegree == 0) { q.Push(task); } } while (q.Count != 0) { MODEL.risk_task task = q.Pop(); for (int j = 0; j < task.CalOutDegree; ++j) { MODEL.risk_task succeedTask = null; foreach (MODEL.risk_task t in taskList) { if (t.Task_id == task.SucceedTaskId[j]) { succeedTask = t; } } succeedTask.CalInDegree--; if (succeedTask.CalInDegree == 0) { q.Push(succeedTask); } if (succeedTask.Ve < task.Ve + task.Value) { succeedTask.Ve = task.Ve + task.Value; } } if (q.Count == 0) { projectInstance.Sim_project_time = task.Ve + task.Value; } } foreach (MODEL.risk_task task in taskList) { for (int j = 0; j < reversedTaskList.Count; ++j) { if (reversedTaskList[j].Task_id == task.Task_id) { reversedTaskList[j].Ve = task.Ve; } } } //topsort again o(∩_∩)o for (int j = 0; j < reversedTaskList.Count; ++j) { reversedTaskList[j].Vl = CommonMsg.maxNumber; if (reversedTaskList[j].CalOutDegree == 0) { q.Push(reversedTaskList[j]); reversedTaskList[j].Vl = taskList[j].Ve; } } while (q.Count != 0) { MODEL.risk_task task = q.Pop(); for (int j = 0; j < task.CalInDegree; ++j) { MODEL.risk_task preTask = null; foreach (MODEL.risk_task t in reversedTaskList) { if (t.Task_id == task.PreTaskId[j]) { preTask = t; } } preTask.CalOutDegree--; if (preTask.CalOutDegree == 0) { q.Push(preTask); } if (preTask.Vl > task.Vl - preTask.Value) { preTask.Vl = Math.Round(task.Vl - preTask.Value, 2); } } if (q.Count == 0) { MODEL.risk_task ddd = task; } } for (int j = 0; j < taskList.Count; ++j) { MODEL.risk_task_instance taskInstance = new MODEL.risk_task_instance(taskList[j].Auto_id, taskList[j].Task_project_id, taskList[j].Value, i, versionId); taskInstance.Task_ve = taskList[j].Ve; taskInstance.Task_vl = reversedTaskList[j].Vl; if (Math.Abs(taskInstance.Task_ve - taskInstance.Task_vl) <= 0.001) { taskInstance.Task_is_critical = 1; } else { taskInstance.Task_is_critical = 0; } CommonArugment.getTaskIntance.save(taskInstance); } CommonArugment.getProjectInstance.update(projectInstance); } DateTime endSimulateTime = DateTime.Now; TimeSpan ts = new TimeSpan(startToSimulateTime.Ticks).Subtract(new TimeSpan(endSimulateTime.Ticks)).Duration(); CommonMsg.simulateTime = ts.Hours + "小时 " + ts.Minutes + "分 " + ts.Seconds + "秒 " + ts.Milliseconds + "毫秒"; projectVersionInfo.Sim_endtime = endSimulateTime; CommonArugment.getProjectVersionInfo.updatePrjVersionInfo(projectVersionInfo); return(true); } catch (System.Exception ex) { if (versionId != -1) { CommonArugment.getProjectVersionInfo.deletePrjVersionInfo(versionId); } throw ex; } }