Implementation of the Simplex algorithm in Visual C++

An excellent implementation of the Simplex algorithm exists over at Google Code, written by Tommaso Urli: https://code.google.com/p/cpplex/ Implemented as class library, it relies on no other dependencies other than the C++ Standard Library. I've taken this implementation and compiled it as a Visual Studio application. The only slight modification I needed was to insert: [code language="cpp"]#include <algorithm>[/code] into matrix.cpp then it compiled std::max just fine. The project is able to load formatted problems in the form: [code language="text"] [METADATA] name Simple problem vars 3 [VARIABLES] 0 x1 4 -2 x2 inf -3 x3 232 [CONSTRAINTS] 1 3 4 > 0 0 0 1 < 1 1 2 0 < 2 [OBJECTIVE] maximize 1 3 1 [/code] Defining your constraints is simple. A constraint of the form: [code language="text"] 1 3 4 > 0 [/code] Actually means that we want the value of [code language="text"] x1 + 3*x2 + 4*x3 [/code] to be greater than zero. An objective function of the form: [code language="text"] maximize 1 3 1 [/code] Attempts to maximize the expression: x1 + 3*x2 + x3. Minimize is also available. Running the programs requires that the name of the problem is provided. This application comes with three example problems: "small.problem", "template.problem" and "test.problem". The sample problems can be run via the command line eg Alternatively in Visual Studio you can supply the same of the test problem as a command line argument. Right-click on the project, select Properties and set the command line argument in the Debugging section: Here are the test problems and their outputs: test.problem [code language="text"] [METADATA] name This is a small test problem vars 5 [VARIABLES] 0 x1 inf 2.1 x2 4.1 23.4 x3 30 -2.2 x4 3 inf x5 104.3 [CONSTRAINTS] 1 3 1 1 0 < 43 [OBJECTIVE] maximize 1 1 2 1 1 [/code] template.problem [code language="text"] [METADATA] name Nome del problema vars 10 [VARIABLES] 0 variable_1 0.2 0 variable_2 0.1 0 variable_3 1 -2 variable_4 1 -4 variable_5 1 inf variable_6 inf inf variable_7 inf -4 variable_8 1 4 variable_9 3 8 variable_10 inf [CONSTRAINTS] 1 2 0 0 1 0 2 3 2 1 > 2 -2 0 0 0 1 1 1 2 5 1 < 10 [OBJECTIVE] minimize 0 0 0 0 0 0 0 0 1 1 [/code] small.problem [code language="text"] [METADATA] name Problema semplice vars 3 [VARIABLES] 0 x1 4 -2 x2 inf -3 x3 232 [CONSTRAINTS] 1 3 4 > 0 0 0 1 < 1 1 2 0 < 2 [OBJECTIVE] maximize 1 3 1 [/code] brunel.problem Another example, this time from J E Beasley's Operational Research page at the Brunel University website: http://people.brunel.ac.uk/~mastjjb/jeb/or/morelp.html An example Linear Programming problem is formulated as follows: x1 be the number of units of product 1 produced x2 be the number of units of product 2 produced where [code language="text"] x1, x2 <= 0 [/code] The constraints are: [code language="cpp"] 15x1 + 7x2 <= 20* 60 (machine X) 25x1 + 45x2 <= 15 * 60 (machine Y) x1 <= 37 demand for product 1 x2 <= 14 demand for product 2 maximize 13x1 + 5x2 - 125 [/code] This is encoded into the following brunel.problem file: [code language="text"] [METADATA] name http://people.brunel.ac.uk/~mastjjb/jeb/or/morelp.html vars 2 [VARIABLES] 0 x1 37 0 x2 14 [CONSTRAINTS] 15 7 < 1200 25 45 < 900 [OBJECTIVE] maximize 13 5 -125 [/code] The result upon running this is: x1 = 36 x2 = 0 Giving the total profit as 13x1 + 5x2 - 125 = 13(36) + 5(0) - 125 = £343 as anticipated. Visual Studio 2010 project downloadable from here: https://www.technical-recipes.com/Downloads/Simplex.zip

Comments

Popular posts from this blog

Using the Supervisor Controller Pattern to access View controls in MVVM

Getting started with Tesseract optical character recognition (OCR) library in Visual Studio

How to send an e-mail via Google SMTP using C#