求解线性规划中的单纯型法的源码(100分)

  • 主题发起人 春风江南
  • 开始时间

春风江南

Unregistered / Unconfirmed
GUEST, unregistred user!
最基本的线性规划
 
啥意思?gz
 
我过去做过线性规划,用的是QB。
 
有pascal的吗?或者说说思路也行啊
 
是QBasic,没时间转到pascal
 
我自己在检索里查了一个,但是换了一组数据,在运行期里出错,不知道为什么。说是
数据类型不匹配,能帮我看看吗?
type
TMatrix = array of array of Extended;

const
PSUMInfinity: Extended = 1E30;
PSUMChangeBaseZero: Extended = 1E-15;
PSUMAccumulateZero: Extended = 1E-15;
PSUMZero: Extended = 1E-15;

procedure PSUM(d: Integer
m, n: Integer
var id: array of Integer;
a: TMatrix
var k: Integer);


implementation

{$R *.DFM}
procedure PSUM(d: Integer
m, n: Integer
var id: array of Integer;
a: TMatrix
var k: Integer);
var
i, j, L: Integer;
f, exm: Extended;

function SI(c, cr: Extended): Extended;
begin
if Abs(c) > cr then Result := c else Result := 0;
end;

begin
repeat
exm := PSUMInfinity * d;
k := -1;
for j := 1 to n do
if (d * a[0, j] > PSUMAccumulateZero) //就是这一句运行期有错!
and (-d * (a[0, j] - exm) > 0) then begin
exm := a[0, j];
k := j;
end;
if k = -1 then begin
k := 0;
Break;
end;
if k > n - m then Break;
exm := PSUMInfinity;
L := -1;
for i := 1 to m do begin
f := a[i, 0] / a[i, k];
if (a[i, k] > PSUMChangeBaseZero)
and (exm > f) then begin
exm := f;
L := i;
end;
end;
if L = -1 then Break

id[L] := k;
for j := 0 to n do
if j <> k then a[L, j] := a[L, j] / a[L, k];
a[L, k] := 1;
for i := 0 to m do
if i <> L then begin
for j := 0 to n do
if j <> k then
a[i, j] := SI(a[i, j] - a[L, j] * a[i, k], PSUMChangeBaseZero);
a[i, k] := SI(a[i, k] * (1 - a[L, k]), PSUMChangeBaseZero);
end;
until False;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
a: TMatrix;
id: array [0..3] of Integer;
k: Integer;
begin
SetLength(a, 4, 6);
a[0, 0] := 0
a[0, 1] := -4
a[0, 2] := -1
a[0, 3] := 0
a[0, 4] := 0
a[0, 5] := 0
a[0, 6] := 0
a[0,7]:=0;
a[1, 0] := 6
a[1, 1] := 4
a[1, 2] := 3
a[1, 3] := -1
a[1, 4] := 0
a[1, 5] := 1
a[1, 6] := 0
a[1,7]:=0;
a[2, 0] := 3
a[2, 1] := 1
a[2, 2] := 2
a[2, 3] := 0
a[2, 4] := 1
a[2, 5] := 0
a[2, 6] := 1
a[2,7]:=0;
a[3, 0] := 3
a[3, 1] := 3
a[3, 2] := 1
a[3, 3] := 0
a[3, 4] := 0
a[3, 5] := 0
a[3, 6] := 0
a[3,7]:=1;
id[0] := 0
id[1] := 6
id[2] := 3
id[3]:=3;
PSUM(1, 3, 7, id, a, k);
if k = 0 then
ShowMessage('failed')
else
showmessage(format('y=%f, x1=%f, x2=%f',[a[0,0],a[1,0],a[2,0]]));
end;
end.
 
>> SetLength(a, 4, 8);
运算结果:failed
 
能给出例中的约束条件和目标函数吗?我帮你算一下。
 
看看《计算方法》这本书,书上有算法
 
目标函数为:y=4x1+x2
约束条件为:3x1+x2=3
4x1+3x2>=6
x1+2x2<=3
 
是不是Max Y?
 
不是,是min y
所以程序中的d:=1
 
无最优解!
 
不是吧
最优解是x1:=0.6 x2:=1.2 y:=3.6
 
想不通,为什么不用 MATRIX LABORATORY ,
专门做这些事情的,对线性算法很有一套
 
得解:
OBJ.FUNC=3.6
X1=0.6
X2=1.2
X3=0
X4=0
X5=0
X6=0
 
a[0, 0] := 0
a[0, 1] := -4
a[0, 2] := -1
a[0, 3] := 0
a[0, 4] := 0
a[0, 5] := 0
a[0, 6] := 0
a[0,7]:=0;
a[1, 0] := 6
a[1, 1] := 4
a[1, 2] := 3
a[1, 3] := -1
a[1, 4] := 0
a[1, 5] := 1
a[1, 6] := 0
a[1,7]:=0;
a[2, 0] := 3
a[2, 1] := 1
a[2, 2] := 2
a[2, 3] := 0
a[2, 4] := 1
a[2, 5] := 0
a[2, 6] := 1
a[2,7]:=0;
a[3, 0] := 3
a[3, 1] := 3
a[3, 2] := 1
a[3, 3] := 0
a[3, 4] := 0
a[3, 5] := 0
a[3, 6] := 0
a[3,7]:=1;
id[0] := 0
id[1] := 6
id[2] := 3
id[3]:=3;
PSUM(1, 3, 7, id, a, k);
这些数组和各变量不知含义是什么,无法验算和调程序。
 
PSUM(1, 3, 7, id, a, k)
是调用线性规划的子程序(过程)
a[0, 0] := 0
a[0, 1] := -4
a[0, 2] := -1
a[0, 3] := 0
a[0, 4] := 0
a[0, 5] := 0
a[0, 6] := 0
a[0,7]:=0;
a[1, 0] := 6
a[1, 1] := 4
a[1, 2] := 3
a[1, 3] := -1
a[1, 4] := 0
a[1, 5] := 1
a[1, 6] := 0
a[1,7]:=0;
a[2, 0] := 3
a[2, 1] := 1
a[2, 2] := 2
a[2, 3] := 0
a[2, 4] := 1
a[2, 5] := 0
a[2, 6] := 1
a[2,7]:=0;
a[3, 0] := 3
a[3, 1] := 3
a[3, 2] := 1
a[3, 3] := 0
a[3, 4] := 0
a[3, 5] := 0
a[3, 6] := 0
a[3,7]:=1;
这些都是系数矩阵;
id[0] := 0
id[1] := 6
id[2] := 3
id[3]:=3;是基变量的下标。
具体的参数意义,您可以看一下http://www.delphibbs.com/delphibbs/dispq.asp?lid=668330
我就是从这里找到程序的。
还有,你说的“得解:”,是运行成功了?还是手动算的?
我怎么调的时候会在
if (d * a[0, j] > PSUMAccumulateZero)
这一句运行期有错!说的是数据类型不对?


 
顶部