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; }
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; }
private void AddBlock(Block pBlock) { pBlock.ID = _blocks.Count; _blocks.Add(pBlock); }
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(); }