В настоящее время я работаю над проектом в моем университете с светофорами. Я использую SUMO в качестве своей программы моделирования и наткнулся на библиотеку TraCI для управления светофорами.
Я запрограммировал генетический алгоритм, но у меня есть одна проблема, которая, по сути, является узким местом, настолько малым, что никакая частица не может пройти, и это сама программа моделирования.
При управлении несколькими клиентами из одной и той же программы (моей программы) все клиенты работают в 2 потоках, где в моем случае у меня есть 8 доступных. Я намерен запустить программу в нескольких потоках, чтобы программа работала быстрее, поскольку на 100 симуляций уходит примерно 1,5 часа, хотя я имитировал только около 40 минут трафика.
Ниже я опубликовал метод инициализации, запуска клиентов и управления ими.
Основной виновник, вероятно, два вызова метода в последнем цикле for (тот, который управляет светофорами)
Итак, мой вопрос: как это можно распараллелить для запуска в нескольких потоках, чтобы программа работала быстрее?
С наилучшими пожеланиями
private async Task RunSimulationAsync()
{
List<TraCIClient> listOfClients = new List<TraCIClient>();
List<SimulationCommands> listOfSimulations = new List<SimulationCommands>();
List<TrafficLightCommands> listOfTrafficLights = new List<TrafficLightCommands>();
//initialize clients, simulationCommands and trafficlightCommands used for controlling sumo
for (int i = 0; i < numberOfInstances; ++i)
{
listOfClients.Add(new TraCIClient());
listOfSimulations.Add(new SimulationCommands(listOfClients[i]));
listOfTrafficLights.Add(new TrafficLightCommands(listOfClients[i]));
}
//open SUMO clients
for (int i = 0; i < numberOfInstances; ++i)
{
OpenSumo(portNumber, sumoOutputFilePath + $"{i}.xml");
await listOfClients[i].ConnectAsync("127.0.0.1", portNumber);
++portNumber;
}
// control trafficlights in simulation
for (int i = 0; i < dnaSize; ++i)
{
for (int j = 0; j < numberOfInstances; j++)
{
listOfTrafficLights[j].SetRedYellowGreenState("n0", $" {Population[j].genes[i]}");
listOfClients[j].Control.SimStep();
}
}