예제 #1
0
        public double GetItemMaximumScore(RPOCSimulationSettings simSettings)
        {
            double retVal = double.MinValue;

            retVal = _context.Database.SqlQuery <double>(@"
                    select  
	                    max(m1 + m2 + m3 + m4 + m5 + m6 + m7 + m8 + m9 + m10) 
                    from (
	                    select 
		                    a.ID,
		                    iif(@p0 = 0, 0, sum(c.Metric1) * (@p0 / 100)) m1,
		                    iif(@p1 = 0, 0, sum(c.Metric2) * (@p1 / 100)) m2,
		                    iif(@p2 = 0, 0, sum(c.Metric3) * (@p2 / 100)) m3,
		                    iif(@p3 = 0, 0, sum(c.Metric4) * (@p3 / 100)) m4,
		                    iif(@p4 = 0, 0, sum(c.Metric5) * (@p4 / 100)) m5,
		                    iif(@p5 = 0, 0, sum(c.Metric6) * (@p5 / 100)) m6,
		                    iif(@p6 = 0, 0, sum(c.Metric7) * (@p6 / 100)) m7,
		                    iif(@p7 = 0, 0, sum(c.Metric8) * (@p7 / 100)) m8,
		                    iif(@p8 = 0, 0, sum(c.Metric9) * (@p8 / 100)) m9,
		                    iif(@p9 = 0, 0, sum(c.Metric10) * (@p9 / 100)) m10
	                    from Items a
	                    inner join ItemAttributes b on a.ID = b.Item_ID
	                    inner join Attributes c on b.Attributes_ID = c.ID
	                    group by a.ID
                    ) a
                ", simSettings.Metric1, simSettings.Metric2, simSettings.Metric3, simSettings.Metric4, simSettings.Metric5, simSettings.Metric6, simSettings.Metric7, simSettings.Metric8, simSettings.Metric9, simSettings.Metric10).FirstOrDefault();

            return(retVal);
        }
예제 #2
0
        public PlanogramOptimizerEncog(Item[] items, RPOCSimulationSettings simSettings, UpdateUINonRLMCallback updateUI = null, UpdateStatusCallback updateStatus = null, SimulationCsvLogger logger = null, bool anneal = true)
        {
            updateStatus?.Invoke("Initializing...");

            //this.items = items;
            this.simSettings  = simSettings;
            this.logger       = logger;
            this.updateUI     = updateUI;
            this.updateStatus = updateStatus;

            network        = CreateNetwork();
            planogramScore = new PlanogramScore()
            {
                SimSettings = simSettings,
                Items       = items,
                UpdateUI    = updateUI,
                Logger      = logger
            };

            if (anneal)
            {
                train = new NeuralSimulatedAnnealing(network, planogramScore, 10, 2, (simSettings.SimType == SimulationType.Sessions) ?  1 : 10); // todo make the # of cycles an input for users?
            }
            else
            {
                train = new MLMethodGeneticAlgorithm(() => {
                    ((IMLResettable)network).Reset();
                    return(network);
                }, planogramScore, 500);
            }
        }
        public static double[] GetCalculatedWeightedMetricArray(Item item, RPOCSimulationSettings simSettings)
        {
            double[] retVal = new double[10];

            // we go through each attribute for the item and sum up each of its metric
            foreach (var attr in item.Attributes)
            {
                retVal[0] += attr.Metric1;
                retVal[1] += attr.Metric2;
                retVal[2] += attr.Metric3;
                retVal[3] += attr.Metric4;
                retVal[4] += attr.Metric5;
                retVal[5] += attr.Metric6;
                retVal[6] += attr.Metric7;
                retVal[7] += attr.Metric8;
                retVal[8] += attr.Metric9;
                retVal[9] += attr.Metric10;
            }

            // with the retVal all summed up, we then get the percentage (based on the ones set in SimulationSettings) so we can get its weight retVal
            retVal[0] = simSettings.Metric1 == 0 ? 0 : retVal[0] * (simSettings.Metric1 / 100D);
            retVal[1] = simSettings.Metric2 == 0 ? 0 : retVal[1] * (simSettings.Metric2 / 100D);
            retVal[2] = simSettings.Metric3 == 0 ? 0 : retVal[2] * (simSettings.Metric3 / 100D);
            retVal[3] = simSettings.Metric4 == 0 ? 0 : retVal[3] * (simSettings.Metric4 / 100D);
            retVal[4] = simSettings.Metric5 == 0 ? 0 : retVal[4] * (simSettings.Metric5 / 100D);
            retVal[5] = simSettings.Metric6 == 0 ? 0 : retVal[5] * (simSettings.Metric6 / 100D);
            retVal[6] = simSettings.Metric7 == 0 ? 0 : retVal[6] * (simSettings.Metric7 / 100D);
            retVal[7] = simSettings.Metric8 == 0 ? 0 : retVal[7] * (simSettings.Metric8 / 100D);
            retVal[8] = simSettings.Metric9 == 0 ? 0 : retVal[8] * (simSettings.Metric9 / 100D);
            retVal[9] = simSettings.Metric10 == 0 ? 0 : retVal[9] * (simSettings.Metric10 / 100D);

            return(retVal);
        }
        public PlanogramSimulation(BasicNetwork network, Item[] items, RPOCSimulationSettings simSettings)
        {
            slotNormalizer = new NormalizedField(NormalizationAction.Normalize, "Slot", (simSettings.NumSlots * simSettings.NumShelves) - 1, 0, -1, 1);
            itemNormalizer = new NormalizedField(NormalizationAction.Normalize, "Item", items.Length - 1, 0, -1, 1);

            this.items       = items;
            this.simSettings = simSettings;
            this.network     = network;
        }
        /// <summary>
        /// Calculates the metric for an item based on the attributes it has been assigned
        /// </summary>
        /// <param name="item">The item reference with its attributes</param>
        /// <returns>The calculated metric</returns>
        public static double GetCalculatedWeightedMetrics(Item item, RPOCSimulationSettings simSettings)
        {
            double retVal = 0;

            double[] metrics = GetCalculatedWeightedMetricArray(item, simSettings);

            // now having the weighted metrics calculated we simply sum it all up to get a single metric used to score the item
            retVal = metrics.Sum();

            return(retVal);
        }
예제 #6
0
        // Set values to metric sliders
        public void SetMetricSliderValues(RPOCSimulationSettings settings)
        {
            var selectedMetrics = GetIncludedMetrics();

            foreach (var m in selectedMetrics)
            {
                switch (m.Key)
                {
                case "Metric1":
                    this.metricSlider1.Value = settings.Metric1;     // for metric1 slider
                    break;

                case "Metric2":
                    this.metricSlider2.Value = settings.Metric2;     // for metric2 slider
                    break;

                case "Metric3":
                    this.metricSlider3.Value = settings.Metric3;     // for metric3 slider
                    break;

                case "Metric4":
                    this.metricSlider4.Value = settings.Metric4;     // for metric4 slider
                    break;

                case "Metric5":
                    this.metricSlider5.Value = settings.Metric5;     // for metric5 slider
                    break;

                case "Metric6":
                    this.metricSlider6.Value = settings.Metric6;     // for metric6 slider
                    break;

                case "Metric7":
                    this.metricSlider7.Value = settings.Metric7;     // for metric7 slider
                    break;

                case "Metric8":
                    this.metricSlider8.Value = settings.Metric8;     // for metric8 slider
                    break;

                case "Metric9":
                    this.metricSlider9.Value = settings.Metric9;     // for metric9 slider
                    break;

                case "Metric10":
                    this.metricSlider10.Value = settings.Metric10;     // for metric10 slider
                    break;
                }
            }
            // Storing values
            setMetricValues();
        }
예제 #7
0
        public double GetItemMaxScoreForTop(RPOCSimulationSettings simSettings)
        {
            double retVal   = 0;
            int    numSlots = simSettings.NumShelves * simSettings.NumSlots;
            double top      = Math.Ceiling(Convert.ToDouble(numSlots) / Convert.ToDouble(RPOCSimulationSettings.MAX_ITEMS));

            var topItems = _context.Database.SqlQuery <double>($@"
                    select top {top}
	                    (m1 + m2 + m3 + m4 + m5 + m6 + m7 + m8 + m9 + m10) as Score
                    from (
	                    select 
		                    a.ID,
		                    iif(@p0 = 0, 0, sum(c.Metric1) * (@p0 / 100)) m1,
		                    iif(@p1 = 0, 0, sum(c.Metric2) * (@p1 / 100)) m2,
		                    iif(@p2 = 0, 0, sum(c.Metric3) * (@p2 / 100)) m3,
		                    iif(@p3 = 0, 0, sum(c.Metric4) * (@p3 / 100)) m4,
		                    iif(@p4 = 0, 0, sum(c.Metric5) * (@p4 / 100)) m5,
		                    iif(@p5 = 0, 0, sum(c.Metric6) * (@p5 / 100)) m6,
		                    iif(@p6 = 0, 0, sum(c.Metric7) * (@p6 / 100)) m7,
		                    iif(@p7 = 0, 0, sum(c.Metric8) * (@p7 / 100)) m8,
		                    iif(@p8 = 0, 0, sum(c.Metric9) * (@p8 / 100)) m9,
		                    iif(@p9 = 0, 0, sum(c.Metric10) * (@p9 / 100)) m10
	                    from Items a
	                    inner join ItemAttributes b on a.ID = b.Item_ID
	                    inner join Attributes c on b.Attributes_ID = c.ID
	                    group by a.ID
                    ) a
                    order by Score desc
                "
                                                               , simSettings.Metric1, simSettings.Metric2, simSettings.Metric3, simSettings.Metric4, simSettings.Metric5, simSettings.Metric6, simSettings.Metric7, simSettings.Metric8, simSettings.Metric9, simSettings.Metric10).ToList();

            int slotsAccountedFor = 0;

            for (int i = 0; i < topItems.Count; i++)
            {
                if (slotsAccountedFor + 10 >= numSlots)
                {
                    var remaining = numSlots - slotsAccountedFor;
                    topItems[i] = topItems[i] * remaining;
                }
                else
                {
                    slotsAccountedFor += 10;
                    topItems[i]        = topItems[i] * 10D;
                }
            }

            retVal = topItems.Sum();

            return(retVal);
        }
예제 #8
0
        public void SetSimSettings(RPOCSimulationSettings simSettings)
        {
            if (simSettings != null)
            {
                this.simSettings        = simSettings;
                SimType                 = simSettings.SimType;
                Sessions                = simSettings.Sessions;
                Hours                   = simSettings.Hours;
                Score                   = simSettings.Score;
                chkSimDisplay.IsChecked = simSettings.EnableSimDisplay;

                if (!simSettings.EncogSelected)
                {
                    grpEncogSettings.Visibility = Visibility.Collapsed;
                    this.Height -= grpEncogSettings.Height;
                }
                else
                {
                    HiddenLayers         = simSettings.HiddenLayers;
                    txtHiddenLayers.Text = HiddenLayers.ToString();

                    HiddenLayerNeurons         = (simSettings.HiddenLayerNeurons <= 0) ? simSettings.NumSlots * simSettings.NumShelves : simSettings.HiddenLayerNeurons;
                    txtHiddenLayerNeurons.Text = HiddenLayerNeurons.ToString();
                }

                calculateMaxScore();
                simScoreSlider.Value      = simSettings.DefaultScorePercentage;
                simScoreSliderLbl.Content = simScoreSlider.Value + "%";

                switch (SimType)
                {
                case SimulationType.Sessions:
                    rdbSessions.IsChecked = true;
                    txtSimInput.Text      = Sessions.ToString();
                    showScoreSlider(false);
                    break;

                case SimulationType.Time:
                    rdbTime.IsChecked = true;
                    txtSimInput.Text  = Hours.ToString();
                    showScoreSlider(false);
                    break;

                default:
                    rdbScore.IsChecked = true;
                    txtSimInput.Text   = Score.ToString();
                    showScoreSlider(true);
                    break;
                }
            }
        }
예제 #9
0
 // Set values to metric sliders
 public void SetMetricSliderValues(RPOCSimulationSettings settings)
 {
     this.metricSlider1.Value  = settings.Metric1;  // for metric1 slider
     this.metricSlider2.Value  = settings.Metric2;  // for metric2 slider
     this.metricSlider3.Value  = settings.Metric3;  // for metric3 slider
     this.metricSlider4.Value  = settings.Metric4;  // for metric4 slider
     this.metricSlider5.Value  = settings.Metric5;  // for metric5 slider
     this.metricSlider6.Value  = settings.Metric6;  // for metric6 slider
     this.metricSlider7.Value  = settings.Metric7;  // for metric7 slider
     this.metricSlider8.Value  = settings.Metric8;  // for metric8 slider
     this.metricSlider9.Value  = settings.Metric9;  // for metric9 slider
     this.metricSlider10.Value = settings.Metric10; // for metric10 slider
     // Storing values
     setMetricValues();
 }
        /// <summary>
        /// Instantiates a new instance of the plangoram optimizer
        /// </summary>
        /// <param name="items">The dataset (items with their attributes and metrics) for the RLM to learn from</param>
        /// <param name="simSettings">Holds data which dictates what type of simulation to run and for how long. Also holds the weights metrics and other general settings</param>
        /// <param name="updateUI">Callback function for sending the results of the optimization for each session</param>
        /// <param name="updateStatus">Callback function for sending the current status of the RLM</param>
        /// <param name="logger">Logs the per session stats and allows users to download the CSV file after the training</param>
        /// <remarks>Used a callback instead of an event because we worry that the display might not keep up with the optimization. You can disable the display by setting it in the Simulation panel</remarks>
        public PlanogramOptimizer(Item[] items, RPOCSimulationSettings simSettings, UpdateUICallback updateUI = null, UpdateStatusCallback updateStatus = null, SimulationCsvLogger logger = null, string dbIdentifier = null)
        {
            this.logger      = logger;
            this.items       = items.ToArray();
            this.simSettings = simSettings;
            UpdateUI         = updateUI;
            UpdateStatus     = updateStatus;
            if (ENABLE_RLM_OUTPUT_LIMITER)
            {
                currentItemIndexes = new List <int>();
            }

            UpdateStatus?.Invoke("Initializing...");

            // creates the network (and the underlying DB) with a unique name to have a different network everytime you run a simulation
            //IRlmDbData rlmDbData = new RlmDbDataPostgreSqlServer(dbIdentifier != null ? dbIdentifier : "RLM_planogram_" + Guid.NewGuid().ToString("N"));
            IRlmDbData rlmDbData = new RlmDbDataSQLServer(dbIdentifier != null ? dbIdentifier : "RLM_planogram_" + Guid.NewGuid().ToString("N"));

            network = new RlmNetwork(rlmDbData);
            network.DataPersistenceComplete += Network_DataPersistenceComplete;
            // checks if the network structure already exists
            // if not then we proceed to define the inputs and outputs

            inputType = RLM.Enums.RlmInputType.Distinct;
            if (!network.LoadNetwork("planogram"))
            {
                string int32Type = typeof(Int32).ToString();

                var inputs = new List <RlmIO>();
                //inputs.Add(new RlmIO() { Name = "Shelf", DotNetType = int32Type, Min = 1, Max = simSettings.NumShelves, Type = RLM.Enums.RlmInputType.Linear });
                inputs.Add(new RlmIO()
                {
                    Name = "Slot", DotNetType = int32Type, Min = 1, Max = simSettings.NumSlots * simSettings.NumShelves, Type = inputType
                });

                var outputs = new List <RlmIO>();
                outputs.Add(new RlmIO()
                {
                    Name = "Item", DotNetType = int32Type, Min = 0, Max = this.items.Length - 1
                });

                // change Max to any number above 1 (and must not be go beyond the NumSlots value) to have multiple facings
                //outputs.Add(new RlmIO() { Name = "NumFacings", DotNetType = int32Type, Min = 1, Max = 1 });

                // creates the network
                network.NewNetwork("planogram", inputs, outputs);
            }
        }
 public SimulationSetter(RPOCSimulationSettings simSettings)
 {
     this.simSettings = simSettings;
 }