线性规划之单纯形算法
学了很长时间,一直不是很能理解,所以就准备写一篇。
这篇文章只讲单纯形算法。
假设我们已经得到了标准型:
而得到最优解的过程就是:
找到一个基变量和非基变量,将他们交换。我们通过不断地交换,不断地让答案更优。
这就是在凸壳上不断向最优解移动的过程。
先据一组数据作为具体的例子:
有
我们可以得到
我们令所有的非基变量为
我们获得了一个小的可怜的答案——
而在我们要最大化的答案中,
我们把它从
仍然令其它非基变量是
替换可以得到新的限制:
这个限制我们可以得到解
接下来我们继续重复这个过程,发现
仍然是有三条限制:
替换得到:
发现剩下的两个系数都是
我们抽象一下刚才的过程,我们就可以得到一个具体的过程了:
找到最大的系数
实现代码如下:
namespace XG{
double a[50][50],tr;
int n,m,ind[50];
void turn(int x,int y)
{
for(int i=0;i<=n;i++)
if(i!=x)
{
tr=a[i][y]/a[x][y];
for(int j=1;j<=m;j++)
a[i][j]-=a[x][j]*tr;
}
tr=a[x][ind[x]=y];
for(int i=1;i<=m;i++)
a[x][i]/=tr;
}
double solve()
{
while(1)
{
double maxn=0,lim=1e18;
int x=0,y=0;
for(int i=1;i<=m;i++)
if(a[0][i]>maxn)
x=i,maxn=a[0][i];
if(!x) break;
for(int i=1;i<=n;i++)
if(a[i][x]>0&&lim>a[i][m]/a[i][x])
lim=a[i][m]/a[i][x],y=i;
if(!y) break;
turn(y,x);
}
return -a[0][m];
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具