我一直致力于使用Revised Simplex方法解决任何最大化LPP的程序 . 我有一个问题,因为我正在尝试输入一个序列来解决非基本变量的问题 . 我的代码如下:
matmax:=proc(tableau,basic)
local pivot,T,nbv,n,m,b;
T:=evalm(tableau);
n:=coldim(T); m:=rowdim(T);
b:=evalm(basic);
print(evalm(T));
nbv:={seq(i,i=2..n-1)}minus{seq(b[i],i=1..m)};
pivot:=getpiv(T,nbv);
while not pivot=FAIL do
b[pivot[1]]:=pivot[2];
T:=evalm(gauss(col(T,pivot[2]),pivot[1])&*T);
print(evalm(T));
nbv:={seq(i,i=2,..n-1)}minus{seq(b[i],i=1..m)};
pivot:=getpiv(T,nbv);
od;
[evalm(T),evalm(b)];
end;
gauss和getpiv命令是在这个程序中编写的程序,这些工作正常 . 但是在执行此过程时,Maple返回消息“Error,(在matmax中)无法执行seq”如果有人可以给我任何帮助来解决这个问题,我将不胜感激 .
2 回答
如果在调用
matxmax
之前尚未加载linalg
包,那么像coldim
这样的命令将简化不起作用,并且不会产生n
和m
的整数结果,这些结果是在seq
调用的范围内使用时所期望的 . 我相信这就是您出现seq
错误的原因,因为n
和m
未按预期分配整数中间结果 .您可以尝试通过在使用
with(linalg)
调用matmax
之前加载包来解决此问题 . 但这并不是那么强大,而且有些情况可能无法奏效 .with
命令赢得了't work within a procedure body, so you can' t,将其置于procmatmax
的defn中 .您可以在上面的
matmax
中插入一行,比如local
声明行,就像,这将使
coldim
和来自linalg
包的朋友工作 . 不幸的是,您使用了名称pivot
作为局部变量,并且与linalg
包中的pivot
导出冲突 . 所以通过uses
的简单修复还不够 . 您可以使用除pivot
之外的某个名称,以及那个简单的uses
行,当然 .我自己的偏好是让所有内容都完全明确,以便稍后您或其他任何阅读代码的人都可以更清楚地理解它,即使它更长 . 所以我会使用
linalg[coldim]
而不是coldim
,依此类推matmax
中linalg
包中的其他导出用法 .说完以上所有内容后,您应该知道
linalg
软件包在现代Maple中已弃用,LinearAlgebra
是提供您似乎正在使用的功能的新软件包 . 命令名称较长,但使用较新的包意味着您不需要所有这些evalm
调用(或任何类似的调用) .问题可能在于你的gauss和getpiv命令,因为它们可能无法用于你的程序,你能扩展他们的工作吗?