protected virtual int GetViolatedRegisterConstraints(
            SchedulingGenome genome)
        {
            IList[] activeValues = GetActiveValues(genome);

            int violatedConstraints = 0;

            for (int step = 0; step < activeValues.Length; step++) {
                for (int i = 0; i < activeValues[step].Count - 1; i++) {

                    ValueNode vi = (ValueNode) activeValues[step][i];
                    Register  ri = genome.GetValueInfo(vi).Register;

                    for (int j = i + 1; j < activeValues[step].Count; j++) {

                        ValueNode vj = (ValueNode) activeValues[step][j];
                        Register rj = genome.GetValueInfo(vj).Register;

                        if (ri == rj)
                            violatedConstraints += 1;
                    }
                }
            }

            return violatedConstraints;
        }
        protected virtual void PositionExchangeCrossover(
            SchedulingGenome genome1, SchedulingGenome genome2)
        {
            int nCross = (int) (GA.Random.NextGaussian()
                                * (genome1.InstructionNodes.Count / 6)
                                + (genome1.InstructionNodes.Count / 2));

            nCross = Math.Min(nCross, genome1.InstructionNodes.Count);
            nCross = Math.Max(nCross, 0);

            for (int i = 0; i < nCross; i++) {

                int iNodeIndex =
                    GA.Random.Next(genome1.InstructionNodes.Count);

                InstructionNode iNode =
                    (InstructionNode) genome1.InstructionNodes[iNodeIndex];

                int eu = iNode.Instruction.ExecutionUnit;
                int t1 = genome1.GetInstructionInfo(iNode).SchedulingStep;
                int t2 = genome2.GetInstructionInfo(iNode).SchedulingStep;

                genome1.SwapInstructions(t1, t2, eu);
                genome2.SwapInstructions(t1, t2, eu);

                if (iNode.ResultValue is RegisterValueNode) {

                    Register r1 = genome1.GetValueInfo(iNode.ResultValue).Register;
                    Register r2 = genome2.GetValueInfo(iNode.ResultValue).Register;

                    genome1.GetValueInfo(iNode.ResultValue).Register = r2;
                    genome2.GetValueInfo(iNode.ResultValue).Register = r1;

                    ValueNode depVal =
                        (ValueNode) genome1.CyclicDependencies[iNode.ResultValue];

                    if (depVal != null) {

                        Register dr1 = genome1.GetValueInfo(depVal).Register;
                        Register dr2 = genome2.GetValueInfo(depVal).Register;

                        genome1.GetValueInfo(depVal).Register = dr2;
                        genome2.GetValueInfo(depVal).Register = dr1;
                    }
                }
            }
        }
        protected virtual IList[] GetActiveValues(SchedulingGenome genome)
        {
            IList[] activeValues = new IList[genome.Schedule.GetLength(0)];

            for (int i = 0; i < genome.Schedule.GetLength(0); i++) {

                activeValues[i] = new ArrayList();

                foreach (ValueNode rValue in genome.RegisterValues) {

                    int production = genome.GetValueInfo(rValue).Production;
                    int lastUsage  = genome.GetValueInfo(rValue).LastUsage;

                    if (production <= i && i <= lastUsage)
                        activeValues[i].Add(rValue);
                }
            }

            return activeValues;
        }
        public virtual void RegisterMutation(SchedulingGenome genome)
        {
            int nMut = (int) (Math.Abs(GA.Random.NextGaussian())
                              * (genome.RegisterValues.Count- 1) / 3 + 1);

            nMut = Math.Min(nMut, genome.RegisterValues.Count);

            for (int i = 0; i < nMut; i++) {

                int valIndex =
                    GA.Random.Next(genome.RegisterValues.Count);

                ValueNode val =
                    (ValueNode) genome.RegisterValues[valIndex];

                RegisterSet assignableRegs =
                    (RegisterSet) genome.InstructionGraph.AssignableRegisters[val];

                int regIndex = GA.Random.Next(assignableRegs.Count);

                genome.GetValueInfo(val).Register =
                    (Register) assignableRegs[regIndex];

                ValueNode depVal = (ValueNode) genome.CyclicDependencies[val];

                if (depVal != null) {
                    genome.GetValueInfo(depVal).Register =
                        (Register) assignableRegs[regIndex];
                }
            }
        }
        protected virtual void RegisterCrossover(
            SchedulingGenome genome1, SchedulingGenome genome2)
        {
            int nCross = (int) (GA.Random.NextGaussian()
                                * (genome1.RegisterValues.Count / 6)
                                + (genome1.RegisterValues.Count / 2));

            nCross = Math.Min(nCross, genome1.RegisterValues.Count);
            nCross = Math.Max(nCross, 0);

            for (int i = 0; i < nCross; i++) {

                ValueNode val = (ValueNode) genome1.RegisterValues[
                    GA.Random.Next(genome1.RegisterValues.Count)];

                Register r1 = genome1.GetValueInfo(val).Register;
                Register r2 = genome2.GetValueInfo(val).Register;

                genome1.GetValueInfo(val).Register = r2;
                genome2.GetValueInfo(val).Register = r1;

                ValueNode depVal = (ValueNode) genome1.CyclicDependencies[val];

                if (depVal != null) {
                    genome1.GetValueInfo(depVal).Register = r2;
                    genome2.GetValueInfo(depVal).Register = r1;
                }
            }
        }
Beispiel #6
0
        public virtual void Copy(
            SchedulingGenome other,
            IDictionary instructionMap,
            IDictionary valueMap)
        {
            population = other.population;
            scheduler = other.scheduler;

            schedule = new InstructionNode[
                other.schedule.GetLength(0),
                other.schedule.GetLength(1)];

            for (int i = 0; i < schedule.GetLength(0); i++) {
                for (int j = 0; j < schedule.GetLength(1); j++) {

                    InstructionNode iNode = other.schedule[i, j];

                    if (iNode != null) {
                        schedule[i, j] =
                            (InstructionNode) instructionMap[other.schedule[i, j]];
                    } else {
                        schedule[i, j] = null;
                    }
                }
            }

            valueInfos = new Hashtable();

            foreach (ValueNode vNode in other.ValueInfos.Keys) {

                ValueInfo info = new ValueInfo();
                ValueInfo otherInfo = other.GetValueInfo(vNode);

                info.Register = otherInfo.Register;
                info.Production = otherInfo.Production;
                info.LastUsage = otherInfo.LastUsage;
                valueInfos[valueMap[vNode]] = info;
            }

            instructionInfos = new Hashtable();

            foreach (InstructionNode iNode in other.InstructionInfos.Keys) {

                InstructionInfo info = new InstructionInfo();
                InstructionInfo otherInfo = other.GetInstructionInfo(iNode);

                info.SchedulingStep = otherInfo.SchedulingStep;
                instructionInfos[instructionMap[iNode]] = info;
            }

            isValid = other.isValid;
            scheduleLength = other.scheduleLength;
            violatedSchedulingConstraints = other.violatedSchedulingConstraints;
            violatedRegisterConstraints = other.violatedRegisterConstraints;
            generationOfBirth = other.generationOfBirth;
        }