Skip to content

Allvey/SimplexLinprog

This branch is 2 commits ahead of cdfmlr/SimplexLinprog:master.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

26c9e03 · Mar 22, 2022

History

12 Commits
Mar 25, 2020
Mar 22, 2022
Apr 1, 2020
Apr 1, 2020
Mar 23, 2020
Mar 25, 2020
Mar 23, 2020
Mar 30, 2020
Apr 1, 2020
Mar 24, 2020
Apr 15, 2020

Repository files navigation

SimplexLinprog

单纯形算法实现。

项目结构

.
├── LICENSE
├── README.md
├── SimplexExperiment.py		算法测试 
└── linprog
    ├── __init__.py
    ├── dual_simplex.py			对偶单纯形算法实现 DualSimplex
    ├── problem.py			线性规划问题类 LpProblem
    ├── simplex_method.py		单纯形表法实现 SimplexMethod
    ├── simplex_vectorized.py		单纯形算法矩阵表示实现 SimplexVectorized
    ├── solve.py			线性规划问题的解类 LpSolve
    └── solver.py			线性规划问题解法抽象类 LpSolver

接口说明

在开始之前,您需要了解该项目提供的三个基本模型类:

  • LpProblem:表示一个标准型线性规划问题:

    max z = c^T * x
    s.t. a*x = b, x >= 0, b > 0
    

    【注】使用 DualSimplex 算法求解的时候,还有注意保证问题可用对偶单纯形法。

  • LpSolve:表示一个线性规划问题的解,包含以下内容:

    success: 最优化成功 : True or False
    description: 解的描述 : 唯一最优解/无穷多最优解/无界解/无可行解... 
    solve: 最优解 : [x1, x2, ...] or None
    target: 最优目标函数值 : z
    
  • LpSolver:线性规划问题的解法,具体实现有三种:

    SimplexMethod		# 单纯形表法
    SimplexVectorized	# 基于矩阵表示的单纯形法
    DualSimplex		# 对偶单纯形法
    

具体使用

  1. 初始化一个线性规划标准型问题(LpProblem

    lpProblem = LpProblem(c, a, b)
    """
    :param c: 目标函数系数
    :param a: 系数矩阵
    :param b: 右端常数
    """
  2. 指定具体算法,求解问题

    solve = lpProblem.solve(solver, **kwargs)
    """
    :param solver: LpSolver 的具体实现,直接传类名即可,三选一:
    	SimplexMethod		: 单纯形表法
    	SimplexVectorized	: 基于矩阵表示的单纯形法
    	DualSimplex		: 对偶单纯形法
    :param kwargs: 可选参数
    	base_idx=[...] (default []):    指定初始基,缺省则由算法自行确定
    	show_tab=True  (default False): 打印单纯形表,仅对 solver=SimplexMethod 适用
    	two_step=True  (default False): 无单位阵作初始基时,使用两阶段法
    	big_m=True     (default True):  无单位阵作初始基时,使用大 M 法
    :return: 问题的解 LpSolve
    """
  3. 查看解

    print(solve)
    # LpSolve 实现了对__str__的重载,可以打印出易读的解
    # 或者,可以调取 LpSolve 对象的具体属性:
    solve.success     # 是否得到了最优解
    solve.description # 解的描述
    solve.solve       # 最优解向量
    solve.target      # 最优目标函数值

E.g.

# 导入需要的命名
from linprog.problem import LpProblem

from linprog.simplex_method import SimplexMethod
# from linprog.simplex_vectorized import SimplexVectorized
# from linprog.dual_simplex import DualSimplex

# 初始化一个线性规划标准型问题
pb = LpProblem([-5, 5, 13, 0, 0], [[-1, 1, 3, 1, 0], [12, 4, 10, 0, 1]], [20, 90])
# 用单纯形表法求解,打印单纯形表
s = pb.solve(SimplexMethod, show_tab=True)
# 打印解
print(s)

运行结果:

   x_3	  20.0	  -1.0	   1.0	[3.00]	   1.0	     0	6.6666	
   x_4	  90.0	  12.0	   4.0	  10.0	     0	   1.0	   9.0	
      	      	  -5.0	   5.0	  13.0	     0	     0	      	
----------------
   x_2	6.6666	-0.333	[0.33]	   1.0	0.3333	     0	20.000	
   x_4	23.333	15.333	0.6666	     0	-3.333	   1.0	34.999	
      	      	-0.666	0.6666	     0	-4.333	     0	      	
----------------
   x_1	20.000	  -1.0	   1.0	   3.0	   1.0	     0	      	
   x_4	9.9999	  16.0	     0	-2.000	  -4.0	   1.0	      	
      	      	     0	     0	-2.000	  -5.0	     0	      	
----------------

最优化成功	: True
解的描述	: 无穷多最优解
最优解	: [ 0. 20.  0.  0. 10.]
最优目标函数值	: 100.00000000000001

打印出的单纯形表格式如下:

x_B b A theta
sigma

TODO

  • 重构,抽象 SimplexMethod、SimplexVectorized、DualSimplex,避免代码重复
  • 异常输入检测、处理
  • 输入任意线性规划问题,自动化为标准型
  • CLI、GUI 交互界面
  • 模仿 scipy.optimize.linprog,重写一套更好的实现

开放源代码

MIT License

Copyright (c) 2020 CDFMLR

About

单纯形算法实现

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 100.0%