
运筹系列1:线性规划单纯形法python代码
初始解:找到一个满足所有约束条件的初始解,通常是原问题的解。 极点搜索:通过计算残差,选择一个非基变量进入基变量,替换一个基变量,逐步优化目标函数。 终止条件:当所有的残差都非负时,达到最优解。
发布日期:2021-05-08 09:43:41
浏览次数:18
分类:精选文章
本文共 1777 字,大约阅读时间需要 5 分钟。
线性规划问题是优化领域中的一个经典问题,广泛应用于资源分配、工程规划等领域。单纯形法作为解决线性规划问题的高效算法,通过逐步优化目标函数,找到最优解。
线性规划标准模型
线性规划的标准模型如下:
- 目标函数:min ( c^T x ),其中 ( c ) 是系数向量,( x ) 是变量向量。
- 约束条件:( Ax = b ),其中 ( A ) 是约束矩阵,( x ) 是变量向量,( b ) 是常数向量。
- 变量非负约束:( x \geq 0 )。
线性规划的基本步骤
单纯形法的核心原理
基变量和非基变量:
- 基变量:满足约束条件的主解。
- 非基变量:自由变量,通过调整来优化目标函数。
字典表达式:
- 将问题转化为基变量和非基变量的线性组合。
- 通过检查主问题和对偶问题的可行条件,确定最优解。
pivoting:
- 选择负残差最小的非基变量进入基变量。
- 计算替换的基变量和非基变量,更新目标函数和约束条件。
代码实现
以下是一个Python代码实现单纯形法的伪代码:
import numpy as npdef solve(): # 假设已经初始化好的矩阵d包含基变量和非基变量 while np.anymax(d[-1][:-1]) > 0: # 选择进入基变量的非基变量 jnum = np.argmin(d[:-1, -1] / d[:-1, 0]) # 选择退出基变量的基变量 inum = np.argmin(d[-1, -1] / d[-1, jnum]) # 替换基变量 d[inum] /= d[inum, jnum] for i in range(bn): if i != inum: d[i] -= d[i, jnum] * d[inum] # 输出当前解 def printSol(): for i in range(cn - 1): print(f"x{i:.2f}" if i in s else f"x{i:.2f} = 0.00") print(f"objective is {d[-1][-1]:.2f}") printSol()# 假设已经初始化好了矩阵d和其他参数d = np.loadtxt("data.txt", dtype=np.float)bn = d.shape[0] # 基变量数量cn = d.shape[1] # 总变量数量s = list(range(bn)) # 基变量索引
问题求解
针对以下目标函数和约束条件:
- 目标函数:max ( z = x_0 + 14x_1 + 6x_2 )
- 约束条件:
- ( x_0 + x_1 + x_2 \leq 4 )
- ( x_0 \leq 2 )
- ( x_2 \leq 3 )
- ( 3x_1 + x_2 \leq 6 )
- ( x_i \geq 0 )
添加松弛变量后,问题转化为标准形,存储到 data.txt
文件中。
代码调用
d = np.loadtxt("data.txt", dtype=np.float)bn = d.shape[0]cn = d.shape[1]s = list(range(bn))solve()
输出结果
运行代码后,输出如下:
x0=0.00x1=1.00x2=3.00x3=0.00x4=2.00x5=0.00x6=0.00objective is 32.00
写后感
通过将单纯形法实现为代码,我深刻体会到了代码能够清晰地表达算法步骤的优势。线性规划虽然背后有复杂的数学理论,但通过代码实现,问题的解决过程变得直观高效。掌握单纯形法的理论基础和对偶理论,对理解和应用线性规划至关重要。
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月12日 03时02分02秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
云计算之路-阿里云上:博客web服务器轮番CPU 100%
2019-03-06
云计算之路-阿里云上:服务器CPU 100%问题是memcached连接数限制引起的
2019-03-06
上周热点回顾(3.26-4.1)
2019-03-06
上周热点回顾(6.25-7.1)
2019-03-06
【故障公告】10:30-10:45 左右 docker swarm 集群节点问题引发故障
2019-03-06
工作半年的思考
2019-03-06
不可思议的纯 CSS 滚动进度条效果
2019-03-06
【CSS进阶】伪元素的妙用--单标签之美
2019-03-06
惊闻NBC在奥运后放弃使用Silverlight
2019-03-06
IE下尚未实现错误的原因
2019-03-06
创建自己的Docker基础镜像
2019-03-06
Python 简明教程 --- 20,Python 类中的属性与方法
2019-03-06
KNN 算法-理论篇-如何给电影进行分类
2019-03-06
Spring Cloud第九篇 | 分布式服务跟踪Sleuth
2019-03-06
CODING 敏捷实战系列课第三讲:可视化业务分析
2019-03-06
工作动态尽在掌握 - 使用 CODING 度量团队效能
2019-03-06
CODING DevOps 深度解析系列第二课报名倒计时!
2019-03-06
数据结构第八节(图(下))
2019-03-06
基于Mustache实现sql拼接
2019-03-06
POJ 2260 Error Correction 模拟 贪心 简单题
2019-03-06