/** 計算フラグのリセット。 */ public void ResetCalcFlag(Fee.Dijkstra.Instance_Base a_instance) { this.prev_node = null; this.nodedata.SetTotalCost(a_instance, -1); this.nodedata.SetCalcFlag(a_instance, false); }
/** 計算フラグのリセット。 */ public void ResetCalcFlag(Fee.Dijkstra.Instance_Base a_instance) { foreach (System.Collections.Generic.KeyValuePair <NODEKEY, Node <NODEKEY, NODEDATA, LINKDATA> > t_pair in this.node_list) { t_pair.Value.ResetCalcFlag(a_instance); } this.calc_list.Clear(); }
/** 開始ノードに設定。 */ public void SetStartNode(Fee.Dijkstra.Instance_Base a_instance, Node <NODEKEY, NODEDATA, LINKDATA> a_node_start) { //開始ノードとしてコストを設定。 a_node_start.SetStartCost(a_instance); //計算リストに追加。 this.calc_list.Add(a_node_start); a_node_start.SetCalcFlag(a_instance, true); }
/** 到達コストが最小のノードを検索。 */ private static Node <NODEKEY, NODEDATA, LINKDATA> FindMinCostNode(Fee.Dijkstra.Instance_Base a_instance, System.Collections.Generic.List <Node <NODEKEY, NODEDATA, LINKDATA> > a_calc_list) { Node <NODEKEY, NODEDATA, LINKDATA> t_find_node = null; foreach (Node <NODEKEY, NODEDATA, LINKDATA> t_node in a_calc_list) { if (t_find_node == null) { t_find_node = t_node; } else if (t_node.GetTotalCost(a_instance) < t_find_node.GetTotalCost(a_instance)) { t_find_node = t_node; } } return(t_find_node); }
/** 計算。 * * return == true : 継続。 * */ public bool Calc(Fee.Dijkstra.Instance_Base a_instance) { //到達コストが最小のノードを検索。 Node <NODEKEY, NODEDATA, LINKDATA> t_node_current = Dijkstra <NODEKEY, NODEDATA, LINKDATA> .FindMinCostNode(a_instance, this.calc_list); if (t_node_current == null) { return(false); } else { //未計算リストから削除。 this.calc_list.Remove(t_node_current); t_node_current.SetCalcFlag(a_instance, false); } //隣接ノード計算開始。 System.Collections.Generic.List <Link <NODEKEY, NODEDATA, LINKDATA> > t_linklist_current = t_node_current.GetLinkList(); for (int ii = 0; ii < t_linklist_current.Count; ii++) { Node <NODEKEY, NODEDATA, LINKDATA> t_node = t_linklist_current[ii].GetToNode(); long t_total_cost = t_node_current.GetTotalCost(a_instance) + t_linklist_current[ii].GetToCost(a_instance); if ((t_node.GetTotalCost(a_instance) < 0) || (t_node.GetTotalCost(a_instance) > t_total_cost)) { //このノードへ到達するための隣接ノード。 t_node.SetTotalCost(a_instance, t_total_cost); t_node.SetPrevNode(t_node_current); //計算リストに追加。 if (t_node.GetCalcFlag(a_instance) == false) { this.calc_list.Add(t_node); t_node.SetCalcFlag(a_instance, true); } } } return(true); }
/** 到達コスト。取得。 */ public long GetTotalCost(Fee.Dijkstra.Instance_Base a_instance) { return(this.nodedata.GetTotalCost(a_instance)); }
/** 開始ノードとしてコストを設定。 */ public void SetStartCost(Fee.Dijkstra.Instance_Base a_instance) { this.nodedata.SetTotalCost(a_instance, 0); }
/** 計算フラグ。取得。 */ public bool GetCalcFlag(Fee.Dijkstra.Instance_Base a_instance) { return(this.nodedata.GetCalcFlag(a_instance)); }
/** 計算フラグ。設定。 */ public void SetCalcFlag(Fee.Dijkstra.Instance_Base a_instance, bool a_flag) { this.nodedata.SetCalcFlag(a_instance, a_flag); }
/** 到達コスト。設定。 */ public void SetTotalCost(Fee.Dijkstra.Instance_Base a_instance, long a_totalcost) { this.nodedata.SetTotalCost(a_instance, a_totalcost); }
/** 接続先ノードへの到達コスト。取得。 */ public long GetToCost(Fee.Dijkstra.Instance_Base a_instance) { return(this.linkdata.GetToCost(a_instance)); }
/** 接続先ノードへの到達コスト。設定。 */ public void SetToCost(Fee.Dijkstra.Instance_Base a_instance, long a_to_cost) { this.linkdata.SetToCost(a_instance, a_to_cost); }