java调用Lingo"/>
java调用Lingo
//网格布局
panel.setLayout(new GridLayout(4,4))//指定4行4列
panel.add(new) JButton("1"));
panel.add(new) JButton("2"));//从第一行第一列开始,然后第一行第二列。排满后将从下一行开始排列。
//需要修正
而对于Lingo中矩阵传参到java中,因为相关函数
lng.LSsetPointerLng()
是不能以矩阵为参数的,所以不能直接引用。不过,虽然我不懂其中原理,有个解决方法是将矩阵转化为数组。比如,我的Demo1中可以将矩阵A[ 6 ] [ 8 ] 定义为B[48],原本的矩阵索引规则和按顺序排列是一样的。比如,我想取原本A矩阵的A[2] [5],也就是现在取B矩阵的B[17]。
以我的lng模型为例:
我将运输单价设为固定值,x(运输量)设为将被传递的参数。
建立参数
private void Solve()//运算:赋值{int nErr;Double d1=0.;double dSumW[] = new double[6];//库存合计double dSumV[] = new double [8];//客户需求合计//double dOnDuty[] = new double [6];double dx[]=new double[48];//x矩阵double dObj[] = new double [1];//不能传递矩阵;那么只能改成数组了?double dStatus[] = new double [1];System.out.println("\nSolving...");// get the staffing requirementsfor ( int i=0; i<8; i++){String s = SumV[i].getText();//需求量赋输入值try {dSumV[ i] = d1.valueOf( s);}catch ( Exception e){dSumV[ i] = 0.;}}for ( int i=0; i<6; i++){String s = SumW[i].getText();//库存赋输入值try {dSumW[ i] = d1.valueOf( s);}catch ( Exception e){dSumW[ i] = 0.;}}// clear output fieldsfor ( int i=0; i<6; i++)//其它先赋空值{V1[i].setText( " ");V2[i].setText( " ");V3[i].setText( " ");V4[i].setText( " ");V5[i].setText( " ");V6[i].setText( " ");V7[i].setText( " ");V8[i].setText( " ");}jtfTotal.setText( " ");
传参
nErr = lng.LSsetPointerLng( pnLngEnv, dx, nPointersNow);//矩阵if ( nErr != lng.LSERR_NO_ERROR_LNG ){System.out.println( "***LSsetPointerLng() error***: " + nErr);return;}
赋值
for( int i=0;i<6;i++) {Double d = (double) Math.round(dx[i*8]);Integer n = d.intValue();V1[i].setText( n.toString());}
以上应该写一个列表的,不然很冗余。。。有时间再优化吧。
更多推荐
java调用Lingo
发布评论