Skip to main content

可以打印单纯形表的LP求解器!

Project description

FDSMLP 线性规划求解器!

时间有限,制作了用两阶段法完成线性规划的方法。

求解器可以输出具体的单纯形表解题步骤,做作业利器!

使用

0 库的安装

直接pip

pip install FDSMLP -i https://pypi.org/project

1 库的导入

from FDSMLP.Simplex import Two_step_simplex

2 使用

A = [
    [1, 1, 2], 
    [-1 2, 1],
    [1, 0, -2]
]# 约束条件方程
b = [1, 3, -1]# 目标函数系数,数量可以比A的列数少,会自动补全为0
constrain = [4, 4, 5]# 约束条件右侧的常量
constraints =["<=","=",">="]#  约束条件方程的符号,支持不等号,会自动初始化为标准型
      
# 两阶段法求解器的初始化  
simplex=Two_step_simplex(b,A,constrain,constraints)

3 设置单纯形表的打印风格,可以设置每一格的输出宽度

例:

simplex.set_cell_width(11)
print(simplex)

单纯形表打印结果:

           |           |           |   1.000   |   3.000   |  -1.000   |   0.000   |   0.000   |   0.000   |   0.000   |
-------------------------------------------------------------------------------------------------------------------------
    CB     |    XB     |     b     |    X1     |    X2     |    X3     |    X4     |    X5     |    X6     |    X7     |
-------------------------------------------------------------------------------------------------------------------------
     0     |    X4     |   4.000   |   1.000   |   1.000   |   2.000   |   1.000   |   0.000   |   0.000   |   0.000   |
     0     |    X6     |   4.000   |  -1.000   |   2.000   |   1.000   |   0.000   |   0.000   |   1.000   |   0.000   |
     0     |    X7     |   5.000   |   1.000   |   0.000   |  -2.000   |   0.000   |  -1.000   |   0.000   |   1.000   |
-------------------------------------------------------------------------------------------------------------------------
           |           |           |   1.000   |   3.000   |   1.000   |   1.000   |  -1.000   |   0.000   |   0.000   |

-------------------------------------------------------------------------------------------------------------------------
simplex.set_cell_width(6)
print(simplex)

单纯形表打印结果:

      |      |      |1.000 |3.000 |-1.000|0.000 |0.000 |0.000 |0.000 |
-----------------------------------------------------------------------
  CB  |  XB  |  b   |  X1  |  X2  |  X3  |  X4  |  X5  |  X6  |  X7  |
-----------------------------------------------------------------------
  0   |  X4  |4.000 |1.000 |1.000 |2.000 |1.000 |0.000 |0.000 |0.000 |
  0   |  X6  |4.000 |-1.000|2.000 |1.000 |0.000 |0.000 |1.000 |0.000 |
  0   |  X7  |5.000 |1.000 |0.000 |-2.000|0.000 |-1.000|0.000 |1.000 |
-----------------------------------------------------------------------
      |      |      |1.000 |3.000 |1.000 |1.000 |-1.000|0.000 |0.000 |

-----------------------------------------------------------------------

4 求解

from FDSMLP.Simplex import Two_step_simplex

A = [
    [0, 1, 2, 1, 0], 
    [-1, 2, 1, 1, 1],
    [3, 0, 3, 1, 0], 
]
b = [1, 3, -1]
constrain = [4, 4, 4]
constraints =["=","=","="]
simplex=Two_step_simplex(b,A,constrain,constraints)
simplex.solve()

输出结果:

开始执行两步法进行线性规划求解:
原始目标函数为:
max y = 1 * X1 + 3 * X2 - 1 * X3 - 0 * X4 - 0 * X5
原始约束条件为:
 0 * X1 + 1 * X2 + 2 * X3 + 1 * X4 + 0 * X5 = 4
 - 1 * X1 + 2 * X2 + 1 * X3 + 1 * X4 + 1 * X5 = 4
 3 * X1 + 0 * X2 + 3 * X3 + 1 * X4 + 0 * X5 = 4

进行标准化后的目标函数为:
max y = 1 * X1 + 3 * X2 - 1 * X3 - 0 * X4 - 0 * X5
标准化后得约束条件为:
 0 * X1 + 1 * X2 + 2 * X3 + 1 * X4 + 0 * X5 = 4
 - 1 * X1 + 2 * X2 + 1 * X3 + 1 * X4 + 1 * X5 = 4
 3 * X1 + 0 * X2 + 3 * X3 + 1 * X4 + 0 * X5 = 4

使用两步法修改目标函数为:
max y = 2 * X1 + 3 * X2 + 6 * X3 + 3 * X4 + 1 * X5 - 0 * X6 - 0 * X7
使用两步法修改约束条件为:
 0 * X1 + 1 * X2 + 2 * X3 + 1 * X4 + 0 * X5 + 1 * X6 + 0 * X7 = 4
 - 1 * X1 + 2 * X2 + 1 * X3 + 1 * X4 + 1 * X5 + 0 * X6 + 0 * X7 = 4
 3 * X1 + 0 * X2 + 3 * X3 + 1 * X4 + 0 * X5 + 0 * X6 + 1 * X7 = 4

初始化单纯形表后结果如下:
           |           |           |   1.000   |   3.000   |  -1.000   |   0.000   |   0.000   |   0.000   |   0.000   |
-------------------------------------------------------------------------------------------------------------------------
    CB     |    XB     |     b     |    X1     |    X2     |    X3     |    X4     |    X5     |    X6     |    X7     |
-------------------------------------------------------------------------------------------------------------------------
     0     |    X6     |   4.000   |   0.000   |   1.000   |   2.000   |   1.000   |   0.000   |   1.000   |   0.000   |
     0     |    X5     |   4.000   |  -1.000   |   2.000   |   1.000   |   1.000   |   1.000   |   0.000   |   0.000   |
     0     |    X7     |   4.000   |   3.000   |   0.000   |   3.000   |   1.000   |   0.000   |   0.000   |   1.000   |
-------------------------------------------------------------------------------------------------------------------------
           |           |           |   2.000   |   3.000   |   6.000   |   3.000   |   1.000   |   0.000   |   0.000   |

-------------------------------------------------------------------------------------------------------------------------


开始进行第一阶段运算:
           |           |           |   1.000   |   3.000   |  -1.000   |   0.000   |   0.000   |   0.000   |   0.000   |
-------------------------------------------------------------------------------------------------------------------------
    CB     |    XB     |     b     |    X1     |    X2     |    X3     |    X4     |    X5     |    X6     |    X7     |
-------------------------------------------------------------------------------------------------------------------------
     0     |    X6     |   4.000   |   0.000   |   1.000   |   2.000   |   1.000   |   0.000   |   1.000   |   0.000   |
     0     |    X5     |   4.000   |  -1.000   |   2.000   |   1.000   |   1.000   |   1.000   |   0.000   |   0.000   |
     0     |    X7     |   4.000   |   3.000   |   0.000   |   3.000   |   1.000   |   0.000   |   0.000   |   1.000   |
-------------------------------------------------------------------------------------------------------------------------
           |           |           |   2.000   |   3.000   |   6.000   |   3.000   |   1.000   |   0.000   |   0.000   |

-------------------------------------------------------------------------------------------------------------------------


以X3为入基变量,X7为出基变量进行转轴计算,得:

           |           |           |   1.000   |   3.000   |  -1.000   |   0.000   |   0.000   |   0.000   |   0.000   |
-------------------------------------------------------------------------------------------------------------------------
    CB     |    XB     |     b     |    X1     |    X2     |    X3     |    X4     |    X5     |    X6     |    X7     |
-------------------------------------------------------------------------------------------------------------------------
     0     |    X6     |   1.333   |  -2.000   |   1.000   |   0.000   |   0.333   |   0.000   |   1.000   |  -0.667   |
     0     |    X5     |   2.667   |  -2.000   |   2.000   |   0.000   |   0.667   |   1.000   |   0.000   |  -0.333   |
    -1     |    X3     |   1.333   |   1.000   |   0.000   |   1.000   |   0.333   |   0.000   |   0.000   |   0.333   |
-------------------------------------------------------------------------------------------------------------------------
           |           |           |  -4.000   |   3.000   |   0.000   |   1.000   |   1.000   |   0.000   |  -2.000   |

-------------------------------------------------------------------------------------------------------------------------


以X2为入基变量,X5为出基变量进行转轴计算,得:

           |           |           |   1.000   |   3.000   |  -1.000   |   0.000   |   0.000   |   0.000   |   0.000   |
-------------------------------------------------------------------------------------------------------------------------
    CB     |    XB     |     b     |    X1     |    X2     |    X3     |    X4     |    X5     |    X6     |    X7     |
-------------------------------------------------------------------------------------------------------------------------
     0     |    X6     |   0.000   |  -1.000   |   0.000   |   0.000   |   0.000   |  -0.500   |   1.000   |  -0.500   |
     3     |    X2     |   1.333   |  -1.000   |   1.000   |   0.000   |   0.333   |   0.500   |   0.000   |  -0.167   |
    -1     |    X3     |   1.333   |   1.000   |   0.000   |   1.000   |   0.333   |   0.000   |   0.000   |   0.333   |
-------------------------------------------------------------------------------------------------------------------------
           |           |           |  -1.000   |   0.000   |   0.000   |   0.000   |  -0.500   |   0.000   |  -1.500   |

-------------------------------------------------------------------------------------------------------------------------


第一阶段算法执行完毕,得到如上结果,此时的检验数结果为:[5.0, 0.0, 0.0, -0.6666666666666667, -1.5, 0.0, 0.8333333333333333]

人工变量X6在基变量中,进行判断
人工变量对应行的原始决策变量约束存在不为0的值,直接删除所有人工变量和基变量人工变量对应的行
           |           |           |   1.000   |   3.000   |  -1.000   |   0.000   |   0.000   |   0.000   |   0.000   |
-------------------------------------------------------------------------------------------------------------------------
    CB     |    XB     |     b     |    X1     |    X2     |    X3     |    X4     |    X5     |    X6     |    X7     |
-------------------------------------------------------------------------------------------------------------------------
     0     |    X6     |   0.000   |  -1.000   |   0.000   |   0.000   |   0.000   |  -0.500   |   1.000   |  -0.500   |
     3     |    X2     |   1.333   |  -1.000   |   1.000   |   0.000   |   0.333   |   0.500   |   0.000   |  -0.167   |
    -1     |    X3     |   1.333   |   1.000   |   0.000   |   1.000   |   0.333   |   0.000   |   0.000   |   0.333   |
-------------------------------------------------------------------------------------------------------------------------
           |           |           |   5.000   |   0.000   |   0.000   |  -0.667   |  -1.500   |   0.000   |   0.833   |

-------------------------------------------------------------------------------------------------------------------------


以X1为入基变量,X6为出基变量进行转轴计算,得:

           |           |           |   1.000   |   3.000   |  -1.000   |   0.000   |   0.000   |   0.000   |   0.000   |
-------------------------------------------------------------------------------------------------------------------------
    CB     |    XB     |     b     |    X1     |    X2     |    X3     |    X4     |    X5     |    X6     |    X7     |
-------------------------------------------------------------------------------------------------------------------------
     1     |    X1     |  -0.000   |   1.000   |  -0.000   |  -0.000   |  -0.000   |   0.500   |  -1.000   |   0.500   |
     3     |    X2     |   1.333   |   0.000   |   1.000   |   0.000   |   0.333   |   1.000   |  -1.000   |   0.333   |
    -1     |    X3     |   1.333   |   0.000   |   0.000   |   1.000   |   0.333   |  -0.500   |   1.000   |  -0.167   |
-------------------------------------------------------------------------------------------------------------------------
           |           |           |   0.000   |   0.000   |   0.000   |  -0.667   |  -4.000   |   5.000   |  -1.667   |

-------------------------------------------------------------------------------------------------------------------------


以X5为入基变量,X1为出基变量进行转轴计算,得:

           |           |           |   1.000   |   3.000   |  -1.000   |   0.000   |   0.000   |   0.000   |   0.000   |
-------------------------------------------------------------------------------------------------------------------------
    CB     |    XB     |     b     |    X1     |    X2     |    X3     |    X4     |    X5     |    X6     |    X7     |
-------------------------------------------------------------------------------------------------------------------------
     0     |    X5     |  -0.000   |   2.000   |  -0.000   |  -0.000   |  -0.000   |   1.000   |  -2.000   |   1.000   |
     3     |    X2     |   1.333   |  -2.000   |   1.000   |   0.000   |   0.333   |   0.000   |   1.000   |  -0.667   |
    -1     |    X3     |   1.333   |   1.000   |   0.000   |   1.000   |   0.333   |   0.000   |   0.000   |   0.333   |
-------------------------------------------------------------------------------------------------------------------------
           |           |           |   8.000   |   0.000   |   0.000   |  -0.667   |   0.000   |  -3.000   |   2.333   |

-------------------------------------------------------------------------------------------------------------------------


最终单纯形表为:
           |           |           |   1.000   |   3.000   |  -1.000   |   0.000   |   0.000   |
-------------------------------------------------------------------------------------------------
    CB     |    XB     |     b     |    X1     |    X2     |    X3     |    X4     |    X5     |
-------------------------------------------------------------------------------------------------
     0     |    X5     |  -0.000   |   2.000   |  -0.000   |  -0.000   |  -0.000   |   1.000   |
     3     |    X2     |   1.333   |  -2.000   |   1.000   |   0.000   |   0.333   |   0.000   |
    -1     |    X3     |   1.333   |   1.000   |   0.000   |   1.000   |   0.333   |   0.000   |
-------------------------------------------------------------------------------------------------
           |           |           |   8.000   |   0.000   |   0.000   |  -0.667   |   0.000   |

-------------------------------------------------------------------------------------------------


[0, 1.3333333333333335, 1.3333333333333333, 0, -0.0]
线性规划解得最优解为:[0, 1.3333333333333335, 1.3333333333333333, 0, -0.0],此时目标函数极大值为:2.666666666666667

在实际终端中运行,每次转轴的变量都会标红显示

5 内置的parse_input函数使用

from FDSMLP.core.utils.input_parser import parse_input
from FDSMLP.Simplex import Two_step_simplex


constrain,A,b,constraints=parse_input()

simplex=Two_step_simplex(b,A,constrain,constraints)
simplex.solve()

输出结果如下:

请输入目标函数的系数,用空格分隔: 1 3 -1
请输入约束条件(例如 '1 2 <= 3'),输入 'end' 或直接回车结束输入: 1 1 2 <= 4
请输入约束条件(例如 '1 2 <= 3'),输入 'end' 或直接回车结束输入: -1 2 1 <= 4
请输入约束条件(例如 '1 2 <= 3'),输入 'end' 或直接回车结束输入: 
开始执行两步法进行线性规划求解:
原始目标函数为:
max y = 1.0 * X1 + 3.0 * X2 - 1.0 * X3
原始约束条件为:
 1.0 * X1 + 1.0 * X2 + 2.0 * X3 <= 4.0
 - 1.0 * X1 + 2.0 * X2 + 1.0 * X3 <= 4.0
 ...

说明

该项目目前不依赖第三方库,只依赖于python内置模块 其实做的时候就后悔了,但是写都写了,懒得改了,反正大家也就拿来图一乐

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

FDSMLP-1.0.3.tar.gz (10.6 kB view hashes)

Uploaded Source

Built Distribution

FDSMLP-1.0.3-py3-none-any.whl (12.6 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page