原理:一个完整的java-lingo程序,必须包含三个要素,java程序-model文件-lingo软件,这三这个缺一不可,并且model文件与java程序是相互对应的也就是说如果你修改了其中任何一个文件其他的文件也许要做相应的修改,明确了这点后再来说明调用过程,首先java调用任何其他非java程序肯定是通过JNI将模型所需的数据传递给lingo模型文件,而后Lingo程序再去求解模型,最后再将求解后的结果返回。至于JNI的原理以及相关知识这里不做介绍,有时间的朋友可以搜一下相关知识。这里主要介绍的是Lingo部分,为了方便介绍这里举个例子:

MODEL:SETS:DAYS/ MON TUE WED THU FRI SAT SUN/:NEEDS,START,ONDUTY;ENDSETS[OBJECTIVE]MIN = @SUM(DAYS(I):START(I));@FOR(DAYS(TODAY):!Calculate number on duty;ONDUTY(TODAY)=@SUM(DAYS(D)|D #LE# 5:START(@WRAP(TODAY- D + 1,@SIZE(DAYS))));!Enforce staffing requirement;ONDUTY(TODAY)>= NEEDS(TODAY);@GIN(START););DATA:NEEDS= @POINTER(1);@POINTER(2)= START;@POINTER(3)= ONDUTY;@POINTER(4)= OBJECTIVE;@POINTER(5)= @STATUS();ENDDATAEND

这是lng模型文件,文件的model部分不多做介绍,这里主要介绍的是DATA部分,学过Lingo的朋友应该知道,Lingo模型的DATA部分,是模型的数据部分,用于初始模型中某些变量的值,DATA中NEEDS的左边写着@POINTER(1)而@POINTER(2)却写着START,这表示什么意思呢,原来NEEDS=@POINTER(1)表示,NEEDS这个变量的值是从外界获取,@PIONT(2)=START这句话的意思是告诉外界@POINTER(2)这个地方的值获取的是START的值,其他同理。说完这句后相信知道一点指针的朋友就应该知道,@POINT()这个函数表示的是一个内存的指针,并且这个指针被lingo和外界共同保留(这里指的是java程序),外界与lingo的交互正是通过这些指针进行的,实际上就是变量内存共享。说道这里还有一个疑问,那就是外界是怎样知道,当前指针所对应的变量呢,这就要看你的程序执行顺序了,在java调用lingo时,@poiter(i)这个指针的开辟是在执行lng.LSsetPointerLng这个函数后,当第一次执行lng.LSsetPointerLng时,则对应着@POINTER(1),第二次对应着@PINTER(2),依次类推,第I次执行,则对应这@POINTER(I).因此如果在lingo模型文件中某个变量对应着@ponter(k),则对于他的值赋予在java代码中就必须在前面已经执行了k-1次lng.LSsetPointerLng.至此原理已经介绍完毕,下面就来就一个值日安排的问题来给出具体的例子.

Lingo的安装:这里并不是要说明如何下载与安装lingo,而是说明安装完毕后所需要另外做的几件事情。

1.在Linux系统下,在命令终端中进入lingo安装目录下的bin/linux32目录,而后执行

sudo./lingovars.sh以及sudo./symlinks.sh在执行完此命令后,还必须将bin/linux32这个目录加入LD_LIBRARY_PATH环境变量中。

2.在windows中则必须将lingo.exe所在目录加入PATH环境变量中,这个设置可以通过,我的电脑--》属性-》高级-》环境变量-》Path中添加得到。

如果不这么做在运行java程序时就会报加载库文件异常。

Java代码的编写:在Eclipse中新建一个java工程,并且引入lingo安装文件下的Lingo11.jar(具体名称因版本而稍有不同)。再新建一个java文件代码如下:

package com.xuen.test;
import java.awt.*;
import java.awt.event.*;
import java.io.File;import javax.swing.*;import com.lindo.Lingd11;public class Staff1 implements ActionListener
{// Load the Lingo JNI interfacestatic {System.loadLibrary( "Lingj11");}// Create a new Lingo object, which we will use to interface with LingoLingd11 lng = new Lingd11();// Stores the Lingo JNI environment pointerObject pnLngEnv;JFrame f;JPanel p;JTextField jtfNeeds[] = new JTextField[ 7];JTextField jtfStart[] = new JTextField[ 7];JTextField jtfOnDuty[] = new JTextField[ 7];JTextField jtfTotal;JButton jbtnSolve = new JButton("Solve");JButton jbtnExit = new JButton("Exit");int nLastIterationCount;public Staff1(){// Create the frame and panelf = new JFrame("Lingo staffing example using Java");p = new JPanel();                          //  t   l   b   rp.setBorder( BorderFactory.createEmptyBorder( 30, 10, 30, 50));p.setLayout( new GridLayout(10, 4, 40, 20));// Add the widgets.addWidgets();// Add the panel to the frame.f.getContentPane().add( p, BorderLayout.CENTER);// Exit when the window is closed.f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// Show the framef.pack();f.setVisible(true);// no solver iterations performed yet;nLastIterationCount = -1;}private void addWidgets(){String sDays[] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};JLabel jl[] = new JLabel[ 7];// Row 1...the headersJLabel jlHdrDay = new JLabel( "Day:", JLabel.RIGHT);p.add( jlHdrDay);JLabel jlHdrNeeds = new JLabel( "Needs:", JLabel.RIGHT);p.add( jlHdrNeeds);JLabel jlHdrStart = new JLabel( "Start:", JLabel.RIGHT);p.add( jlHdrStart);JLabel jlHdrOnDuty = new JLabel( "On Duty:", JLabel.RIGHT);p.add( jlHdrOnDuty);// Rows 2-8...days of the weekfor ( int i = 0; i < 7; i++){jl[ i] = new JLabel( sDays[ i], JLabel.RIGHT);p.add( jl[ i]);jtfNeeds[ i] = new JTextField( "0", 5);jtfNeeds[ i].setHorizontalAlignment( JTextField.RIGHT);p.add( jtfNeeds[ i]);jtfStart[ i] = new JTextField( "0", JLabel.RIGHT);jtfStart[ i].setEditable( false);jtfStart[ i].setHorizontalAlignment( JTextField.RIGHT);p.add( jtfStart[ i]);jtfOnDuty[ i] = new JTextField( "0", JLabel.RIGHT);jtfOnDuty[ i].setEditable( false);jtfOnDuty[ i].setHorizontalAlignment( JTextField.RIGHT);p.add( jtfOnDuty[ i]);}// Row 9...displays total of Start columnJLabel jlNull1 = new JLabel( " ", JLabel.RIGHT);p.add( jlNull1);JLabel jlTotal = new JLabel( "Total...", JLabel.RIGHT);p.add( jlTotal);jtfTotal = new JTextField( "0", JLabel.RIGHT);jtfTotal.setEditable( false);jtfTotal.setHorizontalAlignment( JTextField.RIGHT);p.add( jtfTotal);JLabel jlNull3 = new JLabel( " ", JLabel.RIGHT);p.add( jlNull3);// Row 10...Solve and Exit buttonsJLabel jlNull4 = new JLabel( " ", JLabel.RIGHT);p.add( jlNull4);JLabel jlNull5 = new JLabel( " ", JLabel.RIGHT);p.add( jlNull5);jbtnSolve.addActionListener( this);p.add( jbtnSolve);jbtnExit.addActionListener( this);p.add( jbtnExit);}// Implementation of ActionListener interface.public void actionPerformed( ActionEvent event){Object source = event.getSource();if ( source == jbtnSolve){Solve();} else {System.exit( 0);}}private static int MySolverCallback( Object pnLng, int iLoc, Object jobj){Staff1 s = (Staff1) jobj;int nIterations[] = new int [1];s.lng.LSgetCallbackInfoIntLng( pnLng, Lingd11.LS_IINFO_ITERATIONS_LNG, nIterations);if ( nIterations[0] != s.nLastIterationCount){s.nLastIterationCount = nIterations[0];System.out.println("In Java callback function...iterations = " + s.nLastIterationCount);}return( 0);}private static int MyErrorCallback( Object pnLng, int nErrorCode, String jsErrMessage, Object jobj){System.out.println("Lingo error code: " + nErrorCode);System.out.println("Lingo error message:\n\n " + jsErrMessage);return( 0);}private void Solve(){int nErr;Double d1=0.;double dNeeds[] = new double[7];double dStart[] = new double [7];double dOnDuty[] = new double [7];double dObj[] = new double [1];double dStatus[] = new double [1];System.out.println("\nSolving...");// get the staffing requirementsfor ( int i=0; i<7; i++){String s = jtfNeeds[i].getText();try {dNeeds[ i] = d1.valueOf( s);}catch ( Exception e){dNeeds[ i] = 0.;}}// clear output fieldsfor ( int i=0; i<7; i++){jtfStart[i].setText( " ");jtfOnDuty[i].setText( " ");}jtfTotal.setText( " ");// create the Lingo environmentpnLngEnv = lng.LScreateEnvLng();if ( pnLngEnv == null){System.out.println( "***Unable to create Lingo environment***");return;}// open a log filenErr = lng.LSopenLogFileLng( pnLngEnv, "lingo.log");if ( nErr != lng.LSERR_NO_ERROR_LNG ){System.out.println( "***LSopenLogFileLng() error***: " + nErr);return;}// pass lingo a pointer to the staffing needsint[] nPointersNow = new int[1];nErr = lng.LSsetPointerLng( pnLngEnv, dNeeds, nPointersNow);if ( nErr != lng.LSERR_NO_ERROR_LNG ){System.out.println( "***LSsetPointerLng() error***: " + nErr);return;}// pass pointers to output areasnErr = lng.LSsetPointerLng( pnLngEnv, dStart, nPointersNow);if ( nErr != lng.LSERR_NO_ERROR_LNG ){System.out.println( "***LSsetPointerLng() error***: " + nErr);return;}nErr = lng.LSsetPointerLng( pnLngEnv, dOnDuty, nPointersNow);if ( nErr != lng.LSERR_NO_ERROR_LNG ){System.out.println( "***LSsetPointerLng() error***: " + nErr);return;}nErr = lng.LSsetPointerLng( pnLngEnv, dObj, nPointersNow);if ( nErr != lng.LSERR_NO_ERROR_LNG ){System.out.println( "***LSsetPointerLng() error***: " + nErr);return;}nErr = lng.LSsetPointerLng( pnLngEnv, dStatus, nPointersNow);if ( nErr != lng.LSERR_NO_ERROR_LNG ){System.out.println( "***LSsetPointerLng() error***: " + nErr);return;}// pass Lingo the name of the solver callback function...nErr = lng.LSsetCallbackSolverLng( pnLngEnv, "MySolverCallback", this);// ...and the error callback functionnErr = lng.LSsetCallbackErrorLng( pnLngEnv, "MyErrorCallback", this);// construct the script// echo input to log fileString sScript = "SET ECHOIN 1" + "\n";// load the model from diskFile f=new File("Staffptr.lng");sScript = sScript + "TAKE "+f.getAbsolutePath() + "\n";// view the formulationsScript = sScript + "LOOK ALL" + "\n";// solvesScript = sScript + "GO" + "\n";// exit script processorsScript = sScript + "QUIT" + "\n";// run the scriptdStatus[0] = -1;nLastIterationCount = -1;nErr = lng.LSexecuteScriptLng( pnLngEnv, sScript);if ( nErr != lng.LSERR_NO_ERROR_LNG ){System.out.println( "***LSexecuteScriptLng error***: " + nErr);return;}// clear the pointers to force update of local arrays// ***NOTE*** solution won't get passed to local arrays until// LSclearPointersLng is called!!!nErr = lng.LSclearPointersLng( pnLngEnv);if ( nErr != lng.LSERR_NO_ERROR_LNG ){System.out.println( "***LSclearPointerLng() error***: " + nErr);return;}// check the solution statusif ( dStatus[0] != lng.LS_STATUS_GLOBAL_LNG) System.out.println( "***Unable to Solve*** dStatus:" + dStatus[0]);// close Lingo's log filenErr = lng.LScloseLogFileLng( pnLngEnv);if ( nErr != lng.LSERR_NO_ERROR_LNG ){System.out.println( "***LScloseLogFileLng() error***: " + nErr);return;}// delete the Lingo environmentlng.LSdeleteEnvLng( pnLngEnv);// post the solutionInteger nTotal = 0;for ( int i=0; i<7; i++){Double d = dStart[i];Integer n = d.intValue(); jtfStart[i].setText( n.toString());nTotal = nTotal + n;d = dOnDuty[i];n = d.intValue();jtfOnDuty[i].setText( n.toString());}jtfTotal.setText( nTotal.toString());//System.out.println( "free Java memory: " +  Runtime.getRuntime().freeMemory());}// main methodpublic static void main(String[] args) {Staff1 s = new Staff1();}}

编写完上述代码后还需编写Lingo模型文件,在工程文件夹下新建一个STAFFPTR.LNG的文本文件,并在其中写入如下内容:

MODEL:

SETS:

DAYS/ MON TUE WED THU FRI SAT SUN/:

NEEDS,START, ONDUTY;

ENDSETS

[OBJECTIVE]MIN = @SUM( DAYS( I): START( I));

@FOR(DAYS( TODAY):

!Calculate number on duty;

ONDUTY(TODAY) =

@SUM(DAYS( D)| D #LE# 5:

START(@WRAP( TODAY - D + 1, @SIZE( DAYS))));

!Enforce staffing requirement;

ONDUTY(TODAY) >= NEEDS( TODAY);

@GIN(START);

);

DATA:

NEEDS= @POINTER( 1);

@POINTER(2) = START;

@POINTER(3) = ONDUTY;

@POINTER(4) = OBJECTIVE;

@POINTER(5) = @STATUS();

ENDDATA

END

完成后右键运行即可,如果运行时报如下错误,

Exceptionin thread "main" java.lang.UnsatisfiedLinkError:

则说明你的安装过程有错(或者你是用的lingo精简版),重新执行上面所说的Lingo的安装过程,以及配置eclipse的runconfigurations的环境变量。

最后说明一点,其实这些知识lingo的帮助文件说明的很清楚,对于一项陌生的应用帮助文件是最好的老师。

转载至:https://blog.csdn.net/xuenhappy/article/details/7560748

Linux/windows下java调用lingo相关推荐

  1. Windows下Java调用BAT批处理不弹出cmd窗口

    常规Windows下Java调用BAT方式肯定会弹出cmd窗口 Runtime.getRuntime().exec("cmd.exe /C start D:\\test.bat") ...

  2. windows 下java调用winrar压缩文件为rar 格式

    windows  下java调用winrar压缩文件为rar 格式 import java.io.BufferedReader; import java.io.IOException; import ...

  3. java 调用window程序_Windows下Java调用可执行文件代码实例

    这篇文章主要介绍了Windows下Java调用可执行文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 缘起: 由于没有找到java转换文件 ...

  4. java 制作 winrar,windows 上java调用winrar压缩文件为rar 格式

    windows 下java调用winrar压缩文件为rar 格式 windows  下java调用winrar压缩文件为rar 格式 import java.io.BufferedReader; im ...

  5. linux下java调用matlab程序,linux_java调用windows_matlab程序

    0 说明 本文为研究java和matlab的混合编程,进行了详细的测试和探索,以解决linux环境下java程序调用matlab程序的一个应用. linux端的环境 :(运行java程序并调用wind ...

  6. scala linux 环境配置,LINUX系统下Java和Scala的环境配置

    最近,笔者在研究一个有关"自然语言处理"的项目,在这个项目中,需要我们用Spark进行编程.而Spark内核是由Scala语言开发的,所以在使用Spark之前,我们必须配置好Sca ...

  7. windows 打包 python 然后linux执行_使用pyinstaller打包python源代码,成为linux/windows下可执行文件...

    pyinstaller,打包python源代码,成为linux/windows下可执行文件,多平台 下载:http://www.pyinstaller.org/static/ http://www.p ...

  8. Windows 下java环境变量的配置(Windows7 ,8,8.1,10)

    Windows 下java环境变量的配置 在"系统"面板的左上角选择"高级系统设置",在弹出的系统属性中选择"高级"项,然后点击右下角的&q ...

  9. windows下java -jar 后台运行以及杀死后台进程的操作

    这篇文章主要介绍了windows下java -jar 后台运行以及杀死后台进程的操作,具有很好的参考价值,希望对大家有所帮助. 在你的jar文件当前目录中建立一个bat文件: 内容是:注意文件名要对应 ...

  10. java调用linux设备,使用Java调用Linux系统命令

    有时候,咱们在使用Java作一些操做时,可能性能上并不能达到咱们满意的效果,就拿最近工做中的遇到的一个场景来讲,须要对大量的小文件进行合并成一个大文件.java 最开始的想法是使用Java作文件操做, ...

最新文章

  1. jtree 默认展开树的全部节点
  2. 阿里 mysql 架构_阿里java架构教你怎么用mysql怒怼面试官
  3. 蓝桥杯2017初赛-正则问题
  4. mysql数据库函数转义函数_MySql数据库-查询、插入数据时转义函数的使用
  5. 卡巴斯基发现新型恶意软件StoneDrill,或与 Shamoon有关
  6. CV方向介绍 | 基于自然语言的跨模态行人ReID的SOTA方法简述(下)
  7. xpath里面if判断一个值不为空_现代C++之模板元编程(今天写个If与While)
  8. yield关键字有什么作用
  9. TCP握手协议的巧计方法
  10. 贝尔英才学院计算机,特稿 | 从高三的二模倒数第一到考取南京邮电大学贝尔英才学院,他仅用了半年!...
  11. 190422每日一句
  12. 第四届中国优秀云计算开源案例评选结果出炉
  13. CISP考试的全过程
  14. C语言_4 循环结构;一些例题
  15. vue批量打包下载图片
  16. linux if 判断文件,shell中的逻辑判断,if 判断文件、目录属性,if判断的一些特殊用法...
  17. 相濡以沫,不如相忘于江湖
  18. defcon quals 2016 feedme writeup
  19. 运动装备品牌排行榜,运动爱好者必备好物分享
  20. Veracrypt和Cryptomator的使用方式对比

热门文章

  1. Oracle P6培训系列:13分配限制条件
  2. 不能连接Formula One控件,请检查系统是否已安装或已注册该控件!
  3. 用Python实现一个简单的批量无水印快手抖音批量下载器
  4. android 万能播放器
  5. java vtd-xml_XML解析技术之VTD-XML 简介及代码实例
  6. java quartz 教程_Quartz 教程
  7. PDMS中如何设置颜色规则
  8. Windows XP 系统中内置的AT命令
  9. 【软件】RustDesk自己搭建远程控制服务软件 支持控制手机
  10. html网页框架案例代码,HTML网页框架代码