Example #1
0
 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);
        }