Example #1
0
        public bool insertTask(MODEL.risk_task task)
        {
            string sql = "insert into risk_task(auto_id,task_is_summary,task_name,task_wbs,task_id,task_level,task_project_id,task_nested_parent_id)values( risk_task_AUTOID.NEXTVAL ,:isSummary,:taskName,:taskWBS,:taskId,:taskLevel,:projectId,:taskNestedParentId)";

            OracleParameter[] parameters = new OracleParameter[] {
                new OracleParameter(":isSummary", OracleDbType.Int32, 1),
                new OracleParameter(":taskName", OracleDbType.Varchar2, 255),
                new OracleParameter(":taskWBS", OracleDbType.Varchar2, 10),
                new OracleParameter(":taskId", OracleDbType.Varchar2, 64),
                new OracleParameter(":taskLevel", OracleDbType.Int32, 11),
                new OracleParameter(":projectId", OracleDbType.Int32, 11),
                new OracleParameter(":taskNestedParentId", OracleDbType.Int32, 11)
            };
            parameters[0].Value = task.Task_is_summary;
            parameters[1].Value = task.Task_name;
            parameters[2].Value = task.Task_wbs;
            parameters[3].Value = task.Task_id;
            parameters[4].Value = task.Task_level;
            parameters[5].Value = task.Task_project_id;
            parameters[6].Value = task.Task_nested_parent_id;
            try
            {
                SqlHelper.ExecuteNonQuery(sql, parameters);
                return(true);
            } catch (System.Exception ex)
            {
                throw ex;
            }
        }
Example #2
0
        //public static bool calTaskAndLink(int projectId ,int myTaskId)
        //{
        //    if (CommonMsg.taskList != null)
        //        CommonMsg.taskList.Clear();
        //    if (CommonMsg.linkList != null)
        //        CommonMsg.linkList.Clear();
        //    List<MODEL.risk_task> taskList = CommonUtils.getAllTasks(projectId);
        //    List<MODEL.risk_link> linkList = CommonUtils.getAllLinks(projectId);
        //    List<MODEL.risk_task_instance> taskInstanceList = CommonArugment.getTaskIntance.get(projectId);
        //    bool[] taskId = new bool[taskList.Count * 2];

        //    for (int i = 0; i < taskList.Count; ++i)
        //    {
        //        MODEL.risk_task task = taskList[i];
        //        taskId[task.Task_id] = false;  //initialize
        //        if ( task.Task_nested_parent_id != myTaskId)
        //        {
        //            taskList.Remove(task);
        //            --i;
        //            continue;
        //        }
        //        taskId[task.Task_id] = true;
        //        task.OutDegree = 0;
        //        task.InDegree = 0;
        //        task.MaxSucceedSize = 0;
        //        if (!task.Task_is_summary)
        //        {
        //            try
        //            {
        //                MODEL.risk_math_expression_arg expressionArg = CommonArugment.getExpression.getExpression(task.Auto_id);
        //                if (expressionArg != null)
        //                {
        //                    task.IsDone = true;
        //                    task.ExpressionName = expressionArg.Name;
        //                    double[] values = (double[])CommonUtils.Deserialize(expressionArg.Value);
        //                    switch (task.ExpressionName)
        //                    {
        //                        case "三角分布":
        //                            task.ArgA = values[0];
        //                            task.ArgB = values[1];
        //                            task.ArgC = values[2];
        //                            break;
        //                        case "正态分布":
        //                            task.ArgA = values[0];
        //                            task.ArgB = values[1];
        //                            break;
        //                        case "beta分布":
        //                            task.ArgA = values[0];
        //                            task.ArgB = values[1];
        //                            break;
        //                        default:
        //                            task.ExpressionName = "未知分布";
        //                            break;
        //                    }
        //                    if (expressionArg.Actual_value != 0)
        //                    {
        //                        task.Value = expressionArg.Actual_value;
        //                        continue;
        //                    }
        //                }
        //                else
        //                {
        //                    task.IsDone = false;
        //                }

        //            }
        //            catch (System.Exception ex)
        //            {
        //                CommonMsg.errMsg = ex.Message + "->没有子任务的点必须标注为issummary为false";
        //                return false;
        //            }
        //        }
        //        else
        //        {
        //            task.IsDone = CommonUtils.checkIsDone(taskList, task.Task_id);
        //        }


        //    }
        //    //cal each in/out degree of the task
        //    for (int i = 0; i < linkList.Count; ++i)
        //    {
        //        MODEL.risk_link link = linkList[i];
        //        int outDot = link.Task_pre_id;
        //        int inDot = link.Task_suc_id;
        //        if (!taskId[outDot] || !taskId[inDot])
        //        {
        //            linkList.Remove(link);
        //            --i;
        //            continue;
        //        }
        //        bool outDone = false;
        //        bool inDone = false;
        //        foreach (MODEL.risk_task task in taskList)
        //        {
        //            if (task.Task_id == outDot)
        //            {
        //                ++task.OutDegree;
        //                outDone = true;
        //            }

        //            if (task.Task_id == inDot)
        //            {
        //                ++task.InDegree;
        //                inDone = true;
        //            }
        //            if (outDone && inDone)
        //                break;
        //        }
        //    }
        //    try
        //    {
        //        if (CommonUtils.calMaxSucceedSize(taskList, linkList))
        //        {
        //            CommonMsg.errMsg = "任务有环";
        //            return false;
        //        }
        //        else
        //        {
        //            CommonMsg.taskList = taskList;
        //            CommonMsg.linkList = linkList;
        //            return true;
        //        }
        //    }
        //    catch (System.Exception ex)
        //    {
        //        throw ex;
        //    }
        //}
        #endregion

        #region 设置任务属性以便仿真
        //public static bool setTaskAttribute(int auto_id, int taskPriority, double actualValue)
        //{
        //    MODEL.risk_math_expression_arg expression = new MODEL.risk_math_expression_arg();
        //    expression.Name = "正态分布";
        //    expression.Task_id = auto_id;
        //    double []value=new double[3]{0,0,0};
        //    expression.Value = CommonUtils.Serialize(value);
        //    expression.Actual_value = actualValue;
        //    try
        //    {
        //        int expressionId = CommonArugment.getExpression.saveExpression(expression);
        //        if (expressionId == -1)
        //        {
        //            CommonMsg.errMsg = "插入expression发生错误";
        //            return false;
        //        }
        //        MODEL.risk_task task = CommonArugment.getTask.getTask(auto_id);
        //        task.Task_priority = taskPriority;
        //        task.Task_expression_id = expressionId;  //这个属性没有用
        //        return CommonArugment.getTask.updateTask(task);
        //    }
        //    catch (System.Exception ex)
        //    {
        //        throw ex;
        //    }

        //}
        public static bool setTaskAttribute(int auto_id, int taskPriority, double[] value, double actualValue, string expressionName)
        {
            MODEL.risk_math_expression_arg expression = new MODEL.risk_math_expression_arg();
            expression.Name         = expressionName;
            expression.Task_id      = auto_id;
            expression.Value        = CommonUtils.Serialize(value);
            expression.Actual_value = actualValue;
            try
            {
                int expressionId = CommonArugment.getExpression.saveExpression(expression);
                if (expressionId == -1)
                {
                    CommonMsg.errMsg = "插入expression发生错误";
                    return(false);
                }
                MODEL.risk_task task = CommonArugment.getTask.getTask(auto_id);
                task.Task_priority      = taskPriority;
                task.Task_expression_id = expressionId;  //这个属性没有用
                return(CommonArugment.getTask.updateTask(task));
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
        }
Example #3
0
        public List <MODEL.risk_task> getNestedTaskList(int projectId)
        {
            List <MODEL.risk_task> taskList = new List <MODEL.risk_task>();
            string          sql             = "select * from risk_task where task_is_summary='0' and TASK_PROJECT_ID=" + projectId;
            OracleParameter p = null;

            using (OracleDataReader myReader = SqlHelper.ExecuteQuery(sql, p))
            {
                while (myReader.Read())
                {
                    MODEL.risk_task task = new MODEL.risk_task();
                    if (myReader["task_is_summary"].ToString() == "1")
                    {
                        task.Task_is_summary = true;
                    }
                    else
                    {
                        task.Task_is_summary = false;
                    }
                    task.Auto_id               = Int32.Parse(myReader["auto_id"].ToString());;
                    task.Task_name             = myReader["task_name"].ToString();
                    task.Task_wbs              = myReader["task_wbs"].ToString();
                    task.Task_id               = Int32.Parse(myReader["task_id"].ToString());
                    task.Task_level            = Int32.Parse(myReader["task_level"].ToString());
                    task.Task_project_id       = Int32.Parse(myReader["task_project_id"].ToString());
                    task.Task_nested_parent_id = Int32.Parse(myReader["task_nested_parent_id"].ToString());
                    if (myReader["task_priority"] != null && myReader["task_priority"].ToString() != "")
                    {
                        task.Task_priority = Int32.Parse(myReader["task_priority"].ToString());
                    }
                    taskList.Add(task);
                }
                return(taskList);
            }
        }
Example #4
0
        public bool updateTask(MODEL.risk_task task)
        {
            string sql = "update risk_task set task_is_summary=:isSummary,task_name=:taskName,task_wbs=:taskWBS,task_id=:taskId,task_level=:taskLevel,task_project_id=:projectId,task_nested_parent_id=:taskNestedParentId,task_expression_id=:taskExpressionId,task_priority=:taskPriority where auto_id=:autoId";

            OracleParameter[] parameters = new OracleParameter[] {
                new OracleParameter(":isSummary", OracleDbType.Int32, 1),
                new OracleParameter(":taskName", OracleDbType.Varchar2, 255),
                new OracleParameter(":taskWBS", OracleDbType.Varchar2, 10),
                new OracleParameter(":taskId", OracleDbType.Varchar2, 64),
                new OracleParameter(":taskLevel", OracleDbType.Int32, 11),
                new OracleParameter(":projectId", OracleDbType.Int32, 11),
                new OracleParameter(":taskNestedParentId", OracleDbType.Int32, 11),
                new OracleParameter(":taskExpressionId", OracleDbType.Int32, 11),
                new OracleParameter(":taskPriority", OracleDbType.Int32, 11),
                new OracleParameter(":autoId", OracleDbType.Int32, 11)
            };
            parameters[0].Value = task.Task_is_summary;
            parameters[1].Value = task.Task_name;
            parameters[2].Value = task.Task_wbs;
            parameters[3].Value = task.Task_id;
            parameters[4].Value = task.Task_level;
            parameters[5].Value = task.Task_project_id;
            parameters[6].Value = task.Task_nested_parent_id;
            parameters[7].Value = task.Task_expression_id;
            parameters[8].Value = task.Task_priority;
            parameters[9].Value = task.Auto_id;
            try
            {
                SqlHelper.ExecuteNonQuery(sql, parameters);
                return(true);
            } catch (System.Exception ex)
            {
                throw ex;
            }
        }
Example #5
0
        public static int calTopsort(List <MODEL.risk_task> taskList, List <MODEL.risk_link> linkList, List <MODEL.Sequence> priorityArray, MODEL.Sequence _curSeq)
        {
            List <MODEL.risk_task> callBackList = new List <MODEL.risk_task>();

            for (int i = 0; i < taskList.Count; ++i)
            {
                if (taskList[i].InDegree == 0 && !taskList[i].Finished)
                {
                    callBackList.Add(taskList[i]);
                }
            }

            for (int i = 0; i < callBackList.Count; ++i)
            {
                MODEL.risk_task myTask = callBackList[i];
                MODEL.Sequence  curSeq = new MODEL.Sequence(_curSeq);
                curSeq.Array.Add(myTask.Task_id);
                curSeq.Array_prio.Add(myTask.Task_priority);
                myTask.Finished = true;
                for (int j = 0; j < myTask.OutDegree; ++j)
                {
                    MODEL.risk_task succeedTask = null;
                    foreach (MODEL.risk_task t in taskList)
                    {
                        if (t.Task_id == myTask.SucceedTaskId[j])
                        {
                            succeedTask = t;
                        }
                    }
                    succeedTask.InDegree--;
                }
                calTopsort(taskList, linkList, priorityArray, curSeq);
                myTask.Finished = false;
                for (int j = 0; j < myTask.OutDegree; ++j)
                {
                    MODEL.risk_task succeedTask = null;
                    foreach (MODEL.risk_task t in taskList)
                    {
                        if (t.Task_id == myTask.SucceedTaskId[j])
                        {
                            succeedTask = t;
                        }
                    }
                    succeedTask.InDegree++;
                }
            }
            if (getTasklistIndegree(taskList) == 0 && _curSeq.Array.Count == taskList.Count)
            {
                priorityArray.Add(_curSeq);
            }
            return(1);
        }
Example #6
0
 public static bool updateTask(MODEL.risk_task task)
 {
     try
     {
         if (CommonArugment.getTask.updateTask(task))
         {
             return(true);
         }
         return(false);
     } catch (System.Exception ex)
     {
         throw ex;
     }
 }
Example #7
0
        public MODEL.risk_task getTask(int auto_id)
        {
            MODEL.risk_task myTask    = new MODEL.risk_task();
            string          sql       = "select * from risk_task where auto_id=:autoId";
            OracleParameter parameter = new OracleParameter(":autoId", OracleDbType.Int32, 11);

            parameter.Value = auto_id;
            try
            {
                using (OracleDataReader reader = SqlHelper.ExecuteQuery(sql, parameter))
                {
                    if (reader.Read())
                    {
                        myTask.Auto_id = auto_id;
                        if (reader["task_is_summary"].ToString() == "1")
                        {
                            myTask.Task_is_summary = true;
                        }
                        else
                        {
                            myTask.Task_is_summary = false;
                        }
                        myTask.Task_name             = reader["task_name"].ToString();
                        myTask.Task_wbs              = reader["task_wbs"].ToString();
                        myTask.Task_id               = Int32.Parse(reader["task_id"].ToString());
                        myTask.Task_level            = Int32.Parse(reader["task_level"].ToString());
                        myTask.Task_project_id       = Int32.Parse(reader["task_project_id"].ToString());
                        myTask.Task_nested_parent_id = Int32.Parse(reader["task_nested_parent_id"].ToString());
                        if (reader["task_priority"] != null && reader["task_priority"].ToString() != "")
                        {
                            myTask.Task_priority = Int32.Parse(reader["task_priority"].ToString());
                        }
                        return(myTask);
                    }
                    return(null);
                }
            } catch (System.Exception ex)
            {
                throw ex;
            }
        }
Example #8
0
        public List <MODEL.risk_task> getWaitTaskList(int VersionId)
        {
            List <MODEL.risk_task> taskList = new List <MODEL.risk_task>();
            string sql = "SELECT * FROM RISK_TASK where AUTO_ID in (SELECT distinct Task_AUTO_ID from RISK_TASK_INSTANCE where SIM_VERSION = :VersionId and AUTO_ID in (SELECT TASK_INSTANCE_ID FROM RISK_TASK_INSTANCE_RES))";

            OracleParameter[] parameters = new OracleParameter[] {
                new OracleParameter(":VersionId", OracleDbType.Int32, 11)
            };
            parameters[0].Value = VersionId;
            using (OracleDataReader myReader = SqlHelper.ExecuteQuery(sql, parameters))
            {
                while (myReader.Read())
                {
                    MODEL.risk_task task = new MODEL.risk_task();
                    task.Auto_id   = Int32.Parse(myReader["auto_id"].ToString());;
                    task.Task_name = myReader["task_name"].ToString();
                    taskList.Add(task);
                }
                return(taskList);
            }
        }
Example #9
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;
            }
        }
Example #10
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;
            }
        }
Example #11
0
        public static void getAllTaskAndLink(int projectId)
        {
            if (CommonMsg.taskList != null)
            {
                CommonMsg.taskList.Clear();
            }
            if (CommonMsg.linkList != null)
            {
                CommonMsg.linkList.Clear();
            }
            List <MODEL.risk_task> taskList = CommonUtils.getAllTasks(projectId);
            List <MODEL.risk_link> linkList = CommonUtils.getAllLinks(projectId);

            bool[] taskId = new bool[taskList.Count * 2];

            for (int i = 0; i < taskList.Count; ++i)
            {
                MODEL.risk_task task = taskList[i];
                taskId[task.Task_id] = true;
                task.OutDegree       = 0;
                task.InDegree        = 0;
                task.MaxSucceedSize  = 0;
                if (!task.Task_is_summary)
                {
                    try
                    {
                        MODEL.risk_math_expression_arg expressionArg = CommonArugment.getExpression.getExpression(task.Auto_id);
                        if (expressionArg != null)
                        {
                            task.IsDone         = true;
                            task.ExpressionName = expressionArg.Name;
                            double[] values = (double[])CommonUtils.Deserialize(expressionArg.Value);
                            switch (task.ExpressionName)
                            {
                            case "三角分布":
                                task.ArgA = values[0];
                                task.ArgB = values[1];
                                task.ArgC = values[2];
                                break;

                            case "Beta分布":
                                task.ArgA = values[0];
                                task.ArgB = values[1];
                                break;

                            case "正态分布":
                                task.ArgA = values[0];
                                task.ArgB = values[1];
                                break;

                            case "固定":
                                task.ArgA = values[0];
                                break;

                            default:
                                task.ExpressionName = "未知分布";
                                break;
                            }
                            if (expressionArg.Actual_value != 0)
                            {
                                task.Value = expressionArg.Actual_value;
                                continue;
                            }
                        }
                        else
                        {
                            task.IsDone = false;
                        }
                    }
                    catch (System.Exception ex)
                    {
                        throw ex;
                    }
                }
                else
                {
                    task.IsDone = CommonUtils.checkIsDone(taskList, task.Task_id);
                }
            }

            CommonMsg.taskList = taskList;
            CommonMsg.linkList = linkList;
        }
Example #12
0
        public static List <MODEL.Sequence> calPriority(List <MODEL.risk_task> _taskList, List <MODEL.risk_link> linkList, int parentTaskId)
        {
            List <MODEL.Sequence> priorityArray = new List <MODEL.Sequence>();

            try
            {
                List <MODEL.risk_task> taskList = new List <MODEL.risk_task>();
                foreach (MODEL.risk_task task in _taskList)
                {
                    if (task.Task_nested_parent_id == parentTaskId)
                    {
                        taskList.Add(task);
                    }
                }
                for (int j = 0; j < taskList.Count; ++j)
                {
                    taskList[j].PreTaskId     = new int[taskList.Count];
                    taskList[j].SucceedTaskId = new int[taskList.Count];
                }

                //      cal each in/out degree of the task
                foreach (MODEL.risk_link link in 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;
                        }
                    }
                }
                MODEL.Sequence         _curSeq      = new MODEL.Sequence();
                List <MODEL.risk_task> callBackList = new List <MODEL.risk_task>();
                for (int i = 0; i < taskList.Count; ++i)
                {
                    if (taskList[i].InDegree == 0 && !taskList[i].Finished)
                    {
                        callBackList.Add(taskList[i]);
                    }
                }
                for (int i = 0; i < callBackList.Count; ++i)
                {
                    MODEL.risk_task myTask = callBackList[i];
                    MODEL.Sequence  curSeq = new MODEL.Sequence(_curSeq);
                    curSeq.Array.Add(myTask.Task_id);
                    myTask.Finished = true;
                    for (int j = 0; j < myTask.OutDegree; ++j)
                    {
                        MODEL.risk_task succeedTask = null;
                        foreach (MODEL.risk_task t in taskList)
                        {
                            if (t.Task_id == myTask.SucceedTaskId[j])
                            {
                                succeedTask = t;
                            }
                        }
                        succeedTask.InDegree--;
                    }
                    calTopsort(taskList, linkList, priorityArray, curSeq);
                    myTask.Finished = false;
                    for (int j = 0; j < myTask.OutDegree; ++j)
                    {
                        MODEL.risk_task succeedTask = null;
                        foreach (MODEL.risk_task t in taskList)
                        {
                            if (t.Task_id == myTask.SucceedTaskId[j])
                            {
                                succeedTask = t;
                            }
                        }
                        succeedTask.InDegree++;
                    }
                }
                for (int i = 0; i < callBackList.Count; ++i)
                {
                    callBackList[i].Finished = true;
                }

                foreach (MODEL.Sequence seq in priorityArray)
                {
                    foreach (int a in seq.Array)
                    {
                        Console.Write(a + "->");
                    }
                    Console.WriteLine("end");
                }
                Console.Read();
                return(priorityArray);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Example #13
0
        private static void readXML(XmlReader xml)
        {
            int         parentId          = 0;
            int         taskLevel         = 0;
            int         curParentTId      = -1;
            int         possibleParentTId = -1;
            Stack <int> parentTaskId      = new Stack <int>();;

            parentTaskId.Push(-1);
            while (xml.Read())
            {
                if (xml.NodeType == XmlNodeType.Element)
                {
                    if (xml.Name == "sub-tasks")
                    {
                        ++taskLevel;
                    }
                    if (xml.Name == "link")
                    {
                        MODEL.risk_link link = new MODEL.risk_link();
                        link.Delay_days = Int32.Parse(xml.GetAttribute("delay"));
                        switch (xml.GetAttribute("type"))
                        {
                        case "FS":
                            link.Link_type = 0;
                            break;

                        default:
                            link.Link_type = 0;
                            break;
                        }
                        link.Task_suc_id = Int32.Parse(xml.GetAttribute("taskId"));
                        link.Task_pre_id = parentId;
                        link.Prj_id      = projectId;
                        linkList.Add(link);
                    }
                    if (xml.Name == "task" || xml.Name == "start-task" || xml.Name == "end-task")
                    {
                        if (xml.Name == "start-task")
                        {
                            if (possibleParentTId != -1)
                            {
                                parentTaskId.Push(possibleParentTId);
                            }
                            possibleParentTId = Int32.Parse(xml.GetAttribute("id"));
                        }
                        if (xml.Name == "task")
                        {
                            possibleParentTId = Int32.Parse(xml.GetAttribute("id"));
                        }
                        curParentTId = parentTaskId.Peek();
                        MODEL.risk_task task = new MODEL.risk_task();
                        if (xml.GetAttribute("isSummary") == null)
                        {
                            task.Task_is_summary = false;
                        }
                        else
                        {
                            task.Task_is_summary = true;
                        }
                        task.Task_name             = xml.GetAttribute("name");
                        task.Task_wbs              = xml.GetAttribute("wbs");
                        task.Task_id               = Int32.Parse(xml.GetAttribute("id"));
                        task.Task_level            = taskLevel;
                        task.Task_project_id       = projectId;
                        task.Task_nested_parent_id = curParentTId;
                        taskList.Add(task);
                        parentId = task.Task_id;
                    }
                }
                else if (xml.NodeType == XmlNodeType.EndElement)
                {
                    if (xml.Name == "sub-tasks")
                    {
                        --taskLevel;
                    }
                    if (xml.Name == "end-task")
                    {
                        possibleParentTId = parentTaskId.Pop();
                    }
                }
            }
        }
Example #14
0
        public static List <MODEL.Sequence> calPrioritySequence(List <MODEL.risk_task> _taskList, List <MODEL.risk_link> linkList)
        {
            List <MODEL.Sequence> priorityArray = new List <MODEL.Sequence>();

            try
            {
                List <MODEL.risk_task> taskList = new List <MODEL.risk_task>();
                foreach (MODEL.risk_task task in _taskList)
                {
                    taskList.Add(task.Clone() as MODEL.risk_task);
                }

                MODEL.Sequence         _curSeq      = new MODEL.Sequence();
                List <MODEL.risk_task> callBackList = new List <MODEL.risk_task>();
                for (int i = 0; i < taskList.Count; ++i)
                {
                    if (taskList[i].InDegree == 0 && !taskList[i].Finished)
                    {
                        callBackList.Add(taskList[i]);
                    }
                }
                for (int i = 0; i < callBackList.Count; ++i)
                {
                    MODEL.risk_task myTask = callBackList[i];
                    MODEL.Sequence  curSeq = new MODEL.Sequence(_curSeq);
                    curSeq.Array.Add(myTask.Task_id);
                    curSeq.Array_prio.Add(myTask.Task_priority);
                    myTask.Finished = true;
                    for (int j = 0; j < myTask.OutDegree; ++j)
                    {
                        MODEL.risk_task succeedTask = null;
                        foreach (MODEL.risk_task t in taskList)
                        {
                            if (t.Task_id == myTask.SucceedTaskId[j])
                            {
                                succeedTask = t;
                            }
                        }
                        succeedTask.InDegree--;
                    }
                    calTopsort(taskList, linkList, priorityArray, curSeq);
                    myTask.Finished = false;
                    for (int j = 0; j < myTask.OutDegree; ++j)
                    {
                        MODEL.risk_task succeedTask = null;
                        foreach (MODEL.risk_task t in taskList)
                        {
                            if (t.Task_id == myTask.SucceedTaskId[j])
                            {
                                succeedTask = t;
                            }
                        }
                        succeedTask.InDegree++;
                    }
                }
                for (int i = 0; i < callBackList.Count; ++i)
                {
                    callBackList[i].Finished = true;
                }

                return(priorityArray);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Example #15
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);
        }
Example #16
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;
            }
        }
Example #17
0
        /*
         * 没有考虑优先级
         * 节点全部都展开
         * 返回的是最短的时间,等待时间,最优序列
         * status: 0->等待状态 1->就绪状态 -1->完毕状态  2->有资源等待
         */

        public bool calSimShortestPath(int projectId, List <MODEL.risk_task> _taskList, List <MODEL.risk_link> _linkList, List <MODEL.Sequence> priorityArray, List <MODEL.risk_task> _taskStarttimeList)
        {
            if (!CalTaskValue(_taskList))//计算TaskValue
            {
                return(false);
            }

            int xuanxuan = 0;

            foreach (MODEL.Sequence seq in priorityArray)//计算最优序列
            {
                xuanxuan++;
                //保存项目资源信息
                List <MODEL.risk_project_res_assignment>   prjResAssignList  = CommonArugment.getPrjResAssign.getPrjResAssignListByPrjId(projectId);
                List <MODEL.risk_task_resource_assignment> taskResAssignList = CommonArugment.getTaskResAssign.getTaskResAssignListByPrjId(projectId);
                double Money    = 0;
                double Duration = 0;
                bool   canWork  = true;
                int[]  pArray   = seq.Array.ToArray();
                List <MODEL.risk_task> taskList          = new List <MODEL.risk_task>();
                List <MODEL.risk_task> taskStarttimeList = new List <MODEL.risk_task>();
                List <MODEL.risk_task_instance_res> task_wait_resource = new List <MODEL.risk_task_instance_res>();
                List <MODEL.risk_prj_instance_res>  prj_resource       = new List <MODEL.risk_prj_instance_res>();
                foreach (MODEL.risk_task task in _taskList)
                {
                    taskList.Add(task.Clone() as MODEL.risk_task);
                    taskStarttimeList.Add(task.Clone() as MODEL.risk_task);
                }

                //寻找入度为0的点
                List <MODEL.risk_task> taskReadyQueue = new List <MODEL.risk_task>();
                List <MODEL.risk_task> callBackList   = new List <MODEL.risk_task>();
                while (canWork)
                {
                    for (int i = 0; i < taskList.Count; ++i)//添加入为0的点
                    {
                        if (taskList[i].InDegree == 0 && taskList[i].Status == 0)
                        {
                            callBackList.Add(taskList[i]);
                        }
                    }
                    for (int i = 0; i < pArray.Length; ++i) //按照顺序分配资源
                    {
                        for (int j = 0; j < callBackList.Count; ++j)
                        {
                            if (callBackList[j].Task_id != pArray[i])
                            {
                                continue;
                            }
                            MODEL.risk_task myTask = callBackList[j];
                            //给myTask分配资源,status=1
                            if (CommonUtils.allocateResource(projectId, myTask, task_wait_resource))
                            {
                                myTask.Status = 1;//资源够了,变成就绪态
                                taskReadyQueue.Add(myTask);
                                for (int k = 0; k < myTask.OutDegree; k++)
                                {
                                    foreach (MODEL.risk_task t in taskList)
                                    {
                                        if (t.Task_id == myTask.SucceedTaskId[k])
                                        {
                                            t.InDegree--;
                                        }
                                    }
                                }
                                callBackList.Remove(myTask);
                            }
                        }
                    }
                    if (taskReadyQueue.Count != 0)//至少有一个是能run
                    {
                        //找到value最小的那个一个
                        double minValue = CommonMsg.maxNumber;

                        foreach (MODEL.risk_task task in taskReadyQueue)
                        {
                            if (task.StartTime == -1)
                            {
                                task.StartTime = Duration;
                                foreach (MODEL.risk_task t in taskStarttimeList)
                                {
                                    if (task.Auto_id == t.Auto_id)
                                    {
                                        t.StartTime = task.StartTime;
                                    }
                                }
                            }

                            if (task.Value < minValue)
                            {
                                minValue = task.Value;
                            }
                        }
                        Duration += minValue;
                        foreach (MODEL.risk_task wait_task in callBackList)//记录等待时间
                        {
                            foreach (MODEL.risk_task_instance_res res in task_wait_resource)
                            {
                                if (wait_task.Auto_id == res.Task_auto_id)
                                {
                                    res.Wait_time += minValue;
                                }
                            }
                        }
                        for (int i = 0; i < taskReadyQueue.Count; ++i)
                        {
                            if (taskReadyQueue[i].Value <= minValue)                                     //能执行完的执行
                            {
                                Money += CommonUtils.getMoney(taskReadyQueue[i]);                        //算钱
                                CommonUtils.recycleResource(projectId, taskReadyQueue[i], prj_resource); //回收
                                taskReadyQueue[i].Status = -1;
                                taskReadyQueue.RemoveAt(i--);                                            //去除
                            }
                            else //执行一部分
                            {
                                taskReadyQueue[i].Value -= minValue;
                            }
                        }
                    }
                    else if (callBackList.Count == 0)//完成
                    {
                        if (totoalDuration > Duration)
                        {
                            totalMoney     = Money;
                            totoalDuration = Duration;
                            best_seq       = seq;
                            _taskStarttimeList.Clear();
                            foreach (MODEL.risk_task t in taskStarttimeList)
                            {
                                _taskStarttimeList.Add(t);
                            }

                            total_wait_resource.Clear();
                            foreach (MODEL.risk_task_instance_res res in task_wait_resource)
                            {
                                total_wait_resource.Add(res);
                            }

                            total_prj_resource.Clear();
                            foreach (MODEL.risk_prj_instance_res res in prj_resource)
                            {
                                total_prj_resource.Add(res);
                            }
                        }
                        //还原项目资源信息
                        foreach (MODEL.risk_project_res_assignment prjResAssign in prjResAssignList)
                        {
                            CommonArugment.getPrjResAssign.updateByPrjIdResId(prjResAssign);
                        }
                        canWork = false;
                    }
                    else//失败,资源不足,卡住了
                    {
                        canWork = false;
                        //还原项目资源信息
                        foreach (MODEL.risk_project_res_assignment prjResAssign in prjResAssignList)
                        {
                            CommonArugment.getPrjResAssign.updateByPrjIdResId(prjResAssign);
                        }
                        foreach (MODEL.risk_task_resource_assignment taskResAssgin in taskResAssignList)
                        {
                            CommonArugment.getTaskResAssign.updateByTaskAutoIdResId(taskResAssgin);
                        }
                        foreach (MODEL.risk_task_instance_res res in task_wait_resource)
                        {
                            if (callBackList[0].Auto_id == res.Task_auto_id)
                            {
                                CommonMsg.errMsg = "节点 " + callBackList[0].Task_name + " 所需资源 " + CommonArugment.getResources.findResById(res.Resource_id).Resource_name + " 无法满足,请增加项目资源";
                                return(false);
                            }
                        }
                    }
                }
            }
            return(true);
        }
Example #18
0
        public static void ShrinkHours(int simVersionId, int taskId, int taskLevel, double targetDuration)
        {
            double currentDuration          = BLL.GetResults.getCriticalRouteByMaxRatio(simVersionId, taskId, taskLevel);
            List <MODEL.risk_task> taskList = BLL.CommonMsg.taskList;
            List <MODEL.risk_link> linkList = BLL.CommonMsg.linkList;
            double ansRatio = targetDuration / currentDuration;

            //cal each in/out degree of the task
            for (int j = 0; j < taskList.Count; ++j)
            {
                taskList[j].Finished      = false;
                taskList[j].PreTaskId     = new int[taskList.Count];
                taskList[j].SucceedTaskId = new int[taskList.Count];
                taskList[j].Vl            = CommonMsg.maxNumber;
            }
            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;
                    }
                }
            }

            Stack <MODEL.risk_task> q = new Stack <MODEL.risk_task>();

            foreach (MODEL.risk_task task in taskList)
            {
                if (task.InDegree == 0 && task.Task_level == -1)
                {
                    q.Push(task);
                }
            }
            while (q.Count != 0)
            {
                MODEL.risk_task task = q.Pop();
                if (!task.Finished)//如果还没有压过
                {
                    task.Value   *= ansRatio;
                    task.Finished = true;
                }
                if (task.Task_is_summary)
                {
                    //是不是taskId哦???
                    ShrinkSummaryTask(task.Task_id, taskList, linkList, ansRatio);
                }
                double criticalDuration = 0;
                //先找关键路径
                for (int j = 0; j < task.OutDegree; ++j)
                {
                    foreach (MODEL.risk_task t in taskList)
                    {
                        if (t.Task_id == task.SucceedTaskId[j] && t.Task_is_critical == 1)
                        {
                            criticalDuration = t.Value;
                        }
                    }
                }
                //再压缩
                for (int j = 0; j < task.OutDegree; ++j)
                {
                    MODEL.risk_task succeedTask = null;
                    foreach (MODEL.risk_task t in taskList)
                    {
                        if (t.Task_id == task.SucceedTaskId[j])
                        {
                            succeedTask = t;
                        }
                    }
                    succeedTask.InDegree--;
                    if (succeedTask.InDegree == 0)
                    {
                        q.Push(succeedTask);
                    }
                    if (!succeedTask.Finished)
                    {
                        succeedTask.Finished = true;
                        if (succeedTask.Task_is_critical == 1)
                        {
                            succeedTask.Value *= ansRatio;
                        }
                        else
                        {
                            if (succeedTask.Value > criticalDuration * ansRatio)
                            {
                                succeedTask.Value = criticalDuration * ansRatio;
                            }
                        }
                        if (succeedTask.Task_is_summary)
                        {
                            ShrinkSummaryTask(task.Task_id, taskList, linkList, ansRatio);
                        }
                    }
                }
            }
        }
Example #19
0
        private static void ShrinkSummaryTask(int parentId, List <MODEL.risk_task> taskList, List <MODEL.risk_link> linkList, double ansRatio)
        {
            Stack <MODEL.risk_task> q = new Stack <MODEL.risk_task>();

            foreach (MODEL.risk_task task in taskList)
            {
                if (task.InDegree == 0 && task.Task_nested_parent_id == parentId)
                {
                    q.Push(task);
                }
            }
            while (q.Count != 0)
            {
                MODEL.risk_task task = q.Pop();
                if (!task.Finished)//如果还没有压过
                {
                    task.Value   *= ansRatio;
                    task.Finished = true;
                }
                if (task.Task_is_summary)
                {
                    //是不是taskId哦???
                    ShrinkSummaryTask(task.Task_id, taskList, linkList, ansRatio);
                }
                double criticalDuration = 0;
                //先找关键路径
                for (int j = 0; j < task.OutDegree; ++j)
                {
                    foreach (MODEL.risk_task t in taskList)
                    {
                        if (t.Task_id == task.SucceedTaskId[j] && t.Task_is_critical == 1)
                        {
                            criticalDuration = t.Value;
                        }
                    }
                }
                //再压缩
                for (int j = 0; j < task.OutDegree; ++j)
                {
                    MODEL.risk_task succeedTask = null;
                    foreach (MODEL.risk_task t in taskList)
                    {
                        if (t.Task_id == task.SucceedTaskId[j])
                        {
                            succeedTask = t;
                        }
                    }
                    succeedTask.InDegree--;
                    if (succeedTask.InDegree == 0)
                    {
                        q.Push(succeedTask);
                    }
                    if (!succeedTask.Finished)
                    {
                        succeedTask.Finished = true;
                        if (succeedTask.Task_is_critical == 1)
                        {
                            succeedTask.Value *= ansRatio;
                        }
                        else
                        {
                            if (succeedTask.Value > criticalDuration * ansRatio)
                            {
                                succeedTask.Value = criticalDuration * ansRatio;
                            }
                        }
                        if (succeedTask.Task_is_summary)
                        {
                            ShrinkSummaryTask(task.Task_id, taskList, linkList, ansRatio);
                        }
                    }
                }
            }
        }
Example #20
0
        public static bool calTaskAndLink(int projectId, int parentTaskId)
        {
            if (CommonMsg.taskList != null)
            {
                CommonMsg.taskList.Clear();
            }
            if (CommonMsg.linkList != null)
            {
                CommonMsg.linkList.Clear();
            }
            List <MODEL.risk_task> taskList = CommonUtils.getAllTasks(projectId);
            List <MODEL.risk_link> linkList = CommonUtils.getAllLinks(projectId);

            //test
            //try
            //{
            //    CommonUtils.unionTaskList(taskList, linkList);
            //}
            //catch (Exception ex)
            //{
            //    throw ex;
            //}

            List <MODEL.risk_task_instance> taskInstanceList = CommonArugment.getTaskIntance.get(projectId);

            bool[] taskId = new bool[taskList.Count * 2];

            for (int i = 0; i < taskList.Count; ++i)
            {
                MODEL.risk_task task = taskList[i];
                taskId[task.Task_id] = false;  //initialize
                if (task.Task_nested_parent_id != parentTaskId)
                {
                    taskList.Remove(task);
                    --i;
                    continue;
                }
                taskId[task.Task_id] = true;
                task.OutDegree       = 0;
                task.InDegree        = 0;
                task.MaxSucceedSize  = 0;
                if (!task.Task_is_summary)
                {
                    try
                    {
                        MODEL.risk_math_expression_arg expressionArg = CommonArugment.getExpression.getExpression(task.Auto_id);
                        List <MODEL.risk_resource>     list          = CommonArugment.getTaskResAssign.findResByTaskAutoId(task.Auto_id);
                        if (list.Count != 0)
                        {
                            task.Have_resource = true;
                        }
                        if (expressionArg != null)
                        {
                            task.IsDone         = true;
                            task.ExpressionName = expressionArg.Name;
                            double[] values = (double[])CommonUtils.Deserialize(expressionArg.Value);
                            switch (task.ExpressionName)
                            {
                            case "三角分布":
                                task.ArgA = values[0];
                                task.ArgB = values[1];
                                task.ArgC = values[2];
                                break;

                            case "Beta分布":
                                task.ArgA = values[0];
                                task.ArgB = values[1];
                                break;

                            case "正态分布":
                                task.ArgA = values[0];
                                task.ArgB = values[1];
                                break;

                            case "固定":
                                task.ArgA = values[0];
                                break;

                            default:
                                task.ExpressionName = "未知分布";
                                break;
                            }
                            if (expressionArg.Actual_value != 0)
                            {
                                task.Value = expressionArg.Actual_value;
                                continue;
                            }
                        }
                        else
                        {
                            task.IsDone = false;
                        }
                    }
                    catch (System.Exception ex)
                    {
                        CommonMsg.errMsg = ex.Message + "->没有子任务的点必须标注为issummary为false";
                        return(false);
                    }
                }
                else
                {
                    task.IsDone = CommonUtils.checkIsDone(taskList, task.Task_id);
                }
            }
            //cal each in/out degree of the task
            for (int i = 0; i < linkList.Count; ++i)
            {
                MODEL.risk_link link   = linkList[i];
                int             outDot = link.Task_pre_id;
                int             inDot  = link.Task_suc_id;
                if (!taskId[outDot] || !taskId[inDot])
                {
                    linkList.Remove(link);
                    --i;
                    continue;
                }
                bool outDone = false;
                bool inDone  = false;
                foreach (MODEL.risk_task task in taskList)
                {
                    if (task.Task_id == outDot)
                    {
                        ++task.OutDegree;
                        outDone = true;
                    }

                    if (task.Task_id == inDot)
                    {
                        ++task.InDegree;
                        inDone = true;
                    }
                    if (outDone && inDone)
                    {
                        break;
                    }
                }
            }
            try
            {
                if (CommonUtils.calMaxSucceedSize(taskList, linkList))
                {
                    CommonMsg.errMsg = "任务有环";
                    return(false);
                }
                else
                {
                    CommonMsg.taskList = taskList;
                    CommonMsg.linkList = linkList;
                    return(true);
                }
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
        }