Esempio n. 1
0
        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;
            }
        }
Esempio n. 2
0
        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;
            }
        }
Esempio n. 3
0
        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;
            }
        }
Esempio n. 4
0
        /*
         * 得到最大关键路径的概率,返回该关键路径的工期
         */
        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;
            }
        }
Esempio n. 5
0
        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;
            }
        }
Esempio n. 6
0
        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;
            }
        }
Esempio n. 7
0
        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;
            }
        }
Esempio n. 8
0
        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;
            }
        }
Esempio n. 9
0
        //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;
            }
        }
Esempio n. 10
0
        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;
            }
        }
Esempio n. 11
0
        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);
        }
Esempio n. 12
0
        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;
            }
        }
Esempio n. 13
0
        /// <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;
            }
        }
Esempio n. 14
0
        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;
            }
        }