// 创建一个 Stopwatch 实例
|
using System.Collections.Concurrent;
|
using System.Diagnostics;
|
using System.Text;
|
|
|
Console.WriteLine("开始模拟...");
|
Stopwatch stopwatch = new Stopwatch();
|
stopwatch.Start();
|
|
var file_path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "1897563622226399232.inp");
|
|
var pressure = 0d;
|
var weVlaues = new double[] { 0, 2.5, 5, 7.5, 10 };
|
var calcCount = 20000;
|
var list=new List<SimulationResult>(20000);
|
using (var helper = new Yw.Epanet.InteropXHelper())
|
{
|
var err = helper.Open(file_path, "", "");
|
err = helper.GetCount(Yw.Epanet.eCountType.Node, out int nodeCount);
|
err = helper.OpenH();
|
|
var allDemands = GenerateAllDemands(nodeCount, calcCount, weVlaues);
|
for (int i = 0; i < calcCount; i++)
|
{
|
helper.InitH(false);
|
for (int nodeIdx = 1; nodeIdx <= nodeCount; nodeIdx++)
|
{
|
double demand = allDemands[i, nodeIdx - 1];
|
err = helper.SetNodeValue(nodeIdx, Yw.Epanet.eNodeProperty.BaseDemand, demand);
|
}
|
|
helper.RunH(out long t);
|
|
var result = new SimulationResult();
|
for (int nodeIdx = 1; nodeIdx <= nodeCount; nodeIdx++)
|
{
|
pressure = 0;
|
helper.GetNodeValue(nodeIdx, Yw.Epanet.eNodeProperty.Pressure, out pressure);
|
result.UpdateMaxPressure(nodeIdx, pressure);
|
}
|
helper.NextH(out long tstep);
|
list.Add(result);
|
}
|
|
|
helper.Close();
|
|
}
|
|
|
|
stopwatch.Stop();
|
|
Console.WriteLine("所有模拟已完成。");
|
Console.WriteLine($"总时间:{stopwatch.Elapsed.TotalSeconds}");
|
|
var strBuild = new StringBuilder();
|
foreach (var item in list)
|
{
|
var pressureList= item.MaxPressures.Values.ToList();
|
strBuild.AppendLine($"{pressureList.Min():N5},{pressureList.Max():N5}");
|
}
|
|
Console.WriteLine(strBuild.ToString());
|
Console.ReadLine();
|
Console.ReadKey();
|
|
|
|
|
double[,] GenerateAllDemands(int nodeCount, int totalIterations, double[] weValues)
|
{
|
|
double[,] demands = new double[totalIterations, nodeCount];
|
Parallel.For(0, totalIterations, iter =>
|
{
|
var rand = new Random();
|
for (int node = 0; node < nodeCount; node++)
|
{
|
// 遗传算法式选择
|
int idx = rand.Next(weValues.Length);
|
|
// 20%概率变异
|
if (rand.NextDouble() < 0.2)
|
idx = (idx + 1) % weValues.Length;
|
demands[iter, node] = weValues[idx];
|
}
|
});
|
return demands;
|
}
|
|
public class SimulationResult
|
{
|
public ConcurrentDictionary<int, double> MaxPressures { get; } = new();
|
|
public void UpdateMaxPressure(int nodeId, double pressure)
|
{
|
MaxPressures.AddOrUpdate(nodeId, pressure,
|
(id, old) => Math.Max(old, pressure));
|
}
|
}
|