收集更新求解散射(GUSS)

介绍

本章的目的是详细介绍GAMS建模系统的扩展,该系统允许有效地描述、实例化和求解模型集合(通过一组样本或索引外部参数化)。

作为一个具体示例,我们考虑由以下定义的参数优化问题:

\开始{方程式}\标签{eq:P(s)}\最小值{x\在x(s)}f(x;s)\text{s.t.}g(x;s)\leq 0\结束{方程式}

其中,s=\{1,\ldots,K\}中的\(s\)。请注意,每个场景代表一个不同的问题,优化变量为。上述约束集的形式仅用于具体性;等式约束、范围约束和边界约束是上述框架的简单扩展。显然,这些问题是相互关联的。我们打算展示如何在GAMS中轻松指定此类问题,并详细介绍一种可以利用链接性质的算法扩展。GAMS的其他扩展允许并行执行解决方案或使用网格计算资源执行解决方案。请注意,在我们的描述中,我们将使用索引、参数化和场景等术语,这些术语可以互换使用。本章的扩展版本包含几个示例,可在http://www.gams.com/modlib/adddocs/gusspaper.pdf.

设计方法论

GAMS最重要的功能之一是从方程集合中构建模型实例(即GAMS关键字定义的优化模型型号)以及相应的数据(包括GAMS(子)集合和参数的内容)。当GAMS执行系统执行解决方案声明。生成的模型实例被传递给求解器,该求解器搜索此模型实例的解决方案,并返回状态信息、统计信息和模型实例的(原始和双重)解决方案。求解器终止后,GAMS将解决方案带回GAMS数据库,即更新级别(.L型)和边缘(.M(毫米))模型实例中使用的变量和方程符号字段。因此解决方案语句可以解释为针对GAMS数据库的复杂运算符。解决方案语句只存在于这一语句的执行期间,因此在GAMS语言中没有表示。此外,它的结构确实符合GAMS的关系数据模型。模型实例由边界向量和右侧向量、雅可比矩阵的稀疏矩阵表示、允许有效计算梯度向量和Hessian矩阵的非线性表达式表示等组成。

本章涉及解决具有类似结构但修改了数据的模型集合。例如,考虑以下形式的线性程序:

\[\min c^T x\text{s.T.}轴\geqb、 \;\ell\leq x\leq u.\]

此问题中的数据是\((A,b,c,\ell,u)\)。省略一些细节,可以在GAMS中使用以下代码来求解这样的线性程序集合,其中集合的每个成员都有不同的(a)矩阵和下限(ell):

设置i/…/,j/…/;参数A(i,j),b(i);变量x(j),z。。。;方程e(i)。。。;e(i)。。总和(j,A(i,j)*x(j))=g=b(i);...模型mymodel/all/;设置s/s1*s10/参数A_s(s,i,j)'场景数据'xlo_s(s,j)'变量x的场景下限'xl_s(s,j)“x.l的场景解决方案”em_s(s,i)'e.m的场景解决方案';循环,A(i,j)=A_s(s,i,j;x.lo(j)=xlo_s(s,j);用lp求解mymodel-min-z;xl_s(s,j)=x.l(j);ems(s,i)=e.m(i););

总之,我们解决了一个特定的模型(我的模型)在循环中模型边缘不变(即相同的单个变量和方程),但模型数据不同,变量界限不同。后续解决方案语句的模型数据更改不依赖于循环中以前的模型解决方案。

这个新的Gather-Update-Solve-Scatter(GUSS)管理器的目的是在GAMS建模级别提供语法,使问题的实例能够提供有限的访问权限来将该实例视为对象,并允许建模者迭代更新其部分。具体来说,我们提供了一个语法,该语法给出了实例的数据更改列表,并允许将这些更改按顺序应用于实例(然后在不返回GAMS的情况下解决此问题)。因此,我们可以模拟应用于模型实例对象的有限操作集,并在建模环境中检索这些更改实例的部分解决方案。这种变化可以对GAMS中的任何模型类型进行,包括非线性问题和混合整数模型。然而,我们只允许对方程中出现的命名参数以及模型定义中使用的上下限进行更改。

因此,在上述示例中,GUSS允许我们将第15-21行替换为

设置dict/s.方案。“”A.参数。(_s)x.降低。xlo_s公司x.级别。xl秒e.边缘。ems/;使用lp-scenario dict求解mymodel-min-z;

三维设置dict(您可以自由选择此符号的名称)包含模型中的符号(第一个位置)与提供所需更新数据或存储解决方案信息的符号(第三个位置)之间的映射信息,以及更新/存储类型(第二个位置)。此规则的一个例外是带有标签的元组脚本在第二个位置。该元组确定用作场景索引的符号(位于第一个位置)。此方案符号可以是多维集。此集中的元组表示单个场景设置dict可以分为输入元组和输出元组。输入元组决定在求解之前对模型实例的修改,而输出元组决定保存解决方案的哪一部分。可以在集合的第二个位置使用以下关键字字典:

类型关键词描述
输入:参数 为模型中使用的参数提供场景数据
降低 提供变量的场景下限
上面的 提供变量的场景上限
固定的 为变量提供场景固定边界
输出:水平 存储变量或方程的场景解决方案的级别
边缘的 存储变量或方程的场景解决方案的边距

无法更新模型中的集合。GUSS的工作原理如下:GAMS为原始数据生成模型实例。与常规情况一样解决方案语句,所有模型数据(例如参数A类)此时需要定义。具有原始数据的模型实例也称为基本情况。基本案例的解决方案定期报告给GAMS,并可通过常规访问.L型.M(毫米)后的字段解决方案声明。在解决基本情况之后,将第一个场景的更新数据应用于模型。包含的元组降低,上面的,固定的更新变量的边界,而元组参数更新模型中的参数。

场景索引需要是中映射的参数中的第一个索引集合dict模型参数的更新远远超出了约束矩阵/目标函数或等式右侧的系数的更新,就像其他一些系统一样。GAMS将约束的所有必要表达式存储在模型实例中,因此约束矩阵系数的变化是表达式求值的结果。例如,考虑在计算运送可变数量货物的成本时使用一个术语x(i,j)城市之间j个。运输成本的表达式为d(i,j)*f*x(i,j)即城市之间的距离乘以运费(f)乘以货物的可变数量。为了找出解决方案对运费的敏感性(f),可以用不同的值求解同一模型(f)在模型的矩阵表示中,需要计算x(i,j)哪个是d(i,j)*f,但使用GUSS就足以为(f)这可能会导致矩阵级别上的许多修改系数。GUSS评估运输成本项,并在幕后将得到的矩阵系数可靠地传递给求解器。

应用变量边界和模型参数更新,并确定模型实例数据结构(例如约束矩阵)的更新结果后,修改后的模型实例将传递给求解器。一些解算器(例如Cplex、Gurobi、SoPlex和Xpress)允许修改模型实例。在这些情况下,GUSS仅将先前模型实例中的更改传递给解算器。这减少了传递给解算器的数据量,并且在LP模型的情况下,允许解算器从高级基础及其分解重新启动。对于NLP模型,这将提供初始值。求解器确定模型实例的解后,GUSS存储字典一些GAMS参数,并继续下一个场景。GUSS强调速度,仅与允许通过内存通信模型实例的解算器一起工作。因此,以下解算器不能用作GUSS的子解算器:ALPHAECP、BARON、CONVERT、DECISC、DECISM、DICOPT、EXAMINER、GAMSCHK、JAMS、KESTREL、LOGMIP、MILES、MPSGE、,NLPEC、PATHNLP、SBB。

GUSS选项

可以使用一些选项参数化GUSS的执行。选项不是通过解算器选项文件传递的,而是通过字典设置。此元组第二个位置的关键字是选择.第一个位置(或标签)应为一维参数&素数&素数;). 此参数可能包含以下带有值的标签:

选项描述
OptfileInit(选择文件初始化):第一个解算的选项文件号(GAMS OptFile设置的默认值)
Optfile(光文件):后续解决方案的选项文件号(默认为0)
日志选项:确定日志输出量:
0-中等日志(默认)
1-最小日志
2-详细日志
无热启动:禁用支持热启动的解算器中的热启动功能(默认为0)
无匹配限制:不匹配场景记录的限制(默认为0)
重新启动类型::确定方案的重新启动点
0-从上一个解决方案重新启动(默认)
1-从基本案例的解决方案重新启动
2-从输入点重新启动
跳过基本情况:用于解决基本情况的开关(0解决基本情况)
报告上次搜索:用于报告最后一个场景的解决方案而不是基本案例的解决方案的开关(默认为0)
解决清空:已解决的空场景的限制,随后将跳过空场景(默认为0)
更新类型:场景更新机制:
0-将所有设置为零并应用更改(默认)
1-重新建立基本案例并应用更改
2-在上一个场景的基础上构建并应用更改

对于上面的示例模型更新类型设置意味着:

UpdateType=0:循环(s,A(i,j)=A_s(s,i,jUpdateType=1:循环(s,A(i,j)=A_base(i,j);A(i,j)$=A_s(s,i,jUpdateType=2:循环(s,A(i,j)$=A_s(s,i,j))

选项SkipBaseCase=1允许用户跳过基本案例。这意味着只有场景得到解决,而没有以传统方式向GAMS报告解决方案。第三个位置选择-元组可以包含用于存储场景解决方案属性信息的参数,例如模型和解决状态,或者需要有标签&素数&素数;。GAMS必须知道存储解决方案状态信息的标签,因此需要使用此类标签声明一个集合。输入这些属性的一种方便方法是系统。GUSS模型属性:

设置ma“GUSS模型属性”/系统。GUSSModelAttributes/;显示ma;
----1设置ma-GUSS模型属性ModelStat、SolveStat、NumInfes、SamInfes和IterUsdResUsd、ObjVal、NodUsd、ObjectEst、DomUsdRObj、MaxInfes、MeanInfes

以下示例显示了如何使用一些GUSS选项以及如何使用参数存储一些解决方案状态信息:

设置溶液标头/系统。GUSSModelAttributes/;参数o/SkipBaseCase 1、UpdateType 1、Optfile 1/r_s(s,h)溶液状态报告;设置dict/s.方案。“”o.可选。r_s(参考号)a.参数。美国x.降低。xlo_s公司x.级别。xl秒e.边缘。ems/;使用lp-scenario dict求解mymodel-min-z;

请注意,解决方案状态报告属性的域集(此处小时)必须仅包含GUSS已知的模型属性。如果此域(除非*中的域)包含GUSS未知的标签,则会触发编译错误。

实施详细信息

本节描述了一些技术细节,这些细节可以在出现意外行为时提供有用的见解。

因为GUSS更改了字典设置为变量,线性模型可以产生一些非线性指令(例如。d(i,j)*f*x(i,j)由于(f)成为提供给GUSS的模型实例中的变量)。这也解释了为什么有些模型编译时没有抱怨,但如果模型在GUSS上下文中使用,则模型的编译时检查将失败,因为转换为变量的参数不能再以这种方式使用。例如,假设模型包含约束e(i)。。总额(j$A(i,j),…).如果A(i,j)是常规模型中的参数,编译器不会投诉,但如果A类成为显示在参数中的元组字典设置,GAMS编译器将A类并抱怨内生变量不能用于$-条件。

模型的稀疏模式会受到GUSS的很大影响。在常规模型实例中,GAMS仅生成并传递约束的非零矩阵元素e(i)。。总和(j,A(i,j)*x(j))。。。,所以A类确定生成的模型实例的稀疏性。GUSS允许使用具有不同值的此约束A类因此GUSS不能排除任何对(i,j)并生成密集矩阵。用户可以通过显式限制(i,j)对:e(i)。。总和(ij(i,j),A(i,j)*x(j))。。。

敬告
虽然GUSS可用于许多模型类型,但二次模型需要特别注意。如果修改参数影响线性方程组的左侧或二次方程组的任何修改,则扩展到覆盖(凸)二次模型的线性解算器(例如Cplex、Gurobi、Mosek、Xpress)将无法正常工作。线性约束右侧的边界更新和更改是可以的(请参阅下面的二次支持向量机示例)。不幸的是,目前很难检测给定解算器的二次模型是否正常,因此在与此类(线性)解算器结合使用时要谨慎使用二次模型。

实现GUSS所需的GAMS语言的实际更改是最小的。唯一真正的变化是解决方案带有术语的语句场景dict。现有的语言元素已用于存储符号映射信息、选项和模型结果统计信息。GUSS演示的某些部分看起来有些不自然,例如因为字典是三维的设置场景的规范设置使用关键字脚本需要第三个假标签&素数&素数;然而,这种方法为将来的扩展提供了最大的灵活性,允许在编译和执行时进行可靠的一致性检查,并允许用户延迟对开发方法进行重大和永久性语法更改的承诺,以在GAMS语言级别处理模型实例。

应用

通过GUSS在GAMS中进行交叉验证

交叉验证是一种统计/机器学习技术,旨在评估分类器(或其他决策)过程的可泛化性。它通过留出一部分数据进行测试来实现这一点,并使用剩余的数据条目来生成分类器。测试数据随后用于评估分类器的工作情况。为了估计分类器的真实威力,交叉验证会多次执行整个过程。

十倍交叉验证是一种特殊情况,将原始数据分成十个部分,并使用这十个部分中的每一个作为测试集进行交叉验证。因此,训练过程执行十次,每次都使用从整个数据集中删除测试集获得的数据。下面我们将展示如何使用GAMS中的Gather-Update-Solve-Scatter(GUSS)工具执行此操作。

一篇题为“GUSS:解决数据相关模型的集合”的论文包含GUSS的两个附加应用程序示例在这里.

GAMS中的GUSS公式

以下示例使用数据文件对交叉验证下的特征选择模型的两个公式进行了比较a _数据.incb_data.inc。这两种GAMS配方的实际源代码可用在这里.

原始GAMS公式(无GAMS/DEA接口):

$title十年期交叉验证示例$eolcom!$setglobal num_folds 10个设置“类别1的集合”/1*1505/b'第2类设置'/1*957/o“观察”/1*14/p'折叠以执行'/1*%num_folds%/f“要选择的最大功能”/1*10/*从数据文件中读取数据参数a_data(a,o)/$挂牌$包括“a_data.inc”$联机/;参数b_data(b,o)/$挂牌$包括“b_data.inc”$已存在/;集合a_test(p,a),b_test(p,b)'测试集'a_trai(a),b_trai“训练集”;*定义问题标量w_tol/1/功能/6/;正变量a_err(a),sla(a)b_err(b),slb(b);变量c,重量(o),伽玛射线;二元变量y(o);方程式w_def1(o),w_def2(o),y_def,c_def,a_def(a),b_def(b);w_def1(o)。。重量(o)=l=w_tol*y(o);w_def2(o)。。重量(o)=g=-w_tol*y(o);y_def。。总和(o,y(o))=e=特征;定义(_def)。。c=e=总和(a,a_err(a))+总和(b,b_err);a_def(a)。。-总和(o,a _数据(a,o)*权重(o))+γ+1=l=a _ err(a)+sla(a);b_def(b)。。总和(o,b_data(b,o)*权重(o))-gamma+1=l=b_err(b)+slb(b);模型列车/所有/;$batinclude gentestset.inc“p,a”“p,b”设置标题“report”/modelstat、solvestat、objval/;参数rep(p,headers);train.optfile=0;选项limrow=0,limcol=0,solprint=silent,mip=xpress,solvelink=%solvelink.loadLibrary%,optcr=0,optca=0;$echo loadmipsol=1>xpress.opt循环(p,a_err.up(a)=inf;a_err.up(a)$a_test(p,a)=0;b_err.up(b)=inf;b_err.fx(b)$b_test(p,b)=0;sla.fx(a)=0;sla.up(a)$a_stest(p,a)=inf;slb.fx(b)=0;slb.up(b)$b_test(p,b)=inf;使用mip最小化c求解列车;train.optfile=1!第二次运行时使用mipstartrep(p,‘modelstat’)=列车模型;rep(p,‘solvestat’)=列车solvestat:;rep(p,'objval')=列车.objval;);显示代表;

原始公式的选项文件:xpress.opt

loadmipsol=1

batinclude文件gentestset.inc软件.给出了生成测试集的说明。它产生a测试(_T)b_test(测试)求解p时忽略了哪些方程的细节。

实际模型的设置包括方程式中的所有数据点定义(_D)b_def(定义)为了删除与测试集相对应的方程,我们在所有方程中引入非负松弛变量。然后,在对应于训练集的方程中,我们将松弛变量的上界设置为零,在对应测试集的方程中将松弛变量的上限设置为无穷大。同时我们修复了错误度量错误(_E)错误(_err)通过将上界设置为零,属于测试集。因此,仅通过选择松弛变量,测试集方程总是可以满足的——实际上,它们是根据需要从模型中删除的。另一种公式可以“包括”每个场景中所需的数据方程,但定义数据中从一个场景到下一个场景的更新要大得多。

使用GUSS制定的交叉验证:该模型基本上模仿了标准模型的功能,但在幕后实现解算器循环效率更高,并且如果同时执行两次模型运行,其结果显而易见。这些更改位于GAMS代码的最后40行中。

$title十倍交叉验证示例$eolcom!$setglobal num_folds 10个设置“类别1的集合”/1*1505/b'第2类设置'/1*957/o“观察”/1*14/p“要执行的折叠”/1*%num_folds%/f“要选择的最大功能”/1*10/*从数据文件中读取数据参数a_data(a,o)/$挂牌$包括“a_data.inc”$联机/;参数b_data(b,o)/$挂牌$包括“b_data.inc”$联机/;集合a_test(p,a),b_test(p,b)'测试集'a_trai(a),b_trai“训练集”;*定义问题标量w_tol/1/功能/6/;正变量a_err(a),sla(a)b_err(b),slb(b);变量c,重量(o),伽玛射线;二元变量y(o);方程式w_def1(o),w_def2(o),y_def,c_def,a_def(a),b_def(b);w_def1(o)。。重量(o)=l=w_tol*y(o);w_def2(o)。。重量(o)=g=-w_tol*y(o);_定义。。总和(o,y(o))=e=特征;定义(_def)。。c=e=sum(a,a_err(a))+sum(b,b_err(b));a_def(a)。。-总和(o,a _数据(a,o)*权重(o))+γ+1=l=a _ err(a)+sla(a);b_def(b)。。总和(o,b_data(b,o)*权重(o))-gamma+1=l=b_err(b)+slb(b);模型列车/所有/;train.optfile=1;$batinclude gentestset.inc“p,a”“p,b”参数wval(p,o),gval(p);设置标题“report”/modelstat、solvestat、objval/;参数scerep(p,标题)scopt(*)/SkipBaseCase 1,Optfile 1,LogOption 2/;设置dict/p.场景。“范围。选择。场景报告错误(_E)。上部。奥珀错误。上部。缓冲器第二语言习得。上部。无自由slb。上部。bfree(自由)重量水平。wval(沃尔沃)伽马射线。级别。格瓦尔/$echo loadmipsol=1>xpress.opt参数aupper(p,a)、bupper(p,b)、afree(p,a)、bfree(p,b);aupper(p,a)$(不是a_st(p,a))=inf;bupper(p,b)$(非b_test(p,b))=inf;afree(p,a)$a_test(p,a)=inf;bfree(p,b)$b_test(p,b)=inf;选项mip=xpress,optcr=0,optca=0;使用mip最小化c场景dict求解列车;显示场景,gval;

首先,参数奥珀,缓冲器,无自由bfree(自由)用于分别设置测试集方程中误差和松弛变量的界。上界的设置由控制集dict中显示的语法控制。此外,分类器的输出(w、 伽马射线)对于交叉验证的每个折叠,使用dict集将结果放入参数中wval(沃尔沃)格瓦尔分别是。最后,GUSS选项用于确保后续解算指示处理解算器选项(选项文件1)它指示解算器使用前面的解决方案来启动分支与切割过程(loadmipsol=1).

此示例的完整数据和模型文件位于(galaxy zip档案). 基于威斯康星州乳腺癌诊断数据库的第二个实例的数据和模型可下载为(wdbc zip存档).

二次方程序

GUSS不仅限于线性程序,而且可以更广泛地使用。简单(索引)二次模型可以使用GUSS求解。以下示例说明了GUSS在二次规划中的使用。在本例中,使用支持向量机确定将数据分为两类的线性分类器。我们使用以下模型:

\开始{方程式}\开始{array}{ll}\文本{最小}_{w,g,z}&(1/2)\|w\|2^2+Ce^{T} z(z)\\\文本{subject to}&D(Aw-g)+z\geq 1\\&z\geq 0\\\结束{数组}\结束{方程式}

这里,\(A\)是一个包含训练数据(按特征分类的患者)的矩阵,\(D\)是一个值为\(+1\)或\(-1\)的对角矩阵(每个值表示两类中的一类)\(C)是一个参数,它衡量了最大化类((2/w_2))与最小化误分类误差((z))之间的差值的重要性。解决方案\(w)和\(g)用于定义一个分离超平面\({x|w^Tx=g}\)来分类(看不见的)数据点。

如前所述,标准线性支持向量机本身不是切片模型。它在交叉验证训练下成为切片模型,在不同的数据上进行多次求解。在这种情况下,只有数据(A)和(D)在解算之间有所不同,这与切片模型的定义相吻合。

此示例的数据来自威斯康星州乳腺癌诊断数据库,并且可用在这里。数据已转换为GAMS文件wdbc.gms软件,它定义了\(A\)和\(D\)。以下GAMS公式的实际源代码可用在这里.

二次支持向量机的GUSS公式:

$title使用GUSS的十倍交叉验证示例$eolcom!$setglobal num_folds 10个设置p/1*%num_folds%/!要执行的折叠! 读取数据$include“wdbc.gms”设置测试(p,i)!测试装置! 定义问题参数C/1/;正变量z(i);变量obj、w(k)、gamma、slack(i);方程obj_def,sep_def(i);obj_def..obj=e=1/2*总和(k,sqr(w(k)))+C*总和(i,z(i));sep_def(i)。。D(i)*(总和(k,A(i,k)*w(k))-gamma)+z(i)+松弛(i)=g=1;模型列车/所有/;! 生成测试集(在每个问题中删除)回路(p,$batinclude gentestset2.inc“p,i”);设置标题report/modelstat、solvestat、objval/;参数scerep(p,标题)scopt/SkipBaseCase 1,LogOption 2/;设置dict/p.场景。“范围选项。场景报告z上方。iupper(牛)松开上部。ifree/;参数iupper(p,i),ifree(p,i);iupper(p,i)$(非测试(p,i))=inf;ifree(p,i)$test(p,i)=inf;选项qcp=conopt,optcr=0,optca=0;使用qcp最小化obj场景dict求解列车;显示screp;

由于问题是二次的,我们必须使用二次规划求解器。重量和伽马的可变值可以保存下来,以便以后使用与上述线性情况相同的方法进行测试。

batinclude文件gentestset2.inc公司非常类似于gentestset.inc软件来自前面的交叉验证示例。gentestset2.inc公司不过,只处理了一组,而不是两组。此配方的完整GAMS源代码可从中获得zip存档.

GAMS中基于GUSS的DEA建模

使用Gather-Update-Solve-Scatter(GUSS)工具,可以在GAMS中最有效地求解数据包络分析(DEA)模型。这是自GAMS 23.7版以来的首选方法,因此GAMS/DEA求解器不再可用。

一篇题为“GUSS:解决数据相关模型的集合”的论文包含GUSS的两个附加应用程序示例在这里.

介绍

基本(CCR)DEA模型是由\(k)索引并由定义的模型集合

\开始{方程式}\开始{数组}{lll}\文本{最大}_{u,v}&u^TY_{\ast,k}&(\text{目标切片})\\\text{subject to}&v^TX_{\ast,k}=1&(\text{slice constraint})\\&u^TY\leq v ^TX&(\text{核心约束})\\&u,v\geq 0&(\text{核心约束})\\\结束{数组}\结束{方程式}

其中,\(X,Y\)是数据矩阵。

如果在GAMS中不使用GUSS,模型将在\(k)上的循环中定义和求解,要求为\(k \)的每个值使用不同的实例多次生成模型。GUSS是一种定义单个程序并将其传递给任何底层GAMS解算器的替代(且更有效)方法。这样,单个程序就不会被重新生成,而是被定义为相互之间的数据修改。这减少了总体模型生成时间。此外,前面的解决方案可以用作后面解决方案的起点,以加快总体处理时间。

一些DEA示例比较了这两种公式。这两种配方的实际源代码都可用在这里.

DEA示例

原始GAMS公式(无GUSS):在所有这些模型中,模型设置和数据都在文件的顶部给出,感兴趣的代码在最后10行左右。在这个设置中,我们在集合k上循环,并在每次求解之前明确更改目标函数中的数据和模型的第一个约束。我们只输出解决方案的最小摘要。

$title数据包络分析-DEA$ontext(上下文)数据包络分析(DEA)是一种测量相对存在多个输入和输出使比较变得困难。效率=产出加权和/投入加权和找到最大限度提高一个装置效率的重量,同时确保使用这些权重,没有其他单位的效率小于1。原始的并给出了对偶公式。Dyson、Thanasoulis和Boussofiane,DEA指南。华威大学商学院$脱机设置i“单位”/Depot1*Depot20/j“投入和产出”/库存、工资、问题、收据、需求/ji(j)“投入”/库存、工资/jo(j)“输出”/问题、收据、需求/;别名(i,k);表数据(i,j)股票工资发放收据要求停车场1 3 5 40 55 30停车场2 2.5 4.5 45 50 40停车场3 4 6 55 45 30停车场4 6 7 48 20 60停车场5 2.3 3.5 28 50 25停车场6 4 6.5 48 20 65停车场7 7 10 80 65 57停车场8 4.4 6.4 25 48 30停车场9 3 5 45 64 42停车场10 5 7 70 65 48停车场11 5 7 45 65 40停车场12 2 4 45 40 44停车场13 5 7 65 25 35部门14 4 38 18 64停车场15 2 3 20 50 15停车场16 3 6 38 20 60部门17 7 11 68 64 54停车场18 4 6 25 38 20停车场19 3 4 45 67 32部门20 3 6 57 60 40参数slice(j)'数据切片'eff_k(i)“效率报告”;正变量v(ji)“输入权重”u(jo)'输出权重';变量eff“效率”;方程定义了“效率定义-加权输出”denom“加权输入”石灰(i)‘输出/输入<1’;定义。。eff=e=总和(jo,u(jo)*切片(jo));名称。。总和(ji,v(ji)*切片(ji))=e=1;石灰(i)。。总和(jo,u(jo)*数据(i,jo))=l=总和(ji,v(ji)*数字(i,ji));模型dea/defe,denom,lime/;设置headers/modelstat、solvestat、objval/;参数rep(k,headers)'解决方案报告摘要';选项limrow=0,limcol=0,solprint=silent,solvelink=%solvelink.loadLibrary%;回路(k,切片(j)=数据(k,j);利用lp-max-eff求解dea;rep(k,'modelstat')=数据包络模型;rep(k,‘solvestat’)=迪亚·索尔维斯塔;rep(k,‘objval’)=数据集.对象;);显示代表;

使用GUSS制定的DEA问题:在此设置中,solve语句包含一个额外的关键字场景,该场景指向一个名为字典。此集合的内容是指向GUSS的指令,表示场景索引为\(k\),参数片由参数数据和变量值填充效率存储在参数中有效(_k)对于每个解决的场景。更多细节如下。

$title数据包络分析-DEA设置i“单位”/Depot1*Depot20/j‘输入和输出’/库存、工资、问题、收据、需求/ji(j)“投入”/库存、工资/jo(j)“输出”/问题、收据、需求/;别名(i,k);表数据(i,j)股票工资发放收据要求停车场1 3 5 40 55 30停车场2 2.5 4.5 45 50 40停车场3 4 6 55 45 30停车场4 6 7 48 20 60停车场5 2.3 3.5 28 50 25停车场6 4 6.5 48 20 65停车场7 7 10 80 65 57停车场8 4.4 6.4 25 48 30停车场9 3 5 45 64 42停车场10 5 7 70 65 48停车场11 5 7 45 65 40停车场12 2 4 45 40 44停车场13 5 7 65 25 35停车场14 4 38 18 64停车场15 2 3 20 50 15停车场16 3 6 38 20 60停车场17 7 11 68 64 54停车场18 4 6 25 38 20停车场19 3 4 45 67 32停车场20 3 6 57 60 40参数slice(j)'数据切片'eff_k(i)“效率报告”;正变量v(ji)“输入权重”u(jo)'输出权重';变量eff“效率”;方程定义了“效率定义-加权输出”denom“加权输入”石灰(i)‘输出/输入<1’;定义。。eff=e=总和(jo,u(jo)*切片(jo));名称。。总和(ji,v(ji)*切片(ji))=e=1;石灰(i)。。总和(jo,u(jo)*数据(i,jo))=l=总和(ji,v(ji)*数字(i,ji));模型dea/defe,denom,lime/;设置标题“report”/modelstat,solvestat,objval/;参数scenrep(k,headers)'解决方案报告摘要'范围/跳过基本情况1/;设置dict/k.scenario。“切片.param。数据有效水平。有效(_k)范围.选项。场景报告/;切片(j)=0;选项lp=cplex;使用lp-max-eff场景dict求解dea;显示scenep,eff_k;

在GUSS版本中,我们使用集合表示要求解的模型集合字典。的第一个元素字典确定用于场景(集合)索引的集合,在本例中为\(k)。然后,dict的第二个元素详细说明了在每个场景\(k)中,参数片是使用参数数据片实例化的。本质上,这与GAMS声明相对应:

切片(j)=数据(k,j)

请注意,场景索引\(k\)必须显示为参数数据的第一个索引。第三个元素字典允许建模者从每个解中收集信息,并将其存储到GAMS参数中。本质上字典对应于GAMS语句:

eff_k(k)=有效。

在解决方案\(k)后立即执行。

还可以使用GUSS制定更复杂的场景模型,包括正在更新的多个方程。这由基本DEA模型的对偶表示,由

\开始{方程式}\开始{数组}{lcl}\文本{分钟}_{z,\lambda}&z&(\text{objective})\\\text{subject to}&X^\ast\lambda\leq zX_{\ast,k}&(\text{slice constraint})\\&Y^\ast\lambda\geq Y_{\ast,k}&(\text{slice constraint})\\&\lambda\geq 0&(\text{core constraint})\\\结束{数组}\结束{方程式}

下一个示例比较了此模型的两种公式。这两种配方的实际源代码可用在这里.

原始GAMS配方(不含GUSS):

$title数据包络分析-DEA(传统)设置i“单位”/Dopot1*Depot20/j‘输入和输出’/库存、工资、问题、收据、需求/ji(j)“投入”/库存、工资/jo(j)“输出”/问题、收据、需求/;别名(k,i);表数据(i,j)股票工资发放收据要求停车场1 3 5 40 55 30停车场2 2.5 4.5 45 50 40停车场3 4 6 55 45 30停车场4 6 7 48 20 60停车场5 2.3 3.5 28 50 25停车场6 4 6.5 48 20 65停车场7 7 10 80 65 57停车场8 4.4 6.4 25 48 30停车场9 3 5 45 64 42停车场10 5 7 70 65 48停车场11 5 7 45 65 40停车场12 2 4 45 40 44停车场13 5 7 65 25 35停车场14 4 38 18 64停车场15 2 3 20 50 15停车场16 3 6 38 20 60停车场17 7 11 68 64 54停车场18 4 6 25 38 20停车场19 3 4 45 67 32停车场20 3 6 57 60 40参数片(j)'数据片'eff_k(i)“效率报告”;变量z“效率”lam(i)“双重权重”;正变量lam;方程式dii(ji)“输入对偶”dio(jo)‘输出对偶’;*对偶模型dii(ji)。。sum(i,lam(i)*数据(i,ji))=l=z*切片(ji);dio(jo)。。总和(i,lam(i)*数据(i,jo))=g=切片(jo);具有CRS/dii、dio/的模型deadc对偶;参数rep“摘要报告”;选项limrow=0,limcol=0,solprint=silent,lp=cplex,solvelink=%solvelink.loadLibrary%;回路(k,切片(j)=数据(k,j);利用lp最小化z求解deadc;rep(k,'modelstat')=deadc.modelstat;rep(k,'solvestat')=deadc.modelstat;rep(k,‘objval’)=死亡对象;);显示代表;

使用GUSS建立的对偶(CRS)DEA模型:关键建模语句出现在下面的最后10行中。

$title数据包络分析-DEA(双重,GUSS)设置i“单位”/Dopot1*Depot20/j“投入和产出”/库存、工资、问题、收据、需求/ji(j)“投入”/库存、工资/jo(j)“输出”/问题、收据、需求/;别名(k,i);表数据(i,j)股票工资发放收据要求停车场1 3 5 40 55 30停车场2 2.5 4.5 45 50 40停车场3 4 6 55 45 30停车场4 6 7 48 20 60停车场5 2.3 3.5 28 50 25停车场6 4 6.5 48 20 65停车场7 7 10 80 65 57停车场8 4.4 6.4 25 48 30停车场9 3 5 45 64 42停车场10 5 7 70 65 48停车场11 5 7 45 65 40部门12 2 4 45 40 44停车场13 5 7 65 25 35停车场14 4 38 18 64部门15 2 3 20 50 15停车场16 3 6 38 20 60停车场17 7 11 68 64 54部门18 4 6 25 38 20停车场19 3 4 45 67 32停车场20 3 6 57 60 40参数片(j)'数据片'eff_k(i)“效率报告”;变量z“效率”lam(i)“双重权重”;正变量lam;方程式dii(ji)“输入对偶”dio(jo)'双输出';*对偶模型dii(ji)。。总和(i,lam(i)*数据(i,ji))=l=z*切片(ji);dio(jo)。。总和(i,lam(i)*数据(i,jo))=g=切片(jo);带有CRS/dii,dio/的模型deadc对偶;设置标题“report”/modelstat、solvestat、objval/;参数scenrep(k,headers)'解决方案报告摘要'范围/跳过基本情况1/;设置dict/k.方案。“范围。选择。场景报告切片。参数。数据z.水平。有效(_k)/;切片(j)=0;选项lp=cplex;使用lp-min-z场景dict解决deadc;显示scenep,eff_k;

将这些模型扩展到具有加权输出或可变规模回报的公式,很容易在GAMS中使用场景求解器进行公式化。可以下载此扩展模型在这里.

这个DEA模型在模型库中类似于扩展模型,但不使用GUSS。