全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3073
推到 Plurk!
推到 Facebook!

請問有人用過Delphi呼叫線性規劃軟體求解嗎

尚未結案
chiaseng
一般會員


發表:2
回覆:11
積分:2
註冊:2003-02-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-02-26 14:05:32 IP:163.28.xxx.xxx 未訂閱
各位大大好, 因為寫一個啟發式解法,需要利用Delphi持續產生LP問題後再求解。 目前試過的方式有呼叫Lindo的DLL檔求解: 不過Lindo提供的函式庫沒有讀取檔案及把結果寫出成檔案的函式.. >.< 不知道有沒有哪位大大有處理過類似的情形呢,謝謝大家。
pgdennis
資深會員


發表:41
回覆:526
積分:443
註冊:2002-05-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-02-27 11:04:50 IP:61.219.xxx.xxx 未訂閱
你的問題可以講詳細點嗎,你說 >,我是沒呼叫過 >..恩..再討論
------
星期一,二...無窮迴圈@@
chiaseng
一般會員


發表:2
回覆:11
積分:2
註冊:2003-02-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-02-27 15:01:53 IP:163.28.xxx.xxx 未訂閱
謝謝你, 我說的是讀入問題的部分, 因為我的LP問題是利用Delphi產生出來成一個檔案, 所以需要有讀取問題檔案的函式, 但是Lindo的DLL檔函式庫裡好像就沒有, 結論應該是受限於Lindo所提供的函式庫太少。 只能再找其他方式了。非常謝謝你的回答。
chiaseng
一般會員


發表:2
回覆:11
積分:2
註冊:2003-02-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-02 22:45:36 IP:163.28.xxx.xxx 未訂閱
繼續試了幾天, 不管是用Lindo或是Cplex的DLL檔, 發現最後仍然無法正常呼叫軟體求解 >"< 請大家幫幫忙, 能不能寫一段範例程式讓我參考一下, (內容大概就是由Delphi中,透過DLL檔的函式庫, 寫進線性規劃問題,再進行求解,再獲取求解結果。) 感激不盡。Q_Q
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-03 09:28:52 IP:61.218.xxx.xxx 未訂閱
chiaseng 兄,大家有心幫忙,只是資訊太少 您說,您用Delphi 產生了LP問題檔 而Lindo 並沒有讀檔(LP問題檔)與寫入求解後的檔案(輸出檔案)的函式,是此意嗎?    那麼Lindo 所能接受的資料是何型態 ? Lindo 所輸出的資料是何型態 ? 當然,讀檔(輸入)與寫檔(輸出)的部份交由delphi 來實現 您需要做的是,將檔案讀進的資料轉換成Lindo 輸入輸出所能接受的資料格式    若仍覺沒有概念,不妨將lindo 所export 的function po 出來,我們參考看看        
chiaseng
一般會員


發表:2
回覆:11
積分:2
註冊:2003-02-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-03 12:57:38 IP:163.28.xxx.xxx 未訂閱
謝謝, 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-03 14:20:46 IP:61.218.xxx.xxx 未訂閱
這是Lindo dll 的原始宣告嗎? 若不是的話,也一併po上來,參考看看 < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=8147403&CC=182217">
chiaseng
一般會員


發表:2
回覆:11
積分:2
註冊:2003-02-24

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-03 15:38:47 IP:163.28.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-03-04 18:21:48 IP:61.30.xxx.xxx 未訂閱
引言: 各位大大好, 因為寫一個啟發式解法,需要利用Delphi持續產生LP問題後再求解。 目前試過的方式有呼叫Lindo的DLL檔求解: 不過Lindo提供的函式庫沒有讀取檔案及把結果寫出成檔案的函式.. >.< 不知道有沒有哪位大大有處理過類似的情形呢,謝謝大家。
我是不知道參數要給什麼.... 也不知道我試的是否正確 不過不要用stdcall 用cdecl 就不會有Error
chiaseng
一般會員


發表:2
回覆:11
積分:2
註冊:2003-02-24

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-03-04 20:21:54 IP:140.113.xxx.xxx 未訂閱
zycagod你好, 我將stdcall改成cdecl後,執行後一樣會出現存取錯誤的訊息, 不知道您的測試成功程式碼可不可以po出來讓我參考一下, 讓我對照看看問題出在哪裡, 感激Q_Q。
pgdennis
資深會員


發表:41
回覆:526
積分:443
註冊:2002-05-23

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-03-04 23:13:21 IP:61.59.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-03-05 09:31:53 IP:203.70.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-03-05 14:57:15 IP:140.113.xxx.xxx 未訂閱
感謝大家熱情幫忙,太感動了~ 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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-11-10 10:32:21 IP:222.84.xxx.xxx 未訂閱
chiaseng你好!我也想做一个delphi呼叫lindo的dll程序.可以把你做的程序代码帖出来让我参考吗?
chiaseng
一般會員


發表:2
回覆:11
積分:2
註冊:2003-02-24

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-11-10 11:54:40 IP:220.229.xxx.xxx 未訂閱
哇...這件事情已經事隔兩年半多了, 我已經沒有在碰過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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-11-10 15:50:46 IP:219.159.xxx.xxx 未訂閱
chiaseng你好!我是想用delphi做个求最小值(min)的线性规划程序.用delphi调用Lindo来实现.请指点.在线等待.
chiaseng
一般會員


發表:2
回覆:11
積分:2
註冊:2003-02-24

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-11-10 16:26:12 IP:220.229.xxx.xxx 未訂閱
我有給你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;
系統時間:2024-04-26 6:49:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!