java单纯形法_单纯形法 - fjzzq2002 - 博客园

看了集训队答辩,感觉要学习的有杜教筛高级版、线性规划、FFT、仙人掌、高级版线段树

不出意外的话一个月内博客内都不会有别的东西了QAQ

首先是喜闻乐见的单纯形法解线性规划。

今年(2016年)和线性规划有关的集训队论文有两篇,大家可以自行翻一下集训队论文(当然如果你没有拿到你可以去UOJ群下载啊),下面的大部分内容都是参阅akf那篇

线性规划的标准型一般长得像这样:

8c2f8174003f2160596d8d047abc7d6c.png

一般我们拿到的都是像标准型这样的问题,例如网络流问题,我们就是要最大化流量并且让每个点流量守恒。

假设我们把汇点到源点连一条容量为+∞的边那么所有点就都流量守恒了。我们用c(u,v)表示(u,v)这条边的容量,f(u,v)表示这条边的流量。

那么我们不难得到这样的一个标准型线性规划

867ce901e85ef27cf9986f9393db2c33.png

不难把它转化成标准型这样的模型。

而最小费用流则也是一个标准型,我们还是把汇点到源点加一条容量为+∞,费用为0的边。

那么也可以得到一个比较标准的线性规划:

aa593e5a3d558f5ae871cc98bfc2a791.png

(较论文中的配文有修改)

如果你要最小费用最大流的话只要加一个约束条件$\sum_{(u,v)}{f(u,v)}=maxflow$

7ead3b25e7222d676e1eb926cb888bd2.png

额那不等号怎么办呢?

对于不等约束条件${\sum_{j=1}^n{a_{ij}x_j}}\leq{b_i}$

affe9335cec28f96dd251649c8e7a5e4.png

在松弛型等式左边的那些变量我们把它们叫做基变量,在上面的松弛型表示中就是x[n+1]…x[n+m],非基变量就是在等式右边的那些,在上面的表示中是x[1]…x[n]。

显然当bi非负时令所有基变量为bi,非基变量为0,即可得到一个满足条件的初始解。(至于bi可能为负的情况下面在单独说)

单纯形法有一个重要的操作,叫转轴(pivot)操作。就是说我们可以把一个基变量x[b]和非基变量x[n]互换,用x[b]和其他非基变量代换这个x[n],这样x[b]就成了非基变量,而x[n]成了基变量。

一开始我们知道0f9829182dd002cf6638a57c417d62c7.png

那么简单代换一下会发现4693db033adafa8107f748e7bc8d4b5a.png,然后我们也可以把其他约束条件中的x[n]这样代换掉,于是就完成了这个转轴操作。

然后有了这个转轴过程的帮助,我们就可以实现线性规划算法了。

首先为了最大化目标函数,我们考虑不停地找一个系数为正的非基变量,然后增大这个x。

具体的这个最优化过程如下:

fc4ff82946d442b72fe5293ae8cf85dd.png

(注意邹逍遥原论文在这里的做法是选择满足d150b61a9025917047eefb3f0f33cc83.png的,ysy告诉我这样是不科学的,akf的论文里写的也是ce>0,于是做了一些修改)

这是为什么呢?akf在论文中给出了一个例子,从中我们可以大概理解一下。

这个线性规划是这样的:

7cf04098c03f18fa67ad5618dd6b02be.png

我们考虑第一步我们选择换正系数的x1,因为增大x1必然会增大目标函数。

我们分别考虑三个限制,显然第一个限制下x1<=30,第二个限制下x1<=12,第三个限制x1<=9,然后x1<=9的下界最紧,所以我们用x1代换x6,得到下面的新线性规划:

86231ef694167e8a7e6001375200c0cc.png

哇目标函数增大到了27,可喜可贺。

接下来假设我们来增大x3,类似地可以得到:

6e0e1abc28f4b187f758585c74969e70.png

然后可以增大x2,可以得到:

efe3778d64e034d54a0a51969fe85518.png

由于所有非基变量系数均为负的,所以我们不可能再得到更小的解了。

1ca7f17809a9de16b1cbf1574e48f95a.png

咦,有没有注意到上面漏了什么东西说要下面讲啊…

对了,在bi为负的时候,如果你把所有基变量带0,而非基变量就不一定是一组合法的初始解。

这时候我们就需要一个初始化操作,初始化操作的基本思想是引入一个辅助线性规划:

7d70248c03f5586580716342fd63bed4.png

如果我们求得了这个辅助线性规划的最优解,那么如果最优解中x0>0显然原线性规划无解。

如果最优解中x0=0,那么x[1]…x[n+m]就是原线性规划的一个可行解。

而我们容易构造出辅助线性规划的一个可行解。

我们只要把x0作为换入变量,找到bi的最小值bl,把x[i+l]用x0来替代。

例如:

e04507b206b9b2cd544688537671d854.png

我们引入辅助线性规划:

04790200e8b5ba662fed0a69a1ec4768.png

bi最小值是-4,那么我们把x4用x0来替代:

b408a89528f585246ca7e384fac1df91.png

然后我们就可以得到一组x的初始解用来进行最优化操作。

讲道理:为什么bi这样之后一定为正?

首先bi的最小值bl一定为负(废话,否则就不用进行最优化操作了)

然后我们考虑第l个约束会变为:

85092f61e7f2919b4d071587fbcb6279.png

而-bi显然为正的。

而其他约束会变为:

548986973320892b789e3c5284fdf5c7.png

由于bl是最小值,所以bi>=bl,所以-bl+bi>=0。

而我们发现UOJ上似乎有一种更加神奇的初始化方法?

我们的目标显然是让所有系数bi都为非负的。

我们选择一个bi为负的基变量x[i+n],然后我们在该约束右边找一个系数为正的非基变量,然后进行转轴操作,如果没有系数为正显然就无解了。

额其实这和这个初始化操作本质上是一样的。

所以这样就可以完成整个线性规划的过程。

我们来分析一下时间复杂度?

pivot操作的复杂度显然是O(NM)的,但是最优化操作中pivot操作的调用次数可能会成为指数级。

但是我们可以发现要达到这个指数级的调用次数,边权也必须是指数级的。所以在OI中往往跑得比谁都快。所以“能在1s内跑出范围为几百的数据”。

然而一般线性规划是可以在多项式范围内求解的,只不过…

椭球算法 O(n^6*m^2)

内点算法 O(n^3.5*m^2)

改进的内点算法 O(n^3.5*m)

在oi中一般并不能有什么卵用

所以单纯形法就这么讲完啦。

实现的时候可以发现,写单纯形并不要真的把松弛型建出来,只要假装第i个约束条件就对应第i个基变量,把系数取负就可以了。

我的代码(有一些细节写的比较丑

#include #include#include#include#include#include#include#include#include#include

using namespacestd;

typedefdoubleld;#define SZ 233

intn,m,t,id[SZ];

ld a[SZ][SZ],vv[SZ];const ld eps=1e-7;intdcmp(ld x)

{if(xeps) return 1;return 0;

}void pivot(int r,int c) //基变量r和非基变量c

{

swap(id[r+n],id[c]);

ld x=-a[r][c]; a[r][c]=-1;for(int i=0;i<=n;i++) a[r][i]/=x;for(int i=0;i<=m;i++)

{if(dcmp(a[i][c])&&i!=r);else continue;

x=a[i][c]; a[i][c]=0;for(int j=0;j<=n;j++) a[i][j]+=x*a[r][j];

}

}voidsolve()

{for(int i=1;i<=n;i++) id[i]=i;while(1) //init

{int x=0,y=0;for(int i=1;i<=m;i++)

{if(dcmp(a[i][0])<0&&(!x||(rand()&1))) x=i;

}if(!x) break;for(int i=1;i<=n;i++)

{if(dcmp(a[x][i])>0&&(!y||(rand()&1))) {y=i; break;}

}if(!y) {puts("Infeasible"); return;}

pivot(x,y);

}while(1) //simplex

{int x=0,y=0;for(int i=1;i<=n;i++)

{if(dcmp(a[0][i])>0&&(!x||(rand()&1))) x=i;

}if(!x) break;double w,t; bool f=1;for(int i=1;i<=m;i++)

{if(dcmp(a[i][x])<0&&((t=-a[i][0]/a[i][x]),f||t

}if(!y) {puts("Unbounded"); return;}

pivot(y,x);

}

printf("%.9lf\n",a[0][0]);if(!t) return;for(int i=1;i<=n;i++) vv[i]=0;for(int i=n+1;i<=n+m;i++) vv[id[i]]=a[i-n][0];for(int i=1;i<=n;i++) printf("%.9lf",vv[i]);

}intmain()

{

scanf("%d%d%d",&n,&m,&t);for(int i=1;i<=n;i++) scanf("%lf",&a[0][i]);for(int i=1;i<=m;i++)

{for(int j=1;j<=n;j++) scanf("%lf",&a[i][j]), a[i][j]*=-1;

scanf("%lf",&a[i][0]);

}

solve();

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python调用js获取异步返回的数据_Python怎么获取js动态加载的数据

展开全部 import selenium from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.common.keys import Keys import time browser webdriver.Firefox() # Get local session of firefox browser.get("…

一个柱状图里两种数据_分享一些数据分析常用的统计图图表

无论是报表分析还是可视化分析中&#xff0c;最直观传达数据走向趋势的就是各式各样的统计图&#xff0c;比如想要比较分析两种不同的变量数据&#xff0c;可以用柱状图&#xff1b;想要查看某一数据在整体数据中所占的比例&#xff0c;可以用饼图来展示&#xff1b;想要查看某…

java 单例 读写锁_你用对锁了吗?浅谈 Java “锁” 事

每个时代&#xff0c;都不会亏待会学习的人大家好&#xff0c;我是yes。本来打算继续写消息队列的东西的&#xff0c;但是最近在带新同事&#xff0c;发现新同事对于锁这方面有一些误解&#xff0c;所以今天就来谈谈“锁”事和 Java 中的并发安全容器使用有哪些注意点。不过在这…

word无法启动转换器recovr32_迅捷PDF转换器3.0.1Mod会员版

特别声明所有软件皆来源于网上收集整理&#xff0c;仅供学习与交流技术,不得用作其它用途&#xff0c;如有侵犯你的权益&#xff0c;请联系我们,我们将于24小时内进行删除&#xff0c;谢谢你的配合&#xff01;1 迅捷PDF转换器作为一款专业实用的文件格式转换器&#xff0c;不仅…

项目管理知识体系指南_MP考前冲刺丨项目管理知识体系指南(PMBOK)串讲(11)...

第一单元&#xff1a;必考知识点08 项目质量管理(下)根本原因分析因果图因果图 Cause and Effect Diagram根本原因分析在被视为特殊偏差的不良结果与飞随机原因之间建立联系&#xff0c;基于这种联系&#xff0c;采取纠正措施&#xff0c;小区在控制图中呈现的特殊偏差。直方图…

nfa状态转换图正规式_0x02 从NFA到DFA

书接上文&#xff0c;上回说道NFA已经可以完全描述正则语言的全部内容。那么&#xff0c;我们在这一章探索一下一个比较复杂的正则表达式在用NFA做匹配的时候会有什么“不足“。NFA匹配的"不足"为了言之有物&#xff0c;不妨设要讨论的模式为d?(c(a|b)*)*(b|c)图1-1…

java filter教程_Java Web Filter 过滤器学习教程(推荐)

一、Filter简介Filter也称之为过滤器&#xff0c;它是Servlet技术中最激动人心的技术&#xff0c;WEB开发人员通过Filter技术&#xff0c;对web服务器管理的所有web资源&#xff1a;例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截&#xff0c;从而实现一些特殊的功…

vue修改计算属性的值_「Vue学习记录五」计算属性和侦听器

1&#xff1a; 计算属性&#xff1a; &#xff08;内置缓存机制&#xff09;当更改age的时候&#xff0c; fullName 函数不执行&#xff1b;当更改fristName的时候&#xff0c; fullName 函数才执行<div id "app"><span>{{fullName}}</span> <…

git为私有仓库设置密码_真香!在局域网下行云流水般使用git

最近公司要开发一个新的项目&#xff0c;开发一个新的项目就要有一个好的代码版本管理工具。对于代码开发版本控制工具&#xff0c;我们之前是使用svn这个代码版本控制工具&#xff0c;但是项目经理说统一使用git开发版本控制工具&#xff0c;来到这里我们一般会选择gitee或者g…

xss img onerror java_java后台防止XSS的脚本攻击

import java.util.regex.Pattern;//具体过滤关键字符public class XSSUtil {private static Pattern[] patterns new Pattern[]{// Script fragmentsPattern.compile("", Pattern.CASE_INSENSITIVE),// src...Pattern.compile("src[\r\n]*[\r\n]*\\\(.*?)\\\&…

网口监视报文工具_真是神器!这款网络排查工具!

常用的 ping&#xff0c;tracert&#xff0c;nslookup 一般用来判断主机的网络连通性&#xff0c;其实 Linux 下有一个更好用的网络联通性判断工具&#xff0c;它可以结合ping nslookup tracert 来判断网络的相关特性&#xff0c;这个命令就是 mtr。mtr 全称 my traceroute&…

snmp服务 2003 镜像_美国掌握全球70%根服务器,一旦对中国关闭,我们将无法上网?...

“如果在上网和男朋友(女朋友)之间只能选一个&#xff0c;你会选哪个&#xff1f;”曾经有媒体在街头做这样的调查&#xff0c;出人意料的是很多人都选择了“上网”&#xff1b;因为在现代年轻人看来&#xff0c;如果进入一个没有“不能上网”的生活实在太恐怖了&#xff0c;那…

java写入carbondata_Carbondata使用过程中遇到的几个问题及解决办法

本文总结了几个本人在使用 Carbondata 的时候遇到的几个问题及其解决办法。这里使用的环境是&#xff1a;Spark 2.1.0、Carbondata 1.2.0。必须指定 HDFS nameservices在初始化 CarbonSession 的时候&#xff0c;如果不指定 HDFS nameservices&#xff0c;在数据导入是没啥问题…

商品审核网页界面_Shopee新手指南:Shopee卖家中心用户界面介绍

1.Shopee各站点前台网页链接&#xff1a;2.Shopee各站点后台网页链接3.Shopee APP下载&#xff1a;安卓版下载链接&#xff1a;https://pan.baidu.com/s/1eSp8M1k#list/path%2Fios版&#xff1a;可在App Store中直接搜索下载使用。台湾站点ios版本请搜索关键字“虾皮”下载&…

pdf exe如何提取pdf文件_python应用:如何用python提取pdf文件中的文字

从pdf中提取文字&#xff0c;相信很多人都干过这事&#xff0c;怎么在python中实现呢&#xff0c;今天带大家看看。第一步导入库import PyPDF2第二步导入pdf文件pdf_file open(dataset/laban.1027.pdf, rb)第三步读取pdf并检查加密情况read_pdf PyPDF2.PdfFileReader(pdf_file…

java轻量分布式框架_5个强大的Java分布式缓存框架推荐

在开发中大型Java软件项目时&#xff0c;很多Java架构师都会遇到数据库读写瓶颈&#xff0c;如果你在系统架构时并没有将缓存策略考虑进去&#xff0c;或者并没有选择更优的 缓存策略&#xff0c;那么到时候重构起来将会是一个噩梦。本文主要是分享了5个常用的Java分布式缓存框…

python三次样条插值拟合的树行线_数学建模笔记——插值拟合模型(一)

啊好像距离上次写作又过了七天&#xff0c;啊好像我之前计划的一周两三篇&#xff0c;啊辣鸡小说毁我青春&#xff0c;啊我是一只可怜的鸽子。不管怎样&#xff0c;我又回来了&#xff0c;并坚定地更新着hhh。再过两三天就是我们学校数学建模选拔&#xff0c;再过八九天就是期末…

密度图的密度估计_不同类型的二维密度图小教程

R相关小教程链接&#xff1a;用R构建气泡图案例小教程【小教程】散点图、饼图怎么在我的文章中完美展示小教程热图在论文发表中完美呈现小教程R与密度、函数、变量的微妙关系北京市计算中心医用数据库建设解决方案更多内容&#xff0c;请关注“生信会议”公众号Different types…

python 找质数的个数_用Python打造一款文件搜索工具,所有功能自己定义!

一、前言大家好&#xff0c;又到了Python办公自动化系列。在日常的办公中&#xff0c;我们经常会从一堆不同格式的文件(夹)中搜索特定的文件&#xff0c;可能你是凭着记忆去找或是借助软件&#xff0c;但你有想过如何用Python实现吗&#xff1f;本文将基于几个常见的搜索操作讲…

nessus安装_Nessus忘记密码怎么办?

最近公司购买了Nessus&#xff0c;才安装好&#xff0c;然后隔天密码就忘了&#xff0c;唉&#xff0c;人老了呀&#xff0c;记性不行了。网上看了一下&#xff0c;还是有比较多的同学也遇到这个问题&#xff0c;现将密码重置方法&#xff0c;分享给大家。系统环境:操作系统&am…