diff --git a/README.md b/README.md index ddd76863..5320e4e1 100644 --- a/README.md +++ b/README.md @@ -78,20 +78,20 @@ I want to thank [teoxoy](https://github.com/teoxoy), author of the awesome Facto ### Planner quality -| Electric pole | Add beacons | Overlap beacons | Pipe count | Pole count | Beacon count | Effect count | -| -------------------- | ----------- | --------------- | ------------------ | ------------------ | ------------------ | ------------------ | -| small-electric-pole | True | True | 43.172413793103445 | 33.39655172413793 | 79.24137931034483 | 104.93103448275862 | -| medium-electric-pole | True | True | 43.172413793103445 | 25.82758620689655 | 79.24137931034483 | 104.93103448275862 | -| substation | True | True | 43.172413793103445 | 7.896551724137931 | 79.24137931034483 | 104.93103448275862 | -| big-electric-pole | True | True | 47.36206896551724 | 34.05172413793103 | 75.24137931034483 | 100.01724137931035 | -| small-electric-pole | True | False | 41.51724137931034 | 13.568965517241379 | 5.948275862068965 | 11.017241379310345 | -| medium-electric-pole | True | False | 41.51724137931034 | 11.224137931034482 | 5.948275862068965 | 11.017241379310345 | -| substation | True | False | 41.51724137931034 | 4.241379310344827 | 5.948275862068965 | 11.017241379310345 | -| big-electric-pole | True | False | 41.793103448275865 | 10.827586206896552 | 5.9655172413793105 | 11.017241379310345 | -| small-electric-pole | False | N/A | 83.93103448275862 | 13.068965517241379 | 0 | 0 | -| medium-electric-pole | False | N/A | 83.93103448275862 | 10.293103448275861 | 0 | 0 | -| substation | False | N/A | 83.93103448275862 | 3.896551724137931 | 0 | 0 | -| big-electric-pole | False | N/A | 84.13793103448276 | 9.03448275862069 | 0 | 0 | +| Electric pole | Add beacons | Overlap beacons | Pipe count | Pole count | Beacon count | Effect count | +| -------------------- | ----------- | --------------- | ------------------ | ------------------ | ----------------- | ------------------ | +| small-electric-pole | True | True | 46.50847457627118 | 34.67796610169491 | 82.23728813559322 | 111.54237288135593 | +| medium-electric-pole | True | True | 46.50847457627118 | 26.728813559322035 | 82.23728813559322 | 111.54237288135593 | +| substation | True | True | 46.50847457627118 | 8.169491525423728 | 82.23728813559322 | 111.54237288135593 | +| big-electric-pole | True | True | 50.40677966101695 | 35.47457627118644 | 77.9322033898305 | 105.98305084745763 | +| small-electric-pole | True | False | 44.88135593220339 | 14.440677966101696 | 6.271186440677966 | 11.813559322033898 | +| medium-electric-pole | True | False | 44.88135593220339 | 11.830508474576272 | 6.271186440677966 | 11.813559322033898 | +| substation | True | False | 44.88135593220339 | 4.4576271186440675 | 6.271186440677966 | 11.813559322033898 | +| big-electric-pole | True | False | 45.152542372881356 | 11.610169491525424 | 6.288135593220339 | 11.813559322033898 | +| small-electric-pole | False | N/A | 88.79661016949153 | 13.76271186440678 | 0 | 0 | +| medium-electric-pole | False | N/A | 88.79661016949153 | 10.796610169491526 | 0 | 0 | +| substation | False | N/A | 88.79661016949153 | 4.101694915254237 | 0 | 0 | +| big-electric-pole | False | N/A | 89 | 9.830508474576272 | 0 | 0 | ### Runtime performance diff --git a/src/FactorioTools/OilField/Steps/RotateOptimize.cs b/src/FactorioTools/OilField/Steps/RotateOptimize.cs index 1e9f2b6f..95acf16c 100644 --- a/src/FactorioTools/OilField/Steps/RotateOptimize.cs +++ b/src/FactorioTools/OilField/Steps/RotateOptimize.cs @@ -25,11 +25,16 @@ public static void Execute(Context parentContext, HashSet pipes) var context = new ChildContext(parentContext, pipes); - // Visualizer.Show(existingPipeGrid, intersections.Select(l => (DelaunatorSharp.IPoint)new DelaunatorSharp.Point(l.X, l.Y)), Array.Empty()); + // Visualizer.Show(context.ExistingPipeGrid, context.Intersections.Select(l => (DelaunatorSharp.IPoint)new DelaunatorSharp.Point(l.X, l.Y)), Array.Empty()); var modified = true; + var previousPipeCount = int.MaxValue; - while (modified) + // Some oil fields have multiple optimal configurations with the same pipe count. Allow up to 5 of these to be + // attempted before settling on one. + var allowedSamePipeCounts = 5; + + while (modified && (context.Pipes.Count < previousPipeCount || allowedSamePipeCounts > 0)) { var changedTerminal = false; foreach (var terminals in context.CenterToTerminals.Values) @@ -64,6 +69,14 @@ public static void Execute(Context parentContext, HashSet pipes) } modified = changedTerminal || shortenedPath; + if (previousPipeCount == context.Pipes.Count) + { + allowedSamePipeCounts--; + } + else + { + previousPipeCount = context.Pipes.Count; + } } } @@ -116,7 +129,7 @@ private static bool UseBestTerminal(ChildContext context, TerminalLocation origi #if USE_SHARED_INSTANCES var newPath = minPath == context.ParentContext.SharedInstances.LocationListA ? context.ParentContext.SharedInstances.LocationListB : context.ParentContext.SharedInstances.LocationListA; #else - var newPath = new List(); + var newPath = new List(); #endif var result = AStar.GetShortestPath(context.ParentContext.SharedInstances, context.Grid, terminalCandidate, context.Pipes, outputList: newPath); if (result.ReachedGoal.HasValue) @@ -166,6 +179,8 @@ private static bool UseBestTerminal(ChildContext context, TerminalLocation origi EliminateOtherTerminals(context.ParentContext, minTerminal); } + // Console.WriteLine($"New best terminal: {minTerminal} -> {minPath.Last()}"); + context.UpdateIntersectionsAndGoals(); /* @@ -252,6 +267,8 @@ private static bool UseShortestPath( Visualizer.Show(clone, originalPath.Select(l => (DelaunatorSharp.IPoint)new DelaunatorSharp.Point(l.X, l.Y)), Array.Empty()); */ + // Console.WriteLine($"Shortened path: {result.Path[0]} -> {result.Path.Last()}"); + return true; } finally diff --git a/test/FactorioTools.Test/OilField/blueprints.txt b/test/FactorioTools.Test/OilField/blueprints.txt index 13763c81..c1c04b7b 100644 --- a/test/FactorioTools.Test/OilField/blueprints.txt +++ b/test/FactorioTools.Test/OilField/blueprints.txt @@ -75,3 +75,6 @@ 0eJyU1MFuhCAQBuB3mTMHBdxdeZWm2bjupKFdkSg2NcZ3L0gPTduEv0cRP3WYfza6PRb2k3WBzEa2H91M5mmj2b647pHWXDcwGfLL4F+7/o0EhdWnFRt4oF2QdXf+IFPvz4LYBRssZ+O4WK9uGW48xQ3iD8uPc3xgdOlNCdGCVjIqsnc7cZ9vVbv4pUlA09WhSYBTANdmTZc1DWjnrF3KWoMUroW5E8CprLVl7QxoMn+cqsrc5R9NUpe5Fi+dkmWurgCvyVwDcFAkcqMo4CxqJBSywT0kFTL2U/Q0ELJ0cOXWi0VBPSgZ+X/16acXx9Uxwsy3GSjonaf5a8P+CQAA//8DAIIurss= 0eJyU1N1ugyAcBfB3+V9zIaC18irL0lhLFraKRHGZMb57+ejFsi3h7FLEn0fwsNP1vmo3G+tJ7WSGyS6kXnZazJvt73HM9qMmRW4d3Xs/fBAjv7k4Yrwe6WBk7E1/keLHKyNtvfFGZyNdbBe7jlc9hwnsD8tNS3hgsvFNAREVo42UDOzNzHrIt6qD/dIEorVJa8qaBDSZsLaM1Ui0rJ3LWoNEq5PWlbUToPEuaZyXuRYJ9+REmTsj6UTmgF3tkHQVzPHqH/GAveBIIyRPngAqEV9dztdkD/iPOdSK/L0S2F2OFEM2uIdUIy5y9JD1Q8ohctUk8r9A7cj56vqnF07TdMKqb0c0o089L88JxwMAAP//AwC8S+KQ 0eJyU1NtuhCAQBuB3mWsuBDysvErTNK5LGtoViWJTY3z3ctiLJtuEv5cifjrj/Bx0vW/aLcZ6UgeZcbYrqZeDVvNuh3tcs8OkSZHbJvcxjJ/EyO8urhivJzoZGXvT36T4+cpIW2+80dlIF/ub3aarXsIG9ofl5jU8MNv4poj0jHZSMrA3s+gx36pO9qQJQBNN0tqyJhGtThrnZa4GOJk1oNQG0HLfOFBqC2hd0kRV1jqkcVXmRJm7wKUKoHE9MnFt5poyxyvE49nrAQ9JhOxx7x+ZkEi9SCqa/HPlBfCQWAiRvBpIGUeC8fi+GqkXiYbI81J3gIeEg4eRj95T/8Jpmk5Y9euIZvSll/Wx4fwBAAD//wMAhUbisQ== + +# 58: has multiple "rotate optimize" solution, bug: https://github.com/joelverhagen/FactorioTools/issues/3 +0eJyUmM1uwjAQBt/F5xxie22HvEpVVfxYVdoSIghVEeLdm8U5VKJShiPBDI7zza7jq9l8nfNw7PrRtFfTbQ/9ybQvV3Pq3vv1l17r1/tsWjOc98PHevtpKjNeBr3SjXlvbpXp+l3+Ma29vVYm92M3drkw7h8ub/15v8nHaUD1D2s4nKYfHHr9pwniY2Uu01A/cXfdMW/Ld/WtesA5gBPBOA9wbp5dWMYJwAXBuEDWblVwzTIukrVLGJcALtqCWy3jGoCzzR3n3DJuRdbOYpyt+aNFPOJF5LdriRiuPFwHomeJGSlwHlFD6sKLgBd4mBGPyBE95xE70ny/wA5N/nKe3Z3na8AjfoSAeY74oYOUB/LsLK99iOd4pfcgz87z/CEe8SPWnBd4fUG8yOsB4iVeTz1oRq7h+RMLeKh/cJ4OXeY1nEf8SJbziB/pifk94YcAfz3yw3Fe4P1SQL3XLezy+pU8SwI84ocU3wT4odGi9R7xiB9x5oH+pq2f+htAPxLUPwLnET+aeX4gf0L80E2Y8sibh/A8I94T+yvEizx/iEf8UImUB/yVhtdTxCN+6CZs4kWQv0D8iMJ5yI+S5whepIPj/RzxUP8o9T4K4BE/kuc8tL+a5wfqXyB+6KZu4iXyfJEfZb+LeMQPDb3yHurfdEZ0Pzdq/xw8VeY7H0/zgNsvAAAA//8DAFxbEYk=