diff options
| author | Steinar H. Gunderson <sgunderson@bigfoot.com> | 2014-04-11 00:40:54 +0200 | 
|---|---|---|
| committer | Steinar H. Gunderson <sgunderson@bigfoot.com> | 2014-04-11 00:40:54 +0200 | 
| commit | bc44bd99d4d9ae9fc92c43232ff4b95bb8f7e2a9 (patch) | |
| tree | a2d57502581dd806a55dba7f6c296d3ad0343959 /planning/planning.cpp | |
| parent | 5dc9e104240e1be919104fae8ffe59a296510e22 (diff) | |
Unify gap handling a bit.
Diffstat (limited to 'planning/planning.cpp')
| -rw-r--r-- | planning/planning.cpp | 49 | 
1 files changed, 29 insertions, 20 deletions
| diff --git a/planning/planning.cpp b/planning/planning.cpp index f51a60f..358bbf5 100644 --- a/planning/planning.cpp +++ b/planning/planning.cpp @@ -110,12 +110,6 @@ struct Node {  	bool seen;  	Edge *prev_edge;  }; - - -const unsigned horiz_cost[SWITCHES_PER_ROW] = { -	216, 72, 72, 216  // Gap costs are added separately. -}; -  struct Graph {  	Node source_node, sink_node;  	Node distro_nodes[NUM_DISTRO]; @@ -124,6 +118,22 @@ struct Graph {  	vector<Node*> all_nodes;  }; +const unsigned horiz_cost[SWITCHES_PER_ROW] = { +	216, 72, 72, 216  // Gap costs are added separately. +}; + +struct VerticalGap { +	unsigned after_row_num; +	unsigned extra_cost; +}; +// 3.5m, 4m, 5m, 4m gaps (1.1m, 1.6m, 2.6m, 1.6m extra). +vector<VerticalGap> vertical_gaps = { +	{ 5, 11 }, +	{ 13, 16 }, +	{ 21, 26 }, +	{ 30, 16 }, +}; +  class Planner {   private:  	int distro_placements[NUM_DISTRO]; @@ -148,26 +158,22 @@ class Planner {  unsigned Planner::find_distance(Switch from_where, unsigned distro)  { -	const int dp = std::abs(distro_placements[distro]); +	const unsigned dp = std::abs(distro_placements[distro]);  	// 3.6m from row to row (2.4m gap + 1.2m boards). -	unsigned base_cost = 36 * abs(int(from_where.row) - dp) + +	unsigned base_cost = 36 * abs(int(from_where.row) - int(dp)) +  		horiz_cost[from_where.num];  	if ((distro_placements[distro] >= 0) == (from_where.num >= 2)) {  		// 5.0m horizontal gap.  		base_cost += 50;  	} -	 -	// 3.5m, 4m, 5m, 4m gaps (1.1m, 1.6m, 2.6m, 1.6m extra). -	if ((from_where.row <= 5) == (dp >= 6)) -		base_cost += 11; -	if ((from_where.row <= 13) == (dp >= 14)) -		base_cost += 16; -	if ((from_where.row <= 21) == (dp >= 22)) -		base_cost += 26; -	if ((from_where.row <= 30) == (dp >= 31)) -		base_cost += 16; + +	for (const VerticalGap& gap : vertical_gaps) { +		if ((from_where.row <= gap.after_row_num) == (dp > gap.after_row_num)) { +			base_cost += gap.extra_cost; +		} +	}  	// Add 5m slack.  	return base_cost + 50; @@ -500,8 +506,11 @@ int Planner::do_work(int distro_placements[NUM_DISTRO])  	for (unsigned i = 0; i < switches.size(); ++i) {  		int distro = find_distro(g, i);  		if (i == 0 || switches[i].row != switches[i - 1].row) { -			if (last_row == 5 || last_row == 13 || last_row == 21 || last_row == 29) { -				logprintf("\n"); +			// New line. See if we just crossed a cap. +			for (const VerticalGap& gap : vertical_gaps) { +				if (last_row == int(gap.after_row_num)) { +					logprintf("\n"); +				}  			}  			logprintf("\n[31;22m%2u (%2u-%2u)    ", switches[i].row, switches[i].row * 2 - 1, switches[i].row * 2 + 0);  			last_num = -1; | 
