https://github.com/davidstutz/php-simplex
PHP library implementing the simplex algorithm.
https://github.com/davidstutz/php-simplex
convex-optimization php simplex
Last synced: 8 months ago
JSON representation
PHP library implementing the simplex algorithm.
- Host: GitHub
- URL: https://github.com/davidstutz/php-simplex
- Owner: davidstutz
- License: other
- Created: 2014-10-30T21:18:24.000Z (about 11 years ago)
- Default Branch: master
- Last Pushed: 2015-02-18T03:01:07.000Z (almost 11 years ago)
- Last Synced: 2025-04-02T21:42:40.537Z (9 months ago)
- Topics: convex-optimization, php, simplex
- Language: PHP
- Size: 172 KB
- Stars: 5
- Watchers: 2
- Forks: 3
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
# PHP Simplex
The simplex algorithm implemented in PHP. This library was developed as part of the programming assignments of the course ["Linear and Integer Programming"](https://www.coursera.org/course/linearprogramming) on [Coursera](https://www.coursera.org/).
## Data Format
The data used for testing is provided as course material of ["Linear and Integer Programming"](https://www.coursera.org/course/linearprogramming) on [Coursera](https://www.coursera.org/). The dictionary format for a linear program in standard form
max c^T x
s.t. A x <= b
x >= 0
is as follows:
[1] m n
[2] B_1 B_2 ... B_m
[3] N_1 N_2 ... N_n
[4] b_1 ... b_m
[5] a_11 ... a_1n
[6] a_21 ... a_2n
...
[m + 4] a_m1 ... a_mn
[m + 5] c_0 c_1 ... c_n
The numbers in brackets denote the line numbers such that there is a total of `m + 5` lines where `m` is the number of basic variables and `n` the number of non-basic variables of the dictionary. Further, `B_1` to `B_m` are the indices of the `m` basic variables and `N_1` to `N_n` are the indices of the non-basic variables. The following lines contain the vector `b`, the matrix `A` the current objective value of the dictionary `c_0` (mostly zero) and the vector `c`.
## Usage
First, make sure to include all required files:
require_once('vendor/php-matrix-decompositions/lib/Assertion.php');
require_once('vendor/php-matrix-decompositions/lib/Vector.php');
require_once('vendor/php-matrix-decompositions/lib/Matrix.php');
require_once('lib/DictionaryIO.php');
require_once('lib/Dictionary.php');
The Simplex implementation is based on the Matrix and Vector classes provided by [https://github.com/davidstutz/php-matrix-decompositions](https://github.com/davidstutz/php-matrix-decompositions). A dictionary can be directly loaded using the `DirectoryIO` class if the directory is saved in the format given above. The complete example can be found in `example.cpp`.
// Load dictionary from file.
$dictionary = DictionaryIO::read('data/part' . $i . '.dict');
$output = 'data/part' . $i . '.dict: ';
// If the dictionary is not feasible initially, it is either
// infeasible, unbounded or needs to be initialized.
if (!$dictionary->isFeasible()) {
if ($dictionary->initialize() === FALSE) {
$output .= 'INFEASIBLE';
}
else {
$dictionary->optimize();
if ($dictionary->isUnbounded()) {
$output .= 'UNBOUNDED';
}
else {
$output .= $dictionary->getc0();
}
}
}
// After initialization, the dictionary could still turn out
// to be unbounded.
elseif ($dictionary->isUnbounded()) {
$output .= 'UNBOUNDED';
}
// Try to optimize the dictionary:
else {
$optValue = $dictionary->optimize();
if ($optValue === FALSE) {
if ($dictionary->isUnbounded()) {
$output .= 'UNBOUNDED';
}
elseif (!$dictionary->isFeasible()) {
$output .= 'INFEASIBLE';
}
}
else {
$output .= $optValue;
}
}
echo $output . '
';
## License
Copyright 2014 David Stutz
The library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
The library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.