Beispiel #1
0
        private double AddBlocks(Block[] pBlocks)
        {
            double mTotalBlockWeight = 0;
            foreach (Block b in pBlocks)
            {
                Console.WriteLine("Adding " + b);
                AddBlock(b);
                mTotalBlockWeight += b.Weight;
            }

            foreach (Location l in _locations)
            {
                mTotalBlockWeight -= l.MaxWeight;
            }

            return mTotalBlockWeight;
        }
Beispiel #2
0
        public DateTime Solve(Block[] pBlocks)
        {
            double mOverWeight = 0;
            if ((mOverWeight = AddBlocks(pBlocks)) > 0)
            {
                Console.WriteLine("\nToo much weight - your blocks are over by " + mOverWeight + " pounds.");
                return DateTime.Now; ;
            }

            double mTotalWeight = _emptyWeight + (_gasWeight * _startingGas);
            foreach (Block b in _blocks)
            {
                mTotalWeight += b.Weight;
            }
            if (mTotalWeight > _maxWeight)
            {
                Console.WriteLine("\nToo much weight - you're (overall) over by " + (mTotalWeight - _maxWeight) + " pounds.");
                return DateTime.Now;
            }

            if (!InitCGRange())
            {
                return DateTime.Now;
            }

            _solutionHash = new ArrayList();

            int[] mCurrent = new int[_blocks.Count];
            for (int i = 0; i < mCurrent.Length; i++)
            {
                mCurrent[i] = -1;
            }

            Hashtable mPositions = Positions();
            ArrayList mAttemptedLocations = new ArrayList();
            IDictionaryEnumerator mEnum = mPositions.GetEnumerator();
            while (mEnum.MoveNext())
            {
                if (mAttemptedLocations.Contains(mEnum.Value))
                {
                    continue;
                }

                ArrayList mAlreadyAdded = new ArrayList();
                mAlreadyAdded.Add((int)mEnum.Key);

                for (int i = 0; i < mCurrent.Length; i++)
                {
                    mCurrent[i] = -1;
                }

                mAttemptedLocations.Add(mEnum.Value);
                if (Check(mCurrent, mPositions, 0, (int)mEnum.Key))
                {
                    mCurrent[0] = (int)mEnum.Key;
                    Next(mCurrent, mPositions, mAlreadyAdded, 0);
                }
            }

            Console.WriteLine("Searching " + _solutionCount + " solutions for CGs within envelope, then determining optimal CG...");

            ArrayList mCGs = new ArrayList();
            ArrayList mConfigurationHashes = new ArrayList();
            Hashtable mConfigurations = new Hashtable();
            Hashtable mConfigurationsAndRepeats = new Hashtable();
            bool mRepeatConfigurationFound = false;
            double mTotalMOI = 0;
            double mBaseMOI = _momentOfInertia;
            double mCG = 0;
            double mHash = 0;
            string mVal = "";

            if (_gasMomentSlope != 0)
            {
                mBaseMOI += ((_gasWeight * _startingGas) / _gasMomentSlope);
            }

            foreach (int[] ilist in _solutions)
            {
                if (mConfigurationsAndRepeats.Count != 0 && mConfigurationsAndRepeats.Count % 5000 == 0)
                {
                    Console.WriteLine("Searched through " + mConfigurationsAndRepeats.Count + " solutions...");
                }

                mTotalMOI = mBaseMOI;
                mVal = "";

                for (int i = 0; i < ilist.Length; i++)
                {
                    Block mBlock = (Block)_blocks[i];
                    mBlock.ClearPosition();
                    Location mLocation = (Location)mPositions[ilist[i]];
                    mBlock.SetPosition(mLocation);
                    mVal += "\n\t" + mBlock.Name + "-" + mLocation.Name;
                }

                foreach (Location l in _locations)
                {
                    mTotalMOI += l.GetMoment();
                }

                mCG = mTotalMOI / mTotalWeight;
                mVal = "CG: " + mCG + "\n" + mVal;

                mHash = GetHashCode(ilist);
                if (!mConfigurationHashes.Contains(mHash) && mCG >= _minCG && mCG <= _maxCG)
                {
                    if (mConfigurations.ContainsKey(mCG))
                    {
                        mRepeatConfigurationFound = true;
                        mConfigurationsAndRepeats.Add(mConfigurationsAndRepeats.Count, mVal);
                    }
                    else
                    {
                        mConfigurationsAndRepeats.Add(mCG, mVal);
                        mConfigurations.Add(mCG, mVal);
                        mCGs.Add(mCG);
                    }
                    mConfigurationHashes.Add(mHash);
                }
            }

            if (mConfigurations.Count == 0)
            {
                Console.WriteLine("\nNo valid solutions with a CG between " + _minCG + " and " + _maxCG + ".");
                return DateTime.Now;
            }

            double mMidCG = (_maxCG + _minCG) / 2.0;
            double mDelta = double.MaxValue;
            double mOptCG = (double)mCGs[0];

            for (int i = 0; i < mCGs.Count; i++)
            {
                double mCurrentCG = (double)mCGs[i];
                if (Math.Abs(mMidCG - mCurrentCG) < mDelta)
                {
                    mOptCG = mCurrentCG;
                    mDelta = Math.Abs(mMidCG - mOptCG);
                }
            }

            Console.WriteLine("Number of solutions within envelope: " + mConfigurationsAndRepeats.Count);
            if (mRepeatConfigurationFound)
            {
                Console.WriteLine("Number of (additional) repeated solutions (same CG, different configuration): " + (mConfigurationsAndRepeats.Count - mConfigurations.Count));
            }
            Console.WriteLine("\nOptimal Solution (only for w/starting gas)\n");
            Console.WriteLine("Optimal CG: " + mMidCG);
            Console.WriteLine("Distance from optimal CG: " + mDelta);
            Console.Write((string)mConfigurations[mOptCG]);
            Console.WriteLine();

            DateTime mDone = DateTime.Now;

            Console.Write("\nView all solutions? (Enter Y for yes, anything else to quit.) ");
            string mResponse = Console.ReadLine();
            if (mResponse.ToUpper() == "Y")
            {
                int mSolutionCount = 0;
                foreach (string s in mConfigurationsAndRepeats.Values)
                {
                    mSolutionCount++;
                    Console.WriteLine("Solution #" + mSolutionCount);
                    Console.WriteLine(s);
                }
            }

            return mDone;
        }
Beispiel #3
0
 private void AddBlock(Block pBlock)
 {
     pBlock.ID = _blocks.Count;
     _blocks.Add(pBlock);
 }
Beispiel #4
0
        static void Main(string[] args)
        {
            Vehicle mVehicle = new Vehicle("Seesaw", 0, 0, 0, 0, 0, 0, 300);

            Location[] mLocations = new Location[2];
            mLocations[0] = new Location("P1", 300, .5);
            mLocations[0].AddPosition(2, 0);
            mLocations[1] = new Location("P2", 300, 1);
            mLocations[1].AddPosition(2, 0);
            mVehicle.AddLocations(mLocations);

            Block[] mBlocks = new Block[2];
            mBlocks[0] = new Block("N1", 150, BlockType.Person);
            mBlocks[1] = new Block("N2", 150, BlockType.Person);
            /*
            Vehicle mVehicle = new Vehicle("Dad's Plane", 2470, 208589, 6, 45, 30, .01, 3600);

            Location[] mLocations = new Location[5];
            mLocations[0] = new Location("Forward", 100, .025);
            mLocations[0].AddPosition(0, 2);
            mLocations[1] = new Location("Front", 500, .0117);
            mLocations[1].AddPosition(2, 2);
            mLocations[2] = new Location("Middle", 550, .0083);
            mLocations[2].AddPosition(2, 2);
            mLocations[2].AddPosition(0, 4);
            mLocations[3] = new Location("Rear", 410, .0065);
            mLocations[3].AddPosition(2, 2);
            mLocations[3].AddPosition(0, 4);
            mLocations[4] = new Location("Aft", 100, .0055);
            mLocations[4].AddPosition(0, 3);

            mVehicle.AddLocations(mLocations);

            Block[] mBlocks = new Block[14];
            mBlocks[0] = new Block("Dad", 157, BlockType.Person);
            mBlocks[0].LockInPosition(mLocations[1]);
            mBlocks[1] = new Block("Mom", 115, BlockType.Person);
            mBlocks[1].ExcludeLocation(mLocations[1]);
            mBlocks[2] = new Block("Craig", 133, BlockType.Person);
            mBlocks[3] = new Block("Laurel", 115, BlockType.Person);
            mBlocks[3].ExcludeLocation(mLocations[1]);
            mBlocks[4] = new Block("Justin (and his laptop)", 124, BlockType.Person);
            mBlocks[5] = new Block("Dad's Flight Bag", 11, BlockType.Luggage);
            mBlocks[5].ExcludeLocation(mLocations[0]);
            mBlocks[5].ExcludeLocation(mLocations[3]);
            mBlocks[5].ExcludeLocation(mLocations[4]);
            mBlocks[6] = new Block("Dad's Heavy Bag", 20, BlockType.Luggage);
            mBlocks[7] = new Block("Dad's Light Bag", 13, BlockType.Luggage);
            mBlocks[8] = new Block("Mom's Valpack", 50, BlockType.Luggage);
            mBlocks[8].ExcludeLocation(mLocations[0]);
            mBlocks[8].ExcludeLocation(mLocations[4]);
            mBlocks[9] = new Block("Mom's Makeup Bag", 17, BlockType.Luggage);
            mBlocks[10] = new Block("Craig's Duffel", 18, BlockType.Luggage);
            mBlocks[11] = new Block("Craig's Backpack", 7, BlockType.Luggage);
            mBlocks[11].ExcludeLocation(mLocations[0]);
            mBlocks[12] = new Block("Laurel's Duffel", 35, BlockType.Luggage);
            mBlocks[13] = new Block("Justin's Duffel", 15, BlockType.Luggage);*/

            DateTime mStart = DateTime.Now;
            DateTime mEnd = mVehicle.Solve(mBlocks);
            Console.WriteLine("(solving took this long: " + (mEnd - mStart) + ")");

            Console.WriteLine("\n\nPress Enter to continue...");
            Console.ReadLine();
        }