請問有人用過Delphi呼叫線性規劃軟體求解嗎 |
尚未結案
|
chiaseng
一般會員 發表:2 回覆:11 積分:2 註冊:2003-02-24 發送簡訊給我 |
|
pgdennis
資深會員 發表:41 回覆:526 積分:443 註冊:2002-05-23 發送簡訊給我 |
|
chiaseng
一般會員 發表:2 回覆:11 積分:2 註冊:2003-02-24 發送簡訊給我 |
|
chiaseng
一般會員 發表:2 回覆:11 積分:2 註冊:2003-02-24 發送簡訊給我 |
|
ddy
站務副站長 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
chiaseng 兄,大家有心幫忙,只是資訊太少
您說,您用Delphi 產生了LP問題檔
而Lindo 並沒有讀檔(LP問題檔)與寫入求解後的檔案(輸出檔案)的函式,是此意嗎? 那麼Lindo 所能接受的資料是何型態 ? Lindo 所輸出的資料是何型態 ?
當然,讀檔(輸入)與寫檔(輸出)的部份交由delphi 來實現
您需要做的是,將檔案讀進的資料轉換成Lindo 輸入輸出所能接受的資料格式 若仍覺沒有概念,不妨將lindo 所export 的function po 出來,我們參考看看
|
chiaseng
一般會員 發表:2 回覆:11 積分:2 註冊:2003-02-24 發送簡訊給我 |
謝謝,
Lindo的DLL檔函式庫宣告方式像是:
Bool = Longint;
Float = Single;
function APPCOL(var KNAME: PChar; var NONZ: Longint; var VAL: Float;
var IRO, TROUBLE: Longint): Bool; StdCall;
function GO(var LIMGO, ISTAT: Longint): Bool; StdCall; implementation
function APPCOL; external 'LNDDLL32.DLL' index 1;
function GO; external 'LNDDLL32.DLL' index 15; APPCOL函式的功能在於將LP問題插入新的Column,GO是求解的函式,
宣告完後應該就可以在程式碼中呼叫來進行:
APPCOL(Kname,Nonz,Value,Iro,Trouble);
只是我照這樣做就會出現錯誤訊息:
Access violation at address 0047317B in module 'LNDDLL32.DLL'.
所以在猜想應該是宣告錯誤的關係,
因此想問問看有沒有人做過類似的東西,
|
ddy
站務副站長 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
|
chiaseng
一般會員 發表:2 回覆:11 積分:2 註冊:2003-02-24 發送簡訊給我 |
Lindo原始軟體中有一個.h的宣告檔:
// Definitions for all LINDO library routines
extern void APPCOL( char **, long *, float *, long *, long *);
extern void APPCOLX( char *, long *, float *, long *, long *);
extern void BINVT( double *);
extern void BIP( float *);
extern void CAPOUT( long *);
extern void CLRBAS();
extern void D2DMY( long *, long *, long *, long *);
extern void DEFROW( long *, float *, long *, long *);
extern void DELCON( long *);
extern void DMY2D( long *, long *, long *, long *, long *);
extern void DRPVAR( long *, double *, double *);
extern void FPRIME( long *, long *);
extern void FREEIT( long *);
extern void GETCOL( long *, char **, long *, float *, long *, float *, long *);
extern void GETCOLX( long *, char *, long *, float *, long *, float *, long *);
extern void GO( long *, long *);
extern void HEAPFR( long *, long *, long *, long *);
extern void HEAPIT( long *, long *, long *, long *);
extern void ILINDO();
extern void INIT();
extern void INSERT( long *, long *, float *, long*);
extern void INSROW( long *, long *, long *, float *);
extern void INVPRM( long *, long *);
extern void KLOSE( long *);
extern void LOOK( long *, long *);
extern void LSALTN( long *, char **, long *, long *, long *);
extern void LSALTNX( long *, char *, long *, long *, long *);
extern void LSAVPR( double *, long *, char **, long *, long *);
extern void LSAVPRX( double *, long *, char *, long *, long *);
extern void LSDMPS( long *);
extern void LSEXIT();
extern void LSGTPR( double *, char **, long *);
extern void LSGTPRX( double *, char *, long *);
extern void LSGTRO( long *, long *, long *, float *, long *);
extern void LSINSR( long *);
extern void LSPUNC( long *, char **);
extern void LSPUNCX( long *, char *);
extern void LUNGET( long *, long *, long *);
extern void LUNOPN( long *, long *, char **, long *, long *, long *, long *);
extern void LUNOPNX( long *, long *, char *, long *, long *, long *, long *);
extern void LXBRED( long *, long *);
extern void LXBWRT( long *, long *);
extern void MAKINT( long *);
extern void NDXOFV( char **, long *, long *, long *);
extern void NDXOFVX( char *, long *, long *, long *);
extern void NEWIP( float *, float *);
extern void NINTEQ( long *);
extern void OUTSPC( long *);
extern void PARBGN( long *, float *);
extern void PARSTP( float *, long *, long *);
extern void QUIET( long *);
extern void RDBC( long *);
extern void RDMPS( long *, long *);
extern void REPROW( long *, float *, float *);
extern void REPVAR( long *, float *, float *);
extern void RETR( long *);
extern void RNGBGN();
extern void RNGCOL( long *, float *, float *, float *);
extern void RNGROW( long *, float *, float *, float *);
extern void SAVE( long *);
extern void SDBC( long *);
extern void SETIPT( float *);
extern void SETQCP( long *);
extern void SETSLB( long *, float *);
extern void SETSUB( long *, float *);
extern void STATS( long *);
extern void WATSUP( float *, int *);
|
zycagod
一般會員 發表:0 回覆:14 積分:12 註冊:2002-07-08 發送簡訊給我 |
|
chiaseng
一般會員 發表:2 回覆:11 積分:2 註冊:2003-02-24 發送簡訊給我 |
|
pgdennis
資深會員 發表:41 回覆:526 積分:443 註冊:2002-05-23 發送簡訊給我 |
引言: zycagod你好, 我將stdcall改成cdecl後,執行後一樣會出現存取錯誤的訊息, 不知道您的測試成功程式碼可不可以po出來讓我參考一下, 讓我對照看看問題出在哪裡, 感激Q_Q。我剛從lindo網站下載使用版,,它裡面有vc,vb的範例,,我跑兩各都會說找不到 Lnddll32.dll,我把這個檔copy至system32了,,也用loadlibrary函式測試也說找不到..怪哉!!!!!..名名就在眼前..竟說找不到 不然他那個 > 剛剛又看到一> // > // cFileIn = "C:\\LINDO\\LNDIN.TXT"cFileOut = "C:\\LINDO\\LNDOUT.TXT"cFileSolu = "C:\\LINDO\\SOLUTION.TXT"
------
星期一,二...無窮迴圈@@ |
zycagod
一般會員 發表:0 回覆:14 積分:12 註冊:2002-07-08 發送簡訊給我 |
引言: zycagod你好, 我將stdcall改成cdecl後,執行後一樣會出現存取錯誤的訊息, 不知道您的測試成功程式碼可不可以po出來讓我參考一下, 讓我對照看看問題出在哪裡, 感激Q_Q。type Bool = Longint; Float = Single; TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; function APPCOL(var KNAME: PChar; var NONZ: Longint; var VAL: Float; var IRO, TROUBLE: Longint): Bool; cdecl; function GO(var LIMGO, ISTAT: Longint): Bool; cdecl; var Form1: TForm1; implementation function APPCOL; external 'LNDDLL32.DLL' index 1; function GO; external 'LNDDLL32.DLL' index 15; {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); Var A:pchar; b,d,e:Longint; c:Float; begin GetMem(a,255); //你有配置嗎...如果沒有的確會有Access violation APPCOL(a,b,c,d,e); FreeMem(a); end; end. |
chiaseng
一般會員 發表:2 回覆:11 積分:2 註冊:2003-02-24 發送簡訊給我 |
感謝大家熱情幫忙,太感動了~ Q_Q
我已經成呼叫Lindo來求解LP問題了,
自己try完之後整理一些出錯的地方可供以後的人參考:
======================================================================
Summary:
1.在C裡面加上*的參數,應在Pascal宣告為 var。string 宣告為PChar
2.用stdcall或用cdecl來外部呼叫Lindo的DLL檔都可以正常使用
3.PChar配置問題,沒有事先配置一樣可以求解,之前存取錯誤的原因好像是前面宣告錯誤的關係,我是用小例題做測試,不配置的話不知道未來是否會有問題^^"。
4.使用Lindo的函式,不可以直接把值寫在裡面,必須先給變數一個值之後再把變數寫在函式中。如:
Iro[1] := 1;
Value[1] := 30;
Kname := 'Y';
Nonz := 3;
APPCOL(PChar(Kname),Nonz,Value[1],Iro[1],Trouble);
======================================================================
我之前一直出錯的原因大概是這幾點嚕...再次感謝大家~~ ^_^
|
gzsgzs198054
一般會員 發表:2 回覆:2 積分:0 註冊:2005-10-08 發送簡訊給我 |
|
chiaseng
一般會員 發表:2 回覆:11 積分:2 註冊:2003-02-24 發送簡訊給我 |
哇...這件事情已經事隔兩年半多了,
我已經沒有在碰過Delphi,
其實已經忘得差不多了,
我把我當初的程式碼給你看看,你可能要自己研究了,
http://w3.nctu.edu.tw/~u9032509/LindoExample.zip 主要步驟:
1.引用Lindo DLL: uses Lindo (Lindo.pas檔案)
2.呼叫Lindo.pas裡面定義的functions ps.
要注意的是,你只要參考程式碼就好,
因為程式本身還有結合資料庫等等,所以應該是無法正確執行。
|
gzsgzs198054
一般會員 發表:2 回覆:2 積分:0 註冊:2005-10-08 發送簡訊給我 |
|
chiaseng
一般會員 發表:2 回覆:11 積分:2 註冊:2003-02-24 發送簡訊給我 |
我有給你Source Code了,
你不就可以知道"如何引用DLL","如何呼叫functions",
這樣你應該就會使用了才對啊。 這是我從Source Code取出的範例,詳細做法不要再問我了,我真的忘光了:
var
LUNIT,LFNAME:LongInt;
INROUT, NOTFMT, LUTRMI, LUTRMO, NOISE: Longint;
Nonz,Istat:LongInt;
IDIR:LongInt;
Trouble,Idrow:LongInt;
Value:array[1..3] of float;
IRO:array[1..3] of LongInt;
RHS,Primal,Dual:float;
KFNAME:PChar;
LIMGO: Longint;
J: Longint;
i:integer;
begin
//---------------------------------------------------------
//
// When the user presses the Solve button we use the 32 bit
// LINDO DLL (LNDDLL32.DLL) to generate and solve the
// following small LP:
//
// Min 20 X 30 Y 40Z
// S.T.
// X Z = 1
// Y Z = 1
// End
//
// Results are posted to the dialog box.
//
//---------------------------------------------------------
// // Initialize LINDO by calling ILINDO and INIT.
ILINDO;
INIT; // Capture any standard output in a file: // First, open a file
LUNIT := 60;
LFNAME := 10;
KFNAME := 'output.txt';
INROUT := 1; NOTFMT := 0; LUTRMI := 5; LUTRMO := 6;
LUNOPN(LUNIT,LFNAME,KFNAME,INROUT,NOTFMT,LUTRMI,LUTRMO); // Now, tell LINDO to divert all standard
// output to this unit
CAPOUT(LUNIT); // Put LINDO in TERSE mode
NOISE := 0;
QUIET(NOISE); // Define the rows
// Define objective row
IDIR := 1; //-1:最大化,1:最小化
RHS := 0; // Min -(xxx xxx RHS) = -xxx-xxx-0
DEFROW(IDIR,RHS,IDROW,TROUBLE); // Define constraint rows
IDIR := 0;
RHS := 1;
for i := 1 to 2 do DEFROW(IDIR,RHS,IDROW,TROUBLE); // Define our columns
// Call APPCOL to send LINDO column X
KFNAME := 'X';
Nonz := 2;
Value[1] := 1;Value[2] := 20;
IRO[1]:= 2;IRO[2]:= 1;
for i := 1 to 2 do APPCOL(KFNAME,Nonz,Value[i],IRO[i],TROUBLE); // Call APPCOL to send LINDO column Y
KFNAME := 'Y';
Nonz := 2;
Value[1] := 1;Value[2] := 30;
IRO[1]:= 3;IRO[2]:= 1;
for i := 1 to 2 do APPCOL(KFNAME,Nonz,Value[i],IRO[i],TROUBLE); // Call APPCOL to send LINDO column Z
KFNAME := 'Z';
Nonz := 3;
Value[1] := 40;Value[2] := 1;Value[3] := 1;
IRO[1]:= 1;IRO[2]:= 3;IRO[3]:= 2;
for i := 1 to 3 do APPCOL(KFNAME,Nonz,Value[i],IRO[i],TROUBLE); // Call GO to optimize the model
LIMGO := 0;
GO(LIMGO,ISTAT); // Get the solution from LINDO // Get the objective value
I := 1;
REPROW(I,Primal,Dual);
objective.Text := floattostr(Primal); // Get the value of X
I := 2;
REPROW(I,Primal,Dual);
x.Text := floattostr(Dual); // Get the value of Y
I := 3;
REPROW(I,Primal,Dual);
y.Text := floattostr(Dual); // Shut LINDO down
LSEXIT; end;
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |