예제 #1
0
        private void OnInitMatching(object sender, EventArgs e)
        {
            int n = (int)this.upDownN.Value;

            matchingInstance = new StableMatching(n);
            matchingInstance.InitRandom(random);


            textBox1.Text = matchingInstance.InstanceString();
        }
예제 #2
0
        void AssignCarriers(Deployment Deployment)
        {
            var passengers = Deployment.Units.Where(i => i.Configuration.IsPassenger).ToList();
            var carriers   = Deployment.Units.Where(i => i.Configuration.IsCarrier).ToList();

            if (passengers.Count == 0 || carriers.Count == 0)
            {
                return;
            }
            carriers.Sort(new FluentComparator <Unit>(i => i.Configuration.UnitClass == UnitClass.TRANSPORT).Invert());
            carriers = carriers.Take(passengers.Count).ToList();

            var matching = new StableMatching <Unit, Unit>();

            carriers.ForEach(matching.AddPrimaryActor);
            passengers.ForEach(matching.AddSecondaryActor);

            foreach (var passenger in passengers)
            {
                foreach (var carrier in carriers)
                {
                    if (carrier.Configuration.CanLoad(passenger.Configuration) == OrderInvalidReason.NONE)
                    {
                        matching.SetPrimaryPreference(
                            carrier,
                            passenger,
                            passenger.GetPointValue() / Math.Max(.01, passenger.Configuration.Movement));
                        matching.SetSecondaryPreference(
                            passenger,
                            carrier,
                            carrier.Configuration.UnitClass == UnitClass.TRANSPORT ? carrier.GetPointValue() : 1);
                    }
                    else
                    {
                        matching.SetPrimaryPreference(carrier, passenger, 0);
                        matching.SetSecondaryPreference(passenger, carrier, 0);
                    }
                }
            }
            foreach (var assignment in matching.GetPairs()
                     .Where(i => i.Second != null &&
                            i.First.Configuration.CanLoad(i.Second.Configuration) == OrderInvalidReason.NONE))
            {
                AddAssignment(new UnitAssignment(assignment.First, assignment.Second, UnitAssignmentType.CARRIER));
            }
        }
예제 #3
0
        public List <Pair <Matched, Matched> > CreateStableMatching(List <Matched> Sounds, List <Matched> Symbols)
        {
            StableMatching <Matched, Matched> StableMatching = new StableMatching <Matched, Matched>();

            foreach (Matched Sound in Sounds)
            {
                StableMatching.AddPrimaryActor(Sound);
            }
            foreach (Matched Symbol in Symbols)
            {
                StableMatching.AddSecondaryActor(Symbol);
                foreach (Matched Sound in Sounds)
                {
                    StableMatching.SetPrimaryPreference(Sound, Symbol, Sound.GetPreference(Symbol));
                    StableMatching.SetSecondaryPreference(Symbol, Sound, Sound.Frequency);
                }
            }
            return(StableMatching.GetPairs());
        }
예제 #4
0
        private void OnIterateClick(object sender, EventArgs e)
        {
            Trace trace = new Trace(true);
            int   reps  = (int)this.upDownReps.Value;
            int   n     = (int)this.upDownN.Value;

            if (n > 100)
            {
                trace.Flag = false;
            }

            matchingInstance = new StableMatching(n);

            long   mRank   = 0;
            long   wRank   = 0;
            string results = "";

            this.countTextBox.Text = "0";
            this.countTextBox.Refresh();

            for (int i = 0; i < reps; i++)
            {
                matchingInstance.InitRandom(random);
                matchingInstance.GaleShapley(trace);
                results += RankString(trace) + "\r\n";
                mRank   += trace.MRank;
                wRank   += trace.WRank;

                this.countTextBox.Text = i.ToString();
                this.countTextBox.Refresh();
            }

            this.countTextBox.Text = reps.ToString();

            textBox3.Text = results;
            float avgMRank = ((float)mRank) / (reps);
            float avgWRank = ((float)wRank) / (reps);

            textBox2.Text = "Avg MRank: " + avgMRank + " (" + avgMRank / n + ")  Avg WRank: " + avgWRank + " (" + avgWRank / n + ")";
        }