mirror of
				https://github.com/zenorogue/hyperrogue.git
				synced 2025-10-31 05:52:59 +00:00 
			
		
		
		
	edge_weights table for better cost computation
This commit is contained in:
		| @@ -26,6 +26,7 @@ vector<int> hubval; | |||||||
|  |  | ||||||
| vector<edgeinfo> sagedges;   | vector<edgeinfo> sagedges;   | ||||||
| vector<vector<int>> edges_yes, edges_no; | vector<vector<int>> edges_yes, edges_no; | ||||||
|  | vector<vector<pair<int, double>>> edge_weights; | ||||||
|  |  | ||||||
| ld edgepower=1, edgemul=1; | ld edgepower=1, edgemul=1; | ||||||
|  |  | ||||||
| @@ -53,6 +54,14 @@ void prepare_graph() { | |||||||
|       edges_no[i].push_back(j); |       edges_no[i].push_back(j); | ||||||
|     }           |     }           | ||||||
|  |  | ||||||
|  |   edge_weights.clear(); edge_weights.resize(DN); | ||||||
|  |   for(auto& e: sagedges) { | ||||||
|  |     if(e.i == e.j) continue; | ||||||
|  |     e.weight2 = pow((double) e.weight, (double) edgepower) * edgemul; | ||||||
|  |     edge_weights[e.i].emplace_back(e.j, e.weight2); | ||||||
|  |     edge_weights[e.j].emplace_back(e.i, e.weight2); | ||||||
|  |     } | ||||||
|  |  | ||||||
|   sagnode.clear(); |   sagnode.clear(); | ||||||
|   sagnode.resize(isize(sagcells), -1); |   sagnode.resize(isize(sagcells), -1); | ||||||
|   for(int i=0; i<DN; i++) |   for(int i=0; i<DN; i++) | ||||||
| @@ -99,13 +108,7 @@ void create_viz() { | |||||||
|   state |= SS_GRAPH; |   state |= SS_GRAPH; | ||||||
|  |  | ||||||
|   if(!vact) for(int i=0; i<DN; i++) vdata[i].data = 0; |   if(!vact) for(int i=0; i<DN; i++) vdata[i].data = 0; | ||||||
|   if(!vact) for(int i=0; i<isize(sagedges); i++) { |   if(!vact) for(auto& e: sagedges) addedge0(e.i, e.j, &e); | ||||||
|     edgeinfo& ei = sagedges[i]; |  | ||||||
|  |  | ||||||
|     ei.weight2 = pow((double) ei.weight, (double) edgepower) * edgemul; |  | ||||||
|      |  | ||||||
|     addedge0(ei.i, ei.j, &ei); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|   if(sagcells[0].first == nullptr) return; |   if(sagcells[0].first == nullptr) return; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -45,13 +45,11 @@ double costat(int vid, int sid) { | |||||||
|       } |       } | ||||||
|  |  | ||||||
|     case smMatch: { |     case smMatch: { | ||||||
|       vertexdata& vd = vdata[vid]; |       for(auto& e: edge_weights[vid]) { | ||||||
|       for(int j=0; j<isize(vd.edges); j++) { |         auto t2 = e.first; | ||||||
|         edgeinfo *ei = vd.edges[j].second; |  | ||||||
|         int t2 = vd.edges[j].first; |  | ||||||
|         if(sagid[t2] != -1) { |         if(sagid[t2] != -1) { | ||||||
|           ld cdist = sagdist[sid][sagid[t2]]; |           ld cdist = sagdist[sid][sagid[t2]]; | ||||||
|           ld expect = match_a / ei->weight2 + match_b; |           ld expect = match_a / e.second + match_b; | ||||||
|           ld dist = cdist - expect; |           ld dist = cdist - expect; | ||||||
|           cost += dist * dist; |           cost += dist * dist; | ||||||
|           } |           } | ||||||
| @@ -60,11 +58,9 @@ double costat(int vid, int sid) { | |||||||
|       } |       } | ||||||
|  |  | ||||||
|     case smClosest: { |     case smClosest: { | ||||||
|       vertexdata& vd = vdata[vid]; |       for(auto& e: edge_weights[vid]) { | ||||||
|       for(int j=0; j<isize(vd.edges); j++) { |         auto t2 = e.first; | ||||||
|         edgeinfo *ei = vd.edges[j].second; |         if(sagid[t2] != -1) cost += sagdist[sid][sagid[t2]] * e.second; | ||||||
|         int t2 = vd.edges[j].first; |  | ||||||
|         if(sagid[t2] != -1) cost += sagdist[sid][sagid[t2]] * ei->weight2; |  | ||||||
|         } |         } | ||||||
|        |        | ||||||
|       if(!hubval.empty()) { |       if(!hubval.empty()) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Zeno Rogue
					Zeno Rogue