private void Init(List <sortAlgorithm> sort) { Buffers.ForEach(b => b.clerarActive()); buildPetriNet(); buildMark(); timer = new TimerController(Machines); transitionController = new TransistionController(petriNet, Buffers, Processes, Machines, firstMachineAddress, sort); t = 0; PreparedTransitions = transitionController.getPreparedTransitions(t, timer, M); stopped = false; machinesPercentage = printMachinesPercentage(); }
private bool transitionPrepared(Vector <double> T, TimerController timer, Matrix <double> M) { int inputs = T.Where(i => i < 0).Count(); int preparedInputs = 0; for (int i = 0; i < petriNet.Places; i++) { if (T[i] < 0 && M[i, 0] > 0) { preparedInputs++; } } int input = transitionFromMachine(T); int output = transitionToMachine(T); int buffer = transitionToBufferAddress(T); if (inputs == preparedInputs) { if ((input > 0 && !timer.machineIsActive(input)) || (output > 0 && !timer.machineIsActive(output) && machineInCapacityLimits(output, M))) { return(true); } else if (input <= 0 && output <= 0 && buffer <= 0) { return(true); } else if (buffer > 0 && bufferCapacityInLimits(buffer, M)) { return(true); } else { return(false); } } else { return(false); } }
public Vector <double> chooseTransiztion(TimerController timer, Matrix <double> M) { var T = Vector <double> .Build.Dense(petriNet.Tranzitions, 0); if (PreparedTransitions.Count > 0) { for (int i = 0; i < PreparedTransitions.Count; i++) { T = Vector <double> .Build.Dense(petriNet.Tranzitions, 0); var Tr = PreparedTransitions.ElementAt(i); T[Tr.Number - 1] = 1; var MM = M + petriNet.I * T.ToColumnMatrix(); if (transitionIsSafe(Tr.IO, Tr.Number, M, MM, Tr)) { PreparedTransitions.RemoveAt(i); //Console.Out.WriteLine("Transition: " + Tr.Number); var machine = transitionFromMachine(Tr.IO); if (machine > 0) { int processNumber = getProcessNumber(Tr.Number - 1); var operation = Processes.First(p => p.Number == processNumber) .Operations.First(o => o.MachineNumber == machine); if (processNumber > 0) { timer.StartOperation(operation, processNumber); } } var tmpBuffers = Buffers; updateBuffers(Tr); return(T); } } } T = Vector <double> .Build.Dense(petriNet.Tranzitions, 0); return(T); }
public List <Transition> getPreparedTransitions(int time, TimerController timer, Matrix <double> M) { List <Transition> CurrentTransitions = new List <Transition>(); List <Transition> tmpPrepared = new List <Transition>(); PreparedTransitions.ForEach(i => tmpPrepared.Add(i)); for (int t = 0; t < petriNet.Tranzitions; t++) { if (transitionPrepared(petriNet.I.Column(t), timer, M)) { var newTransition = generateTransitionInfo(t, time); CurrentTransitions.Add(newTransition); } } foreach (var transition in PreparedTransitions) { if (CurrentTransitions.All(i => i.Number != transition.Number)) { tmpPrepared.Remove(transition); } } foreach (var transition in CurrentTransitions) { if (PreparedTransitions.All(i => i.Number != transition.Number) || PreparedTransitions.Count == 0) { tmpPrepared.Add(transition); } } PreparedTransitions = tmpPrepared; SortTransitions(); return(PreparedTransitions); }