Exemplo n.º 1
0
        public int save(MODEL.risk_prj_instance projectInstance)
        {
            string sql = "insert into risk_prj_instance(AUTO_ID,SIM_VERSION,SIM_PROJECT_TIME,SIM_SEQUENCE,SIM_PROJECT_COST) values(RISK_PRJ_INSTANCE_AUTOID.nextval,:simVersion,:simPrjTime,:myCount,:simPrjCost)";

            OracleParameter[] parameters = new OracleParameter[] {
                new OracleParameter(":simVersion", OracleDbType.Int32, 11),
                new OracleParameter(":simPrjTime", OracleDbType.Double),
                new OracleParameter(":myCount", OracleDbType.Int32, 11),
                new OracleParameter(":simPrjCost", OracleDbType.Double)
            };
            parameters[0].Value = projectInstance.Sim_version;
            parameters[1].Value = projectInstance.Sim_project_time;
            parameters[2].Value = projectInstance.Sim_sequence;
            parameters[3].Value = projectInstance.Sim_project_cost;
            try
            {
                SqlHelper.ExecuteNonQuery(sql, parameters);
                sql        = "select RISK_PRJ_INSTANCE_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;
            }
        }
Exemplo n.º 2
0
        public List <MODEL.risk_prj_instance> getBySimVersion(int simVersionId)
        {
            string          sql       = "select auto_id,sim_sequence,sim_project_time from risk_prj_instance where sim_version=:simVersion";
            OracleParameter parameter = new OracleParameter(":simVersion", OracleDbType.Int32, 11);

            parameter.Value = simVersionId;
            try
            {
                List <MODEL.risk_prj_instance> prjInstanceList = new List <MODEL.risk_prj_instance>();
                using (OracleDataReader reader = SqlHelper.ExecuteQuery(sql, parameter))
                {
                    while (reader.Read())
                    {
                        MODEL.risk_prj_instance prjInstance = new MODEL.risk_prj_instance();
                        prjInstance.Auto_id          = Int32.Parse(reader["auto_id"].ToString());
                        prjInstance.Sim_sequence     = Int32.Parse(reader["sim_sequence"].ToString());
                        prjInstance.Sim_project_time = Double.Parse(reader["sim_project_time"].ToString());
                        prjInstance.Sim_version      = simVersionId;
                        prjInstanceList.Add(prjInstance);
                    }
                }
                return(prjInstanceList);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Exemplo n.º 3
0
        public bool update(MODEL.risk_prj_instance projectInstance)
        {
            string sql = "update risk_prj_instance set SIM_VERSION=:simVersion,SIM_PROJECT_TIME=:simPrjTime,SIM_SEQUENCE=:simSeq where AUTO_ID=:autoId";

            OracleParameter[] parameters = new OracleParameter[] {
                new OracleParameter(":simVersion", OracleDbType.Int32, 11),
                new OracleParameter(":simPrjTime", OracleDbType.Varchar2, 255),
                new OracleParameter(":simSeq", OracleDbType.Int32, 11),
                new OracleParameter(":autoId", OracleDbType.Double)
            };
            parameters[0].Value = projectInstance.Sim_version;
            parameters[1].Value = projectInstance.Sim_project_time;
            parameters[2].Value = projectInstance.Sim_sequence;
            parameters[3].Value = projectInstance.Auto_id;
            try
            {
                SqlHelper.ExecuteNonQuery(sql, parameters);
                return(true);
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
        }
Exemplo n.º 4
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);
        }
Exemplo n.º 5
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;
            }
        }
Exemplo n.º 6
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;
            }
        }