Example #1
0
        void ReadParameter(OleDbConnection connect, GAMSDatabase db, string strAccessSelect, string parName, int parDim, string parExp = "")
        {
            try
            {
                OleDbCommand cmd = new OleDbCommand(strAccessSelect, connect);
                connect.Open();

                OleDbDataReader reader = cmd.ExecuteReader();

                if (reader.FieldCount != parDim + 1)
                {
                    lsLog.Add("Number of fields in select statement does not match parDim+1");
                }

                GAMSParameter a = db.AddParameter(parName, parDim, parExp);

                string[] keys = new string[parDim];
                while (reader.Read())
                {
                    for (int idx = 0; idx < parDim; idx++)
                    {
                        keys[idx] = reader.GetString(idx);
                    }
                    a.AddRecord(keys).Value = Convert.ToDouble(reader.GetValue(parDim));
                }
            }
            catch (Exception ex)
            {
                lsLog.Add("Error: Failed to retrieve the required data from the database. " + ex.Message);
            }
            finally
            {
                connect.Close();
            }
        }
Example #2
0
        GAMSDatabase ReadFromDatabase(GAMSWorkspace ws, string sInstanceID)
        {
            GAMSDatabase db = ws.AddDatabase();

            // connect to database
            OleDbConnection connection = null;

            try
            {
                connection = new OleDbConnection(strAccessConn);
            }
            catch (Exception ex)
            {
                lsLog.Add("Error: Failed to create a database connection. " + ex.Message);
            }
            string sSuffix = " where InstanceID='" + sInstanceID + "';";

            // read GAMS sets
            ReadSet(connection, db, "SELECT Plant FROM Plant" + sSuffix, "i", 1, "canning plants");
            ReadSet(connection, db, "SELECT Market FROM Market" + sSuffix, "j", 1, "markets");

            // read GAMS parameters
            ReadParameter(connection, db, "SELECT Plant,Capacity FROM Plant" + sSuffix, "a", 1, "capacity of plant i in cases");
            ReadParameter(connection, db, "SELECT Market,Demand FROM Market" + sSuffix, "b", 1, "demand at market j in cases");
            ReadParameter(connection, db, "SELECT Plant,Market,Distance FROM Distance" + sSuffix, "d", 2, "distance in thousands of miles");

            return(db);
        }
Example #3
0
        static GAMSDatabase ReadFromAccess(GAMSWorkspace ws)
        {
            GAMSDatabase db = ws.AddDatabase();

            // connect to database
            string          strAccessConn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=..\..\..\..\Data\transport.accdb";
            OleDbConnection connection    = null;

            try
            {
                connection = new OleDbConnection(strAccessConn);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: Failed to create a database connection. \n{0}", ex.Message);
                Environment.Exit(1);
            }

            // read GAMS sets
            ReadSet(connection, db, "SELECT Plant FROM Plant", "i", 1, "canning plants");
            ReadSet(connection, db, "SELECT Market FROM Market", "j", 1, "markets");

            // read GAMS parameters
            ReadParameter(connection, db, "SELECT Plant,Capacity FROM Plant", "a", 1, "capacity of plant i in cases");
            ReadParameter(connection, db, "SELECT Market,Demand FROM Market", "b", 1, "demand at market j in cases");
            ReadParameter(connection, db, "SELECT Plant,Market,Distance FROM Distance", "d", 2, "distance in thousands of miles");

            return(db);
        }
Example #4
0
        static void Main(string[] args)
        {
            GAMSWorkspace ws;

            if (Environment.GetCommandLineArgs().Length > 1)
            {
                ws = new GAMSWorkspace(systemDirectory: Environment.GetCommandLineArgs()[1]);
            }
            else
            {
                ws = new GAMSWorkspace();
            }
            // fill GAMSDatabase by reading from Access
            GAMSDatabase db = ReadFromAccess(ws);

            // run job
            using (GAMSOptions opt = ws.AddOptions())
            {
                GAMSJob t9 = ws.AddJobFromString(GetModelText());
                opt.Defines.Add("gdxincname", db.Name);
                opt.AllModelTypes = "xpress";
                t9.Run(opt, db);
                foreach (GAMSVariableRecord rec in t9.OutDB.GetVariable("x"))
                {
                    Console.WriteLine("x(" + rec.Keys[0] + "," + rec.Keys[1] + "): level=" + rec.Level + " marginal=" + rec.Marginal);
                }
            }
        }
Example #5
0
        public void ProcessTask(TaskManager.TaskDetails oTask, out List <string> lsLogs, out string sOutput, out string sStatus)
        {
            // cast input values
            TransportReference oReference = new TransportReference();

            oReference = (TransportReference)oDF.XmlStringToObject(oTask.ReferenceValues, oReference);

            TransportOutput oOutput = new TransportOutput();
            // call processing algorithm
            GAMSWorkspace ws = new GAMSWorkspace();
            // fill GAMSDatabase by reading from Access
            GAMSDatabase db = ReadFromDatabase(ws, oReference.Identifier);

            // run job
            using (GAMSOptions opt = ws.AddOptions())
            {
                GAMSJob t9 = ws.AddJobFromString(GetModelText());
                opt.Defines.Add("gdxincname", db.Name);
                opt.AllModelTypes = "xpress";
                t9.Run(opt, db);
                foreach (GAMSVariableRecord rec in t9.OutDB.GetVariable("z"))
                {
                    oOutput.TransportCost = rec.Level;
                }
                // write results into Access file
                WriteToDatabase(ws, t9.OutDB, oReference.Identifier);
            }

            // submit results
            sOutput = oDF.ObjectToXmlString(oOutput);
            sStatus = "completed";
            lsLogs  = lsLog;
        }
Example #6
0
        /// <summary>
        /// Runs the specified list data.
        /// </summary>
        /// <param name="listData">The list data.</param>
        /// <returns>List&lt;System.String&gt;[].</returns>
        public List <string>[] Run(List <string>[] listData)
        {
            int sheetNumber = 4;

            string[] setsTemplate = new string[2] {
                "i", "j"
            };
            string[] setsName = new string[2] {
                "所有维修员元素点", "所有任务元素点"
            };
            string[] parametersTemplate = new string[4] {
                "PL", "TL", "Tij", "Tjj"
            };
            string[] parametersName = new string[4] {
                "PLi", "TLj", "Tij", "Tjj"
            };

            GAMSWorkspace ws;

            //if (Environment.GetCommandLineArgs().Length > 1)
            //    ws = new GAMSWorkspace(systemDirectory: Environment.GetCommandLineArgs()[1]);
            //else
            ws = new GAMSWorkspace(workspacePath, null, DebugLevel.Off);
            GAMSDatabase db = ws.AddDatabase();

            GAMSSet[]       gSet = new GAMSSet[sheetNumber];
            GAMSParameter[] gPar = new GAMSParameter[sheetNumber];

            for (int i = 0; i < 2; i++) //前两个表设置
            {
                gSet[i] = db.AddSet(setsTemplate[i], 1, setsName[i]);
                gPar[i] = db.AddParameter(parametersTemplate[i], 1, parametersName[i]);
                for (int j = 0; j < listData[2 * i].Count; j++)
                {
                    gSet[i].AddRecord(listData[2 * i][j]);
                    gPar[i].AddRecord(listData[2 * i][j]).Value = Convert.ToDouble(listData[2 * i + 1][j]);
                }
            }
            for (int i = 2; i < 4; i++)
            {
                gPar[i] = db.AddParameter(parametersTemplate[i], 2, parametersName[i]);
                for (int j = 0; j < listData[3 * i - 2].Count; j++)
                {
                    gPar[i].AddRecord(listData[3 * i - 2][j], listData[3 * i - 1][j]).Value = Convert.ToDouble(listData[3 * i][j]);
                }
            }

            GAMSJob t = ws.AddJobFromString(GetModelText());

            using (GAMSOptions opt = ws.AddOptions())
            {
                opt.Defines.Add("gdxincname", db.Name);
                opt.AllModelTypes = "xpress";
                t.Run(opt, db);
            }
            List <string>[] resultData = GetResultData(t);

            return(resultData);
        }
        public static GAMSSet Set1D(GAMSDatabase db, string id, int size, string description = "")
        {
            var set = db.AddSet(id, 1, description);

            for (var i = 0; i < size; i++)
            {
                set.AddRecord($"{id}{i + 1}");
            }
            return(set);
        }
        public static GAMSSet[] Sets1D(GAMSDatabase db, string[] ids, int[] sizes, string[] descriptions = null)
        {
            var sets = new GAMSSet[ids.Length];

            for (var i = 0; i < ids.Length; i++)
            {
                sets[i] = Set1D(db, ids[i], sizes[i], descriptions == null ? "" : descriptions[i]);
            }
            return(sets);
        }
        public static GAMSParameter Parameter1D(GAMSDatabase db, string id, string setId, double[] values, string description = "")
        {
            var param = db.AddParameter(id, 1, description);

            for (var i = 0; i < values.Length; i++)
            {
                var rec = param.AddRecord($"{setId}{i + 1}");
                rec.Value = values[i];
            }

            return(param);
        }
Example #10
0
 public static void PrintAllResultsInPath(GAMSWorkspace ws, string path)
 {
     string[] resultFilenames = GetAllResulFilesForPath(path);
     foreach (var resultFilename in resultFilenames)
     {
         bool         enforcedOrigin = int.Parse(resultFilename.Substring(resultFilename.Length - 5, 1)) == 1;
         GAMSDatabase db             = ws.AddDatabaseFromGDX(resultFilename);
         int          instanceIx     = int.Parse(resultFilename.Replace("output_instance_", "")
                                                 .Replace($"_herkunft_{(enforcedOrigin ? "1" : "0")}.gdx", "")) - 1;
         PrintResults(db, instanceIx, enforcedOrigin);
     }
 }
Example #11
0
        private (Node, Node) GetSourceAndSink(GAMSDatabase gdxFile, Node[] nodes)
        {
            string src = gdxFile.GetSet(_str.SourceNode).FirstRecord().Keys[0];
            string snk = gdxFile.GetSet(_str.SinkNode).FirstRecord().Keys[0];

            Node sourceNode = nodes.FirstOrDefault(n => n.Label == src);
            Node sinkNode   = nodes.FirstOrDefault(n => n.Label == snk);

            if (sourceNode == null || sinkNode == null)
            {
                throw new ArgumentException("Source/Sink not defined.");
            }
            return(sourceNode, sinkNode);
        }
        public static GAMSParameter Parameter2D(GAMSDatabase db, string id, string set1Id, string set2Id, double[,] values, string description = "")
        {
            var param = db.AddParameter(id, 2, description);

            for (var i = 0; i < values.GetUpperBound(0); i++)
            {
                for (var j = 0; j < values.GetUpperBound(1); j++)
                {
                    var rec = param.AddRecord($"{set1Id}{i + 1}", $"{set2Id}{j + 1}");
                    rec.Value = values[i, j];
                }
            }

            return(param);
        }
Example #13
0
 public GAMSHelper(string source, string file)
 {
     if (!string.IsNullOrEmpty(source) && !string.IsNullOrEmpty(file))
     {
         this.GDXFileLocation = source + "\\" + file;;
         if (PathUtils.IsBaseOf(source, this.GDXFileLocation))
         {
             // check that the final file is inside the original folder
             Db = new GAMSWorkspace().AddDatabaseFromGDX(GDXFileLocation);
         }
     }
     if (Db == null)
     {
         throw new QvxPleaseSendReplyException(QvxResult.QVX_CONNECT_ERROR, "The file cannot be accessed");
     }
 }
Example #14
0
        void WriteToDatabase(GAMSWorkspace ws, GAMSDatabase db, string sInstanceID)
        {
            // connect to database
            OleDbConnection connection = null;

            try
            {
                connection = new OleDbConnection(strAccessConn);
            }
            catch (Exception ex)
            {
                lsLog.Add("Error: Failed to create a database connection. " + ex.Message);
            }

            // write levels of variable x
            WriteVariable(sInstanceID, connection, db, "x", "Plant", "Market");
        }
Example #15
0
        void WriteVariable(string sInstanceID, OleDbConnection connect, GAMSDatabase db, string varName, params string[] Domains)
        {
            try
            {
                GAMSVariable var = db.GetVariable(varName);
                if (Domains.Length != var.Dim)
                {
                    lsLog.Add("Number of column names does not match the dimension of the variable.");
                }

                connect.Open();

                // delete table varName if it exists already
                OleDbCommand cmd   = new OleDbCommand("", connect);
                string       query = "delete from Results where InstanceID = '" + sInstanceID + "';";
                cmd.CommandText = query;
                cmd.ExecuteNonQuery();
                List <string> lsQueries = new List <string>();
                foreach (GAMSVariableRecord rec in var)
                {
                    query = "insert into Results(InstanceID,";
                    foreach (string dom in Domains)
                    {
                        query += dom + ", ";
                    }
                    query += "ShipmentValue) values ('" + sInstanceID + "',";
                    foreach (string key in rec.Keys)
                    {
                        query += "'" + key + "', ";
                    }
                    query += rec.Level + ")";
                    lsQueries.Add(query);
                }
                cmd.CommandText = string.Join(";", lsQueries);
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                lsLog.Add("Error: Failed to write variable to the database." + ex.Message);
            }
            finally
            {
                connect.Close();
            }
        }
Example #16
0
        static void Main(string[] args)
        {
            GAMSWorkspace gmsWS;

            if (Environment.GetCommandLineArgs().Length > 1)
            {
                gmsWS = new GAMSWorkspace(systemDirectory: Environment.GetCommandLineArgs()[1]);
            }
            else
            {
                gmsWS = new GAMSWorkspace();
            }

            // create a GAMSDatabase for the results
            GAMSDatabase resultDB = gmsWS.AddDatabase();

            resultDB.AddParameter("objrep", 1, "Objective value");
            resultDB.AddSet("supplyMap", 3, "Supply connection with level");

            int status = 1;

            try
            {
                // run multiple parallel jobs
                Object dbLock = new Object();
                System.Threading.Tasks.Parallel.For(10, 22, delegate(int i) { SolveWarehouse(gmsWS, i, resultDB, dbLock); });
                // export the result database to a GDX file
                resultDB.Export("\\tmp\\result.gdx");
                status = 0;
            }
            catch (GAMSException ex)
            {
                Console.WriteLine("GAMSException occured: " + ex.Message);
            }
            catch (System.Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                resultDB.Dispose();
            }

            Environment.ExitCode = status;
        }
Example #17
0
        internal Graph ReadGraph(GAMSDatabase gdxFile)
        {
            Node[] nodes = ReadNodes(gdxFile);
            Arc[]  arcs  = GetArcs(gdxFile, nodes);
            Graph  graph = new Graph();

            graph.Arcs.AddRange(arcs);
            graph.Nodes.AddRange(nodes);
            (Node, Node)pair   = GetSourceAndSink(gdxFile, nodes);
            graph.StartNode    = pair.Item1;
            graph.EndNode      = pair.Item2;
            graph.ResourceInfo = new ResourceInfo()
            {
                ResCount      = 1,
                IntitalValues = new double[] { 0 }
            };
            throw new ArgumentException();
        }
Example #18
0
        private static void PrintResults(GAMSDatabase db, int instanceIx, bool enforceOrigin)
        {
            string ostr = "";

            ostr += $"Instance {instanceIx + 1} {(enforceOrigin ? "with" : "w/out")} enforced origin\n";
            ostr += $"Delays {GDXUtils.GetLevelsStr(db.GetVariable("v"))}\n";
            ostr += $"Costs:\t{db.GetVariable("f").FirstRecord().Level}\n";

            int numGoods      = db.GetSet("i").NumberRecords;
            int numComponents = db.GetSet("k").NumberRecords;

            var z    = db.GetVariable("z");
            var xint = db.GetVariable("xint");
            var x    = db.GetVariable("x");

            var orders = GetOrders(db.GetVariable("w"));

            // first good is external source (not from disassembling but instead from order)
            for (int i = 1; i < numGoods; i++)
            {
                for (int k = 0; k < numComponents; k++)
                {
                    int whenProvided = WhenProvided(x, i, k);
                    ostr += $"i{i + 1},k{k + 1}: Provided at {whenProvided} ";

                    int repairStart = GetRepairStart(z, i, k);
                    if (repairStart >= 0)
                    {
                        ostr += $";; repair starts at {repairStart}";
                    }

                    bool internallyProvided = InternallyProvided(xint, i, k);
                    if (!internallyProvided)
                    {
                        Order o = orders.First(order => order.K == k);
                        ostr += $";; ordered at {o.T}";
                    }

                    ostr += "\n";
                }
            }

            Console.WriteLine(ostr);
        }
Example #19
0
        private Arc[] GetArcs(GAMSDatabase gdxFile, Node[] nodes)
        {
            Random rand = new Random(); //for debug run

            GAMSParameter par = gdxFile.GetParameter(_str.FzMatrix);

            Arc[] arcs    = new Arc[par.NumberRecords];
            int   c       = 0;
            var   nLookup = nodes.ToDictionary(n => n.Label);

            foreach (GAMSParameterRecord rec in par)
            {
                var n1 = nLookup[rec.Keys[0]];
                var n2 = nLookup[rec.Keys[1]];
                var v  = rec.Value;
                //debug run with random dual
                Arc a = new Arc(c, n1, n2, v, v - rand.Next(0, 100), new double[] { v });
                arcs[c] = a;
                c++;
            }
            return(arcs);
        }
Example #20
0
        static void ReadSet(OleDbConnection connect, GAMSDatabase db, string strAccessSelect, string setName, int setDim, string setExp = "")
        {
            try
            {
                OleDbCommand cmd = new OleDbCommand(strAccessSelect, connect);
                connect.Open();

                OleDbDataReader reader = cmd.ExecuteReader();

                if (reader.FieldCount != setDim)
                {
                    Console.WriteLine("Number of fields in select statement does not match setDim");
                    Environment.Exit(1);
                }

                GAMSSet i = db.AddSet(setName, setDim, setExp);

                string[] keys = new string[setDim];
                while (reader.Read())
                {
                    for (int idx = 0; idx < setDim; idx++)
                    {
                        keys[idx] = reader.GetString(idx);
                    }

                    i.AddRecord(keys);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: Failed to retrieve the required data from the DataBase.\n{0}", ex.Message);
                Environment.Exit(1);
            }
            finally
            {
                connect.Close();
            }
        }
Example #21
0
        private Node[] ReadNodes(GAMSDatabase gdxFile)
        {
            var n = gdxFile.GetSet(_str.NodeSet);
            var s = gdxFile.GetParameter(_str.StartTimes);
            var e = gdxFile.GetParameter(_str.EndTimes);

            Node[] nodes = new Node[n.NumberRecords];
            double v     = 0;
            double w     = 0;
            int    c     = 0;

            foreach (GAMSSetRecord r in n)
            {
                var startTime = s.FindRecord(r.Keys);
                var endTime   = s.FindRecord(r.Keys);
                v = (startTime != null) ? startTime.Value : 0.0;
                w = (endTime != null) ? endTime.Value : 0.0;
                ResourceConstraint[] constraint = new ResourceConstraint[] { new ResourceConstraint(v, w) };
                nodes[c] = new Node(c, r.Keys[0], constraint, c, c);
                c++;
            }
            return(nodes);
        }
        public void ProcessTask(TaskManager.TaskDetails oTask, out List <string> lsLogs, out string sOutput, out string sStatus)
        {
            // cast input values
            CutStockInput oInput = new CutStockInput();

            oInput = (CutStockInput)oDF.XmlStringToObject(oTask.InputValues, oInput);

            CutStockOutput oOutput = new CutStockOutput();

            // call processing algorithm

            GAMSWorkspace ws = new GAMSWorkspace();

            lsLog.Add("working directory : " + ws.WorkingDirectory);
            // instantiate GAMSOptions and define parameters
            GAMSOptions  opt          = ws.AddOptions();
            GAMSDatabase cutstockData = ws.AddDatabase("csdata");

            opt.AllModelTypes = "Cplex";
            opt.OptCR         = 0.0; // Solve to optimality
            opt.Defines.Add("pmax", oInput.MaxPattern.ToString());
            opt.Defines.Add("solveMasterAs", "RMIP");

            GAMSSet       widths   = cutstockData.AddSet("i", 1, "widths");
            GAMSParameter rawWidth = cutstockData.AddParameter("r", 0, "raw width");
            GAMSParameter demand   = cutstockData.AddParameter("d", 1, "demand");
            GAMSParameter width    = cutstockData.AddParameter("w", 1, "width");

            rawWidth.AddRecord().Value = oInput.RawWidth;

            foreach (CutItem oI in oInput.Items)
            {
                widths.AddRecord(oI.Name);
                demand.AddRecord(oI.Name).Value = oI.Demand;
                width.AddRecord(oI.Name).Value  = oI.Width;
            }

            // create initial checkpoint
            GAMSCheckpoint masterCP      = ws.AddCheckpoint();
            GAMSJob        masterInitJob = ws.AddJobFromString(GetMasterModel());

            masterInitJob.Run(opt, masterCP, cutstockData);

            GAMSJob masterJob = ws.AddJobFromString("execute_load 'csdata', aip, pp; solve master min z using %solveMasterAs%;", masterCP);

            GAMSSet       pattern     = cutstockData.AddSet("pp", 1, "pattern index");
            GAMSParameter patternData = cutstockData.AddParameter("aip", 2, "pattern data");

            // Initial pattern: pattern i hold width i
            int patternCount = 0;

            foreach (GAMSParameterRecord rec in width)
            {
                patternData.AddRecord(rec.Keys[0], pattern.AddRecord((++patternCount).ToString()).Keys[0]).Value = (int)(oInput.RawWidth / rec.Value);
            }

            // create model instance for sub job
            GAMSCheckpoint subCP = ws.AddCheckpoint();

            ws.AddJobFromString(GetSubModel()).Run(opt, subCP, cutstockData);
            GAMSModelInstance subMI = subCP.AddModelInstance();

            // define modifier demdual
            GAMSParameter demandDual = subMI.SyncDB.AddParameter("demdual", 1, "dual of demand from master");

            subMI.Instantiate("pricing min z using mip", opt, new GAMSModifier(demandDual));

            // find new pattern
            bool patternAdded = true;

            do
            {
                masterJob.Run(opt, masterCP, cutstockData);
                // Copy duals into gmssubMI.SyncDB DB
                demandDual.Clear();
                foreach (GAMSEquationRecord dem in masterJob.OutDB.GetEquation("demand"))
                {
                    demandDual.AddRecord(dem.Keys[0]).Value = dem.Marginal;
                }

                subMI.Solve();
                if (subMI.SyncDB.GetVariable("z").FindRecord().Level < -0.00001)
                {
                    if (patternCount == oInput.MaxPattern)
                    {
                        lsLog.Add("Out of pattern. Increase maxpattern (currently " + oInput.MaxPattern + ")." + Environment.NewLine);
                        patternAdded = false;
                    }
                    else
                    {
                        lsLog.Add("New pattern! Value: " + subMI.SyncDB.GetVariable("z").FindRecord().Level + Environment.NewLine);
                        GAMSSetRecord s = pattern.AddRecord((++patternCount).ToString());
                        foreach (GAMSVariableRecord y in subMI.SyncDB.GetVariable("y"))
                        {
                            if (y.Level > 0.5)
                            {
                                patternData.AddRecord(y.Keys[0], s.Keys[0]).Value = Math.Round(y.Level);
                            }
                        }
                    }
                }
                else
                {
                    patternAdded = false;
                }
            } while (patternAdded);

            // solve final MIP
            opt.Defines["solveMasterAs"] = "MIP";
            masterJob.Run(opt, cutstockData);
            var dlevel = masterJob.OutDB.GetVariable("z").FindRecord().Level;

            oOutput.OptimalSolution = (int)dlevel;
            lsLog.Add("Optimal Solution: " + dlevel + Environment.NewLine);
            List <Pattern> lP = new List <Pattern>();

            foreach (GAMSVariableRecord xp in masterJob.OutDB.GetVariable("xp"))
            {
                string sPatternLog = "";
                if (xp.Level > 0.5)
                {
                    sPatternLog = string.Format("  pattern {0,2} {1,4} times: ", xp.Keys[0], Math.Round(xp.Level));
                    GAMSParameterRecord aip = masterJob.OutDB.GetParameter("aip").FirstRecord(" ", xp.Keys[0]);

                    Pattern oP = new Pattern()
                    {
                        Name = "pattern " + xp.Keys[0].ToString(), Count = (int)Math.Round(xp.Level)
                    };
                    List <PatternPiece> lPP = new List <PatternPiece>();
                    int    x     = 0;
                    double scale = 100 / masterJob.OutDB.GetParameter("r").FirstRecord().Value;
                    do
                    {
                        sPatternLog += " " + aip.Keys[0] + ": " + aip.Value.ToString();
                        // draw cuts
                        for (int i = 0; i < aip.Value; i++)
                        {
                            PatternPiece oPP = new PatternPiece()
                            {
                                Name  = aip.Keys[0],
                                Width = (int)(width.FindRecord(aip.Keys[0]).Value *scale),
                                Left  = x,
                                Color = oInput.Items.Where(xi => xi.Name == aip.Keys[0]).FirstOrDefault().Color
                            };
                            lPP.Add(oPP);
                            // x += oPP.Width - 1;
                            x += oPP.Width;
                        }
                    } while (aip.MoveNext());

                    if (x < 100)
                    {
                        PatternPiece oPExcess = new PatternPiece()
                        {
                            Name  = "E",
                            Width = (int)(rawWidth.FirstRecord().Value *scale - x),
                            Left  = x,
                            Color = "CCCCCC"
                        };
                        lPP.Add(oPExcess);
                    }
                    lsLog.Add(sPatternLog);
                    oP.Pieces = lPP.ToArray();
                    lP.Add(oP);
                }
            }

            oOutput.Patterns = lP.ToArray();
            // clean up of unmanaged resources
            cutstockData.Dispose();
            subMI.Dispose();
            opt.Dispose();


            sOutput = oDF.ObjectToXmlString(oOutput);
            sStatus = "completed";
            lsLogs  = lsLog;
        }
Example #23
0
        static void Main(string[] args)
        {
            GAMSWorkspace ws;

            if (Environment.GetCommandLineArgs().Length > 1)
            {
                ws = new GAMSWorkspace(systemDirectory: Environment.GetCommandLineArgs()[1]);
            }
            else
            {
                ws = new GAMSWorkspace();
            }
            // instantiate GAMSOptions and define parameters
            GAMSOptions  opt          = ws.AddOptions();
            GAMSDatabase cutstockData = ws.AddDatabase("csdata");

            opt.AllModelTypes = "Cplex";
            opt.OptCR         = 0.0; // Solve to optimality
            int maxpattern = 35;

            opt.Defines.Add("pmax", maxpattern.ToString());
            opt.Defines.Add("solveMasterAs", "RMIP");

            // define input data
            Dictionary <string, double> d = new Dictionary <string, double>()
            {
                { "i1", 97 }, { "i2", 610 }, { "i3", 395 }, { "i4", 211 }
            };
            Dictionary <string, double> w = new Dictionary <string, double>()
            {
                { "i1", 47 }, { "i2", 36 }, { "i3", 31 }, { "i4", 14 }
            };
            int r = 100; // raw width

            // cutstockData.AddSet("i", 1, "widths").AddRecords(d.Keys);
            // cutstockData.AddParameter("d", 1, "demand").AddRecords(d);
            // cutstockData.AddParameter("w", 1, "width").AddRecords(w);
            // cutstockData.AddParameter("r", 0, "raw width").AddRecord().Value = r;

            GAMSSet       widths   = cutstockData.AddSet("i", 1, "widths");
            GAMSParameter rawWidth = cutstockData.AddParameter("r", 0, "raw width");
            GAMSParameter demand   = cutstockData.AddParameter("d", 1, "demand");
            GAMSParameter width    = cutstockData.AddParameter("w", 1, "width");

            rawWidth.AddRecord().Value = r;
            foreach (string i in d.Keys)
            {
                widths.AddRecord(i);
            }
            foreach (KeyValuePair <string, double> t in d)
            {
                demand.AddRecord(t.Key).Value = t.Value;
            }
            foreach (KeyValuePair <string, double> t in w)
            {
                width.AddRecord(t.Key).Value = t.Value;
            }

            // create initial checkpoint
            GAMSCheckpoint masterCP      = ws.AddCheckpoint();
            GAMSJob        masterInitJob = ws.AddJobFromString(GetMasterModel());

            masterInitJob.Run(opt, masterCP, cutstockData);

            GAMSJob masterJob = ws.AddJobFromString("execute_load 'csdata', aip, pp; solve master min z using %solveMasterAs%;", masterCP);

            GAMSSet       pattern     = cutstockData.AddSet("pp", 1, "pattern index");
            GAMSParameter patternData = cutstockData.AddParameter("aip", 2, "pattern data");

            // Initial pattern: pattern i hold width i
            int patternCount = 0;

            foreach (KeyValuePair <string, double> t in w)
            {
                patternData.AddRecord(t.Key, pattern.AddRecord((++patternCount).ToString()).Keys[0]).Value = (int)(r / t.Value);
            }

            // create model instance for sub job
            GAMSCheckpoint subCP = ws.AddCheckpoint();

            ws.AddJobFromString(GetSubModel()).Run(opt, subCP, cutstockData);
            GAMSModelInstance subMI = subCP.AddModelInstance();

            // define modifier demdual
            GAMSParameter demandDual = subMI.SyncDB.AddParameter("demdual", 1, "dual of demand from master");

            subMI.Instantiate("pricing min z using mip", opt, new GAMSModifier(demandDual));

            // find new pattern
            bool patternAdded = true;

            do
            {
                masterJob.Run(opt, masterCP, cutstockData);
                // Copy duals into gmssubMI.SyncDB DB
                demandDual.Clear();
                foreach (GAMSEquationRecord dem in masterJob.OutDB.GetEquation("demand"))
                {
                    demandDual.AddRecord(dem.Keys[0]).Value = dem.Marginal;
                }

                subMI.Solve();
                if (subMI.SyncDB.GetVariable("z").FindRecord().Level < -0.00001)
                {
                    if (patternCount == maxpattern)
                    {
                        Console.Out.WriteLine("Out of pattern. Increase maxpattern (currently {0}).", maxpattern);
                        patternAdded = false;
                    }
                    else
                    {
                        Console.WriteLine("New patter! Value: " + subMI.SyncDB.GetVariable("z").FindRecord().Level);
                        GAMSSetRecord s = pattern.AddRecord((++patternCount).ToString());
                        foreach (GAMSVariableRecord y in subMI.SyncDB.GetVariable("y"))
                        {
                            if (y.Level > 0.5)
                            {
                                patternData.AddRecord(y.Keys[0], s.Keys[0]).Value = Math.Round(y.Level);
                            }
                        }
                    }
                }
                else
                {
                    patternAdded = false;
                }
            } while (patternAdded);

            // solve final MIP
            opt.Defines["solveMasterAs"] = "MIP";
            masterJob.Run(opt, cutstockData);
            Console.WriteLine("Optimal Solution: {0}", masterJob.OutDB.GetVariable("z").FindRecord().Level);
            foreach (GAMSVariableRecord xp in masterJob.OutDB.GetVariable("xp"))
            {
                if (xp.Level > 0.5)
                {
                    Console.Out.Write("  pattern {0} {1} times: ", xp.Keys[0], xp.Level);
                    GAMSParameterRecord aip = masterJob.OutDB.GetParameter("aip").FirstRecord(" ", xp.Keys[0]);
                    do
                    {
                        Console.Out.Write(" {0}: {1}", aip.Keys[0], aip.Value);
                    } while (aip.MoveNext());
                    Console.Out.WriteLine();
                }
            }
            // clean up of unmanaged ressources
            cutstockData.Dispose();
            subMI.Dispose();
            opt.Dispose();
        }
Example #24
0
        static void ReadSet(OleDbConnection connect, GAMSDatabase db, string strAccessSelect, string setName, int setDim, string setExp = "")
        {
            try
            {
                OleDbCommand cmd = new OleDbCommand(strAccessSelect, connect);
                connect.Open();

                OleDbDataReader reader = cmd.ExecuteReader();

                if (reader.FieldCount != setDim)
                {
                    Console.WriteLine("Number of fields in select statement does not match setDim");
                    Environment.Exit(1);
                }

                GAMSSet i = db.AddSet(setName, setDim, setExp);

                string[] keys = new string[setDim];
                while (reader.Read())
                {
                    for (int idx = 0; idx < setDim; idx++)
                        keys[idx] = reader.GetString(idx);

                    i.AddRecord(keys);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: Failed to retrieve the required data from the DataBase.\n{0}", ex.Message);
                Environment.Exit(1);
            }
            finally
            {
                connect.Close();
            }
        }
Example #25
0
        static void ReadParameter(OleDbConnection connect, GAMSDatabase db, string strAccessSelect, string parName, int parDim, string parExp = "")
        {
            try
            {
                OleDbCommand cmd = new OleDbCommand(strAccessSelect, connect);
                connect.Open();

                OleDbDataReader reader = cmd.ExecuteReader();

                if (reader.FieldCount != parDim+1)
                {
                    Console.WriteLine("Number of fields in select statement does not match parDim+1");
                    Environment.Exit(1);
                }

                GAMSParameter a = db.AddParameter(parName, parDim, parExp);

                string[] keys = new string[parDim];
                while (reader.Read())
                {
                    for (int idx = 0; idx < parDim; idx++)
                        keys[idx] = reader.GetString(idx);

                    a.AddRecord(keys).Value = Convert.ToDouble(reader.GetValue(parDim));
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: Failed to retrieve the required data from the DataBase.\n{0}", ex.Message);
                Environment.Exit(1);
            }
            finally
            {
                connect.Close();
            }
        }
Example #26
0
        private static void SolveWarehouse(GAMSWorkspace gmsWS, int NumberOfWarehouses, GAMSDatabase result, Object dbMutex)
        {
            // instantiate GAMSOptions and define some scalars
            GAMSOptions gmsOpt = gmsWS.AddOptions();
            gmsOpt.AllModelTypes = "Gurobi";
            gmsOpt.Defines.Add("Warehouse", NumberOfWarehouses.ToString());
            gmsOpt.Defines.Add("Store", "65");
            gmsOpt.Defines.Add("fixed", "22");
            gmsOpt.Defines.Add("disaggregate", "0");
            gmsOpt.OptCR = 0.0; // Solve to optimality

            // create a GAMSJob from string and write results to the result database
            GAMSJob gmsJ = gmsWS.AddJobFromString(GetModelText());
            gmsJ.Run(gmsOpt);

            // need to lock database write operations
            lock (dbMutex)
                result.GetParameter("objrep").AddRecord(NumberOfWarehouses.ToString()).Value = gmsJ.OutDB.GetVariable("obj").FindRecord().Level;

            foreach (GAMSVariableRecord supplyRec in gmsJ.OutDB.GetVariable("supply"))
                if (supplyRec.Level > 0.5)
                    lock(dbMutex)
                        result.GetSet("supplyMap").AddRecord(NumberOfWarehouses.ToString(), supplyRec.Keys[0], supplyRec.Keys[1]);
        }
        public static GAMSParameter Parameter1D(GAMSDatabase db, string id, string setId, double value, int repeatCount, string description = "")
        {
            var values = Enumerable.Repeat(value, repeatCount).ToArray();

            return(Parameter1D(db, id, setId, values, description));
        }
Example #28
0
        static void Main(string[] args)
        {
            // Create a save/restart file usually supplied by an application provider
            // We create it for demonstration purpose
            string wDir = Path.Combine(".", "tmp");

            CreateSaveRestart(Path.Combine(wDir, "tbase"));

            // define some data by using C# data structures
            List <string> plants = new List <string>()
            {
                "Seattle", "San-Diego"
            };
            List <string> markets = new List <string>()
            {
                "New-York", "Chicago", "Topeka"
            };
            Dictionary <string, double> capacity = new Dictionary <string, double>()
            {
                { "Seattle", 350.0 }, { "San-Diego", 600.0 }
            };
            Dictionary <string, double> demand = new Dictionary <string, double>()
            {
                { "New-York", 325.0 }, { "Chicago", 300.0 }, { "Topeka", 275.0 }
            };
            Dictionary <Tuple <string, string>, double> distance = new Dictionary <Tuple <string, string>, double>()
            {
                { new Tuple <string, string> ("Seattle", "New-York"), 2.5 },
                { new Tuple <string, string> ("Seattle", "Chicago"), 1.7 },
                { new Tuple <string, string> ("Seattle", "Topeka"), 1.8 },
                { new Tuple <string, string> ("San-Diego", "New-York"), 2.5 },
                { new Tuple <string, string> ("San-Diego", "Chicago"), 1.8 },
                { new Tuple <string, string> ("San-Diego", "Topeka"), 1.4 }
            };

            GAMSWorkspace ws;

            if (Environment.GetCommandLineArgs().Length > 1)
            {
                ws = new GAMSWorkspace(workingDirectory: wDir, systemDirectory: Environment.GetCommandLineArgs()[1]);
            }
            else
            {
                ws = new GAMSWorkspace(workingDirectory: wDir);
            }
            // prepare a GAMSDatabase with data from the C# data structures
            GAMSDatabase db = ws.AddDatabase();

            GAMSSet i = db.AddSet("i", 1, "canning plants");

            foreach (string p in plants)
            {
                i.AddRecord(p);
            }

            GAMSSet j = db.AddSet("j", 1, "markets");

            foreach (string m in markets)
            {
                j.AddRecord(m);
            }

            GAMSParameter a = db.AddParameter("a", 1, "capacity of plant i in cases");

            foreach (string p in plants)
            {
                a.AddRecord(p).Value = capacity[p];
            }

            GAMSParameter b = db.AddParameter("b", 1, "demand at market j in cases");

            foreach (string m in markets)
            {
                b.AddRecord(m).Value = demand[m];
            }

            GAMSParameter d = db.AddParameter("d", 2, "distance in thousands of miles");

            foreach (Tuple <string, string> t in distance.Keys)
            {
                d.AddRecord(t.Item1, t.Item2).Value = distance[t];
            }

            GAMSParameter f = db.AddParameter("f", 0, "freight in dollars per case per thousand miles");

            f.AddRecord().Value = 90;

            // run a job using data from the created GAMSDatabase
            GAMSCheckpoint cpBase = ws.AddCheckpoint("tbase");

            using (GAMSOptions opt = ws.AddOptions())
            {
                GAMSJob t4 = ws.AddJobFromString(GetModelText(), cpBase);
                opt.Defines.Add("gdxincname", db.Name);
                opt.AllModelTypes = "xpress";
                t4.Run(opt, db);
                foreach (GAMSVariableRecord rec in t4.OutDB.GetVariable("x"))
                {
                    Console.WriteLine("x(" + rec.Keys[0] + "," + rec.Keys[1] + "): level=" + rec.Level + " marginal=" + rec.Marginal);
                }
            }
        }
Example #29
0
        static void Main(string[] args)
        {
            // Reading input data from workbook
            var excelApp = new Excel.Application();

            Excel.Workbook wb = excelApp.Workbooks.Open(Directory.GetCurrentDirectory() + @"\..\..\..\..\Data\transport.xls");

            Excel.Range range;

            Excel.Worksheet capacity = (Excel.Worksheet)wb.Worksheets.get_Item("capacity");
            range = capacity.UsedRange;
            Array capacityData = (Array)range.Cells.Value;
            int   iCount       = capacity.UsedRange.Columns.Count;

            Excel.Worksheet demand = (Excel.Worksheet)wb.Worksheets.get_Item("demand");
            range = demand.UsedRange;
            Array demandData = (Array)range.Cells.Value;
            int   jCount     = range.Columns.Count;

            Excel.Worksheet distance = (Excel.Worksheet)wb.Worksheets.get_Item("distance");
            range = distance.UsedRange;
            Array distanceData = (Array)range.Cells.Value;

            // number of markets/plants have to be the same in all spreadsheets
            Debug.Assert((range.Columns.Count - 1) == jCount && (range.Rows.Count - 1) == iCount,
                         "Size of the spreadsheets doesn't match");
            wb.Close();

            // Creating the GAMSDatabase and fill with the workbook data
            GAMSWorkspace ws;

            if (Environment.GetCommandLineArgs().Length > 1)
            {
                ws = new GAMSWorkspace(systemDirectory: Environment.GetCommandLineArgs()[1]);
            }
            else
            {
                ws = new GAMSWorkspace();
            }
            GAMSDatabase db = ws.AddDatabase();

            GAMSSet       i             = db.AddSet("i", 1, "Plants");
            GAMSSet       j             = db.AddSet("j", 1, "Markets");
            GAMSParameter capacityParam = db.AddParameter("a", 1, "Capacity");
            GAMSParameter demandParam   = db.AddParameter("b", 1, "Demand");
            GAMSParameter distanceParam = db.AddParameter("d", 2, "Distance");

            for (int ic = 1; ic <= iCount; ic++)
            {
                i.AddRecord((string)capacityData.GetValue(1, ic));
                capacityParam.AddRecord((string)capacityData.GetValue(1, ic)).Value = (double)capacityData.GetValue(2, ic);
            }
            for (int jc = 1; jc <= jCount; jc++)
            {
                j.AddRecord((string)demandData.GetValue(1, jc));
                demandParam.AddRecord((string)demandData.GetValue(1, jc)).Value = (double)demandData.GetValue(2, jc);
                for (int ic = 1; ic <= iCount; ic++)
                {
                    distanceParam.AddRecord((string)distanceData.GetValue(ic + 1, 1), (string)distanceData.GetValue(1, jc + 1)).Value = (double)distanceData.GetValue(ic + 1, jc + 1);
                }
            }

            // Create and run the GAMSJob
            using (GAMSOptions opt = ws.AddOptions())
            {
                GAMSJob t10 = ws.AddJobFromString(GetModelText());
                opt.Defines.Add("gdxincname", db.Name);
                opt.AllModelTypes = "xpress";
                t10.Run(opt, db);
                foreach (GAMSVariableRecord rec in t10.OutDB.GetVariable("x"))
                {
                    Console.WriteLine("x(" + rec.Keys[0] + "," + rec.Keys[1] + "): level=" + rec.Level + " marginal=" + rec.Marginal);
                }
            }
        }
Example #30
0
        private static void SolveWarehouse(GAMSWorkspace gmsWS, int NumberOfWarehouses, GAMSDatabase result, Object dbMutex)
        {
            // instantiate GAMSOptions and define some scalars
            GAMSOptions gmsOpt = gmsWS.AddOptions();

            gmsOpt.AllModelTypes = "Gurobi";
            gmsOpt.Defines.Add("Warehouse", NumberOfWarehouses.ToString());
            gmsOpt.Defines.Add("Store", "65");
            gmsOpt.Defines.Add("fixed", "22");
            gmsOpt.Defines.Add("disaggregate", "0");
            gmsOpt.OptCR = 0.0; // Solve to optimality

            // create a GAMSJob from string and write results to the result database
            GAMSJob gmsJ = gmsWS.AddJobFromString(GetModelText());

            gmsJ.Run(gmsOpt);

            // need to lock database write operations
            lock (dbMutex)
                result.GetParameter("objrep").AddRecord(NumberOfWarehouses.ToString()).Value = gmsJ.OutDB.GetVariable("obj").FindRecord().Level;

            foreach (GAMSVariableRecord supplyRec in gmsJ.OutDB.GetVariable("supply"))
            {
                if (supplyRec.Level > 0.5)
                {
                    lock (dbMutex)
                        result.GetSet("supplyMap").AddRecord(NumberOfWarehouses.ToString(), supplyRec.Keys[0], supplyRec.Keys[1]);
                }
            }
        }
Example #31
0
        static void Main(string[] args)
        {
            GAMSWorkspace ws;

            if (Environment.GetCommandLineArgs().Length > 1)
            {
                ws = new GAMSWorkspace(systemDirectory: Environment.GetCommandLineArgs()[1]);
            }
            else
            {
                ws = new GAMSWorkspace();
            }
            GAMSCheckpoint cp = ws.AddCheckpoint();

            // initialize a GAMSCheckpoint by running a GAMSJob
            GAMSJob t12 = ws.AddJobFromString(GetModelText());

            t12.Run(cp);

            // create a GAMSModelInstance and solve it multiple times with different scalar bmult
            GAMSModelInstance mi = cp.AddModelInstance();

            double[] bmultlist = new double[] { 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3 };

            GAMSDatabase db = ws.AddDatabase();

            GAMSSet       scen  = db.AddSet("scen", 1, "");
            GAMSParameter bmult = db.AddParameter("bmultlist", 1, "");
            GAMSParameter zscen = db.AddParameter("zscen", 1, "");

            int i = 0;

            foreach (double b in bmultlist)
            {
                bmult.AddRecord("s" + i).Value = b;
                scen.AddRecord("s" + i++);
            }

            GAMSSet dict = db.AddSet("dict", 3, "");

            dict.AddRecord(scen.Name, "scenario", "");
            dict.AddRecord("bmult", "param", bmult.Name);
            dict.AddRecord("z", "level", zscen.Name);


            GUSSCall(dict, mi, "transport us lp min z");

            foreach (GAMSParameterRecord rec in db.GetParameter(zscen.Name))
            {
                Console.WriteLine(rec.Keys[0] + " obj: " + rec.Value);
            }

            //*******************

            GAMSModelInstance mi2 = cp.AddModelInstance();
            GAMSDatabase      db2 = ws.AddDatabase();

            GAMSSet       scen2  = db2.AddSet("scen", 1, "");
            GAMSParameter zscen2 = db2.AddParameter("zscen", 1, "");
            GAMSParameter xup    = db2.AddParameter("xup", 3, "");

            for (int j = 0; j < 4; j++)
            {
                foreach (GAMSSetRecord irec in t12.OutDB.GetSet("i"))
                {
                    foreach (GAMSSetRecord jrec in t12.OutDB.GetSet("j"))
                    {
                        xup.AddRecord("s" + j, irec.Keys[0], jrec.Keys[0]).Value = j + 1;
                    }
                }
                scen2.AddRecord("s" + j);
            }


            GAMSSet dict2 = db2.AddSet("dict", 3, "");

            dict2.AddRecord(scen2.Name, "scenario", "");
            dict2.AddRecord("x", "lower", xup.Name);
            dict2.AddRecord("z", "level", zscen2.Name);

            GUSSCall(dict2, mi2, "transport us lp min z", output: Console.Out);

            foreach (GAMSParameterRecord rec in db2.GetParameter(zscen2.Name))
            {
                Console.WriteLine(rec.Keys[0] + " obj: " + rec.Value);
            }
        }