资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

线性规划java代码 线性规划 java

如何调用cplex studio

首先需要安装Cplex软件,我安装的版本是cplex_studio122.win-x86-32.exe

专业从事成都网站设计、成都网站制作,高端网站制作设计,微信平台小程序开发,网站推广的成都做网站的公司。优秀技术团队竭力真诚服务,采用HTML5+CSS3前端渲染技术,自适应网站建设,让网站在手机、平板、PC、微信下都能呈现。建站过程建立专项小组,与您实时在线互动,随时提供解决方案,畅聊想法和感受。

详解Java如何调用Cplex

2

下图安装后打开的Cplex自带的IDE,看上去跟Eclipse差不多。

详解Java如何调用Cplex

在Cplex的安装目录下有许多值得我们学习的东西,还有一些examples,可供我们参考。

详解Java如何调用Cplex

我是在Eclipse中使用Java调用Cplex,所以先把一些Cplex依赖加上。

运行依赖:cplex.jar(在..\cplex\lib目录下找到)和cplex122.dll(在..\cplex\bin目录下找到)。将cplex.jar加到工程的Build Path中。

详解Java如何调用Cplex

cplex122.dll可以设置到运行时的环境中(VM arguments),或者添加到项目的Native library location。

详解Java如何调用Cplex

接下来我们求解一个具体的线性规划问题。

详解Java如何调用Cplex

例如,我们求解下面这样一个线性规划问题:

Maximize x1 + 2x2 + 3x3

subject to

-x1 + x2 + x3 ≦20

x1 - 3x2 + x3 ≦30

with these bounds

0 ≦x1 ≦40

0 ≦x2 ≦+∞

0≦ x3≦ +∞

先创建一个IloCplex对象,它是用来创建所有建模对象所需要的模型。此时会抛出一个异常:IloException,需要try\catch。

代码如下:static public class Application {

static public main(String[] args) {

try {

IloCplex cplex = new IloCplex();

// create model and solve it

} catch (IloException e) {

System.err.println("Concert exception caught: " + e);

}

}

}

定义决策变量:double[] lb = {0.0, 0.0, 0.0};

double[] ub = {40.0, Double.MAX_VALUE, Double.MAX_VALUE};

IloNumVar[] x = cplex.numVarArray(3, lb, ub);

定义目标函数:

IloNumExpr expr = cplex.sum(x[0], cplex.prod(2.0, x[1]),cplex.prod(3.0, x[2]));

cplex.addMaximize(expr);

其中这个地方有许多写法,大家在使用的时候可以注意一下。

定义决策的约束条件:cplex.addLe(cplex.sum(cplex.negative(x[0]), x[1], x[2]), 20);cplex.addLe(cplex.sum(cplex.prod(1, x[0]), cplex.prod(-3, x[1]),cplex.prod(1, x[2])), 30);

最后解决模型问题:if(cplex.solve()){....}

如果solve()返回true的话,我们可以获取一些信息,例如问题的解决状态、获取方案的目标值、获取数组中的所有决策变量的解值。

cplex.getStatus()返回值类型:Error、Unknown、Feasible、Bounded、Optimal、Infeasible、Unbouded、InfeasibleorUnbounded。

获取方案的目标值:double objval = cplex.getObjValue();获取数组中的所有决策变量的解值:double[] xval = cplex.getValues(x);

mathmetica线性规划求解

ConstrainedMax?年代这么久远的函数,5.0版就淘汰了。我不得已查了4.0的帮助。发现你的代码有两点错误。

第一,ConstrainedMax的用法应该是ConstrainedMax[f, {inequalities}, {x, y, ... }],并没有{x1-0,x2-0,x3-0}一项。所以应改作ConstrainedMax[3 x1 + 2 x2 + 2.9 x3, {8 x1 + 2 x2 + 10 x3 -300, 10 x1 + 5 x2 + 8 x3 -400, 2 x1 + 13 x2 + 10 x3 -420}, {x1, x2, x3}]。

第二,即使这样改了,也不能得到结果,因为ConstrainedMax默认所有变量都是非负的。但这道题的结果实际算出来是负的。

所以,建议就不要用ConstrainedMax了。如果你用的是5.0以上的版本,可以用:

NMaximize[{3x1 + 2x2 + 2.9x3, {8x1 + 2x2 + 10x3 -300, 10x1 + 5x2 + 8x3 -400, 2x1 + 13x2 + 10x3 -420}}, {x1, x2, x3}]

结果是:

{-135.267, {x1 - -22.5333, x2 - -23.2, x3 - -7.33333}}

如果你用的是4.0以下的版本,那就建议你下载一个5.0以上的版本,然后还是用:

NMaximize[{3x1 + 2x2 + 2.9x3, {8x1 + 2x2 + 10x3 -300, 10x1 + 5x2 + 8x3 -400, 2x1 + 13x2 + 10x3 -420}}, {x1, x2, x3}]

因为4.0以下的版本线性规划的函数都只认非负数。

运筹学线性规划程序(或两阶段法)用java或c,c++都可以

#include stdio.h

#include stdlib.h

#define MAX 100

#define STP 100

int stop=1; //迭代记数变量

int status; //iterative迭代返回值:1唯一最优,0无界解,-1无穷多最优解 -2迭代超过限制次数

int step=1; //目前阶段

double a[MAX][MAX],b[MAX],c[MAX],temp_c[MAX],max=0; //方程组相关系数

int num_x; //变量个数

int num_st; //约束方程数

int num_ar=0; //人工变量个数

int arti[MAX]; //人工变量下标

int base[MAX]; //基变量下标

int ma_mi; //1为求最大值,2为求最小值

void create(); //建立方程组

void iterative(); //单纯型法迭代

void output(); //输出结果

void banner(); //打印程序标题

void exchange(); //交换两阶段价值系数

void show(); //输出方程组

void main() {

int i,j,k;

banner();

create();

//保存原价值系数,转换为第一阶段价值系数

for(i=1;i=num_x;i++) {

k=0;

for(j=1;j=num_ar;j++) if(i==arti[j]) k=1;

if(k==1) temp_c=-1;

else temp_c=0;

}

exchange(c,temp_c);

printf("\n\n第一阶段问题为:\n\n");

show();

step++;

printf("\n\n按回车开始第一阶段迭代");

getchar();

getchar();

iterative();

if(status==-2) {

puts("迭代超过限制次数强行终止!\n");

puts("\n按回车结束");

getchar();

exit(0);

}

output();

if(max!=0) {

puts("\n\n原问题无可行解。\n");

puts("\n按回车结束");

getchar();

exit(0);

}

//转换为第二阶段价值系数

exchange(c,temp_c);

//把人工变量列全设为0

for(i=1;i=num_ar;i++) {

c[arti]=0;

for(j=1;j=num_st;j++) a[j][arti]=0;

}

puts("\n\n第二阶段问题为:\n\n");

show();

puts("\n\n按回车开始第二阶段迭代");

getchar();

iterative();

switch(status) {

case 1:

output();

puts("\n\n原问题有唯一最优解。\n");

puts("\n按回车结束");

getchar();

exit(0);

case 0:

puts("\n\n原问题为无界解。\n");

puts("\n按回车结束");

getchar();

exit(0);

case -1:

output();

puts("\n\n原问题有无穷多最优解。\n");

puts("\n按回车结束");

getchar();

exit(0);

case -2:

puts("迭代超过限制次数强行终止!\n");

puts("\n按回车结束");

getchar();

exit(0);

}//switch

}

void banner() {

printf("\t\t****************************************\n");

printf("\t\t 单纯型法解线性规划问题\n");

printf("\t\t 作者:Thunder\n");

printf("\t\t****************************************\n");

printf("\n");

}

void show() {

//对方程组以自然的格式输出,系数为零的x不显示

//为1的不显示系数1,-1系数只显示负号

int i,j,k;

switch(step) {

case 1:

printf("min z= ");

printf("x[%d]",arti[1]);

for(i=2;i=num_ar;i++) printf(" + x[%d]",arti);

break;

case 2:

printf("max z= ");

printf("%lg x[%d]",c[1],1);

for(i=2;i=num_x;i++) {

if(c==1) printf(" + x[%d]",i);

else if(c==-1) printf(" - x[%d]",i);

else if(c=0) printf(" +%lg x[%d]",c,i);

else printf(" %lg x[%d]",c,i);

}

break;

}

printf("\nst:\n");

for(i=1;i=num_st;i++) {

k=0;

for(j=1;j=num_x;j++) {

if(a[j]!=0) {

if(a[j]==1k!=0) printf(" + x[%d]",j);

else if(a[j]==1k==0) printf(" x[%d]",j);

else if(a[j]==-1) printf(" - x[%d]",j);

else if(a[j]=0k!=0) printf(" +%lg x[%d]",a[j],j);

else if(a[j]=0k==0) printf(" %lg x[%d]",a[j],j);

else printf(" %lg x[%d]",a[j],j);

k=1;

}

}

printf(" == %lg\n",b);

}

printf(" x[1]~x[%d]=0",num_x);

}

void exchange() {

int i;

double temp[MAX];

for(i=1;i=num_x;i++) {

temp=temp_c;

temp_c=c;

c=temp;

}

}

void create() {

//输入方程组系数,每个方程输完后回显确认

int i,j,k,re_st[MAX],tnum_x,num_addv=0,num_ba=0;

char confirm;

while(1) {

printf("请选择:1、求最大值,2、求最小值:(1/2)");

scanf("%d",ma_mi);

if(ma_mi!=1ma_mi!=2) printf("输入错误,重新选择。");

else break;

}

while(1) {

printf("指定变量个数:");

scanf("%d",num_x);

printf("输入价值系数c1-c%d:\n",num_x);

for(i=1;i=num_x;i++) {

printf("c%d=",i);

scanf("%lf",c);

}

if(ma_mi==1) printf("max z= ");

else printf("min z= ");

printf("%lg x[%d]",c[1],1);

for(i=2;i=num_x;i++) {

if(c=0) printf(" +%lg x[%d]",c,i);

else printf(" %lg x[%d]",c,i);

}

printf("\n正确吗?:(y/n)");

getchar();

confirm=getchar();

if (confirm=='y') break;

else if(confirm=='n') continue;

}

printf("输入约束方程组个数:");

scanf("%d",num_st);

for(i=1;i=num_st;i++) {

printf("st.%d:\n",i);

while(1) {

printf("请选择:1、==,2、=,3、= :(1/2/3)");

scanf("%d",re_st);

if(re_st!=1re_st!=2re_st!=3) printf("输入错误,请重新选择。");

else break;

}

printf("输入技术系数:\n");

for(j=1;j=num_x;j++) {

printf("a%d=",j);

scanf("%lf",a[j]);

}

printf("输入资源拥有量:\nb%d=",i);

scanf("%lf",b);

printf("st.%i:\n",i);

printf("%lg x[%d]",a[1],1);

for(j=2;j=num_x;j++) {

if(a[j]=0) printf(" +%lg x[%d]",a[j],j);

else printf(" %lg x[%d]",a[j],j);

}

switch(re_st) {

case 1: printf(" == %lg",b); break;

case 2: printf(" = %lg",b); break;

case 3: printf(" = %lg",b); break;

}

while(1) {

printf("\n正确吗?(y/n)");

getchar();

confirm=getchar();

if (confirm=='y') break;

else if(confirm=='n') {i-=1; break;}

}

}

//显示输入的方程组

printf("\n原问题为:\n\n");

if(ma_mi==1) printf("max z= ");

else printf("min z= ");

printf("%lg x[%d]",c[1],1);

for(i=2;i=num_x;i++) {

if(c==1) printf(" + x[%d]",i);

else if(c==-1) printf(" - x[%d]",i);

else if(c=0) printf(" +%lg x[%d]",c,i);

else printf(" %lg x[%d]",c,i);

}

printf("\nst:\n");

for(i=1;i=num_st;i++) {

k=0;

for(j=1;j=num_x;j++) {

if(a[j]!=0) {

if(a[j]==1k!=0) printf(" + x[%d]",j);

else if(a[j]==1k==0) printf(" x[%d]",j);

else if(a[j]==-1) printf(" - x[%d]",j);

else if(a[j]=0k!=0) printf(" +%lg x[%d]",a[j],j);

else if(a[j]=0k==0) printf(" %lg x[%d]",a[j],j);

else printf(" %lg x[%d]",a[j],j);

k=1;

}

}

switch(re_st) {

case 1:

printf(" == %lg\n",b);

break;

case 2:

printf(" = %lg\n",b);

break;

case 3:

printf(" = %lg\n",b);

break;

}

}

printf(" x[1]~x[%d]=0\n",num_x);

tnum_x=num_x;

for(i=1;i=num_st;i++) {

switch(re_st) {

case 1:

case 3:

num_x+=1;

break;

case 2:

num_x+=2;

break;

}

}

//化为标准形式

if(ma_mi==2) for(i=1;i=tnum_x;i++) c*=-1; //求最小值时,系数变相反数

for(i=1;i=num_st;i++) {

switch(re_st) {

case 1:

num_addv++;

num_ba++;

num_ar++;

c[tnum_x+num_addv]=0;

base[num_ba]=arti[num_ar]=tnum_x+num_addv;

for(j=tnum_x+1;j=num_x;j++)

if(j==tnum_x+num_addv) a[tnum_x+num_addv]=1;

else a[j]=0;

break;

case 2:

num_addv++;

c[tnum_x+num_addv]=0;

num_addv++;

num_ba++;

num_ar++;

c[tnum_x+num_addv]=0;

base[num_ba]=arti[num_ar]=tnum_x+num_addv;

for(j=tnum_x+1;j=num_x;j++)

if(j==tnum_x+num_addv-1) a[tnum_x+num_addv-1]=-1;

else if(j==tnum_x+num_addv) a[tnum_x+num_addv]=1;

else a[j]=0;

break;

case 3:

num_addv++;

num_ba++;

c[tnum_x+num_addv]=0;

base[num_ba]=tnum_x+num_addv;

for(j=tnum_x+1;j=num_x;j++)

if(j==tnum_x+num_addv) a[tnum_x+num_addv]=1;

else a[j]=0;

break;

}//switch

}//增加松弛变量、剩余变量、人工变量、确定基变量

//显示标准化后的方程组

printf("\n化为标准形式后:\n\n");

if(ma_mi==1) printf("max z= ");

else printf("max z'= ");

printf("%lg x[%d]",c[1],1);

for(i=2;i=num_x;i++) {

k=0;

for(j=1;j=num_ar;j++)

if(i==arti[j]) k=1;

if(k==1) printf(" -M x[%d]",i);

else if(c==1) printf(" + x[%d]",i);

else if(c==-1) printf(" - x[%d]",i);

else if(c=0) printf(" +%lg x[%d]",c,i);

else printf(" %lg x[%d]",c,i);

}

printf("\nst:\n");

for(i=1;i=num_st;i++) {

k=0;

for(j=1;j=num_x;j++) {

if(a[j]!=0) {

if(a[j]==1k!=0) printf(" + x[%d]",j);

else if(a[j]==1k==0) printf(" x[%d]",j);

else if(a[j]==-1) printf(" - x[%d]",j);

else if(a[j]=0k!=0) printf(" +%lg x[%d]",a[j],j);

else if(a[j]=0k==0) printf(" %lg x[%d]",a[j],j);

else printf(" %lg x[%d]",a[j],j);

k=1;

}

}

printf(" == %lg\n",b);

}

printf(" x[1]~x[%d]=0",num_x);

}

void iterative() {

int i,j,k,k_a,k_f,l; //k_a,k_f值为0或1,记录当前下标在arti[]或base[]里的搜索结果

int base_elem;

int base_out,base_in;

double sigma[MAX],temp;

double value_be; //高斯消元里保存主元素值

printf("\n\n第%d次迭代:\n\n",stop);

for(i=1;i=num_st;i++) {

printf("c%d=%lg\t",base,c[base]);

printf("b%d=%lg\t",i,b);

switch(step) {

case 1:

for(j=1;j=num_x;j++)

{

printf("a[%d][%d]=%lg\t",i,j,a[j]);

}

printf("\n");

break;

case 2:

for(j=1;j=num_x;j++) {

k_a=0;

for(l=1;l=num_ar;l++) if(j==arti[l])k_a=1;

if(k_a!=1) printf("a[%d][%d]=%lg\t",i,j,a[j]);

}

printf("\n");

break;

}

}

//求检验数sigma

for(i=1;i=num_x;i++) {

sigma=c;

for(j=1;j=num_st;j++) sigma-=c[base[j]]*a[j];

for(j=1;j=num_st;j++) if(i==base[j]) sigma=0;

switch(step) {

case 1:

printf("sigma[%d]=%lg\t",i,sigma);

break;

case 2:

k_a=0;

for(l=1;l=num_ar;l++) if(i==arti[l]) k_a=1;

if(k_a!=1) printf("sigma[%d]=%lg\t",i,sigma);

break;

}

}

putchar('\n');

//检验检验数sigma是否全小于等于0

k=0;

for(i=1;i=num_x;i++) {

if(sigma0)

k=1;

}

if(k==0) {

//sigma是全小于等于0时,检查是否为无穷多最优解

for(i=1;i=num_x;i++) {

k_f=k_a=0;

for(j=1;j=num_ar;j++)

if(i==arti[j]) k_a=1;

if(sigma==0k_a!=1) {

for(j=1;j=num_st;j++) if(i==base[j]) k_f=1;

if(k_f==0) {status=-1; return;}

}

}

status=1;

return;

}

//检查是否为无界解

for(i=1;i=num_x;i++) {

k_f=0;

if(sigma0) {

for(j=1;j=num_st;j++) if(a[j]0) k_f=1;

if(k_f!=1) {status=0; return;}

}

}

//确定换入变量

for(i=1;i=num_x;i++) {

k=0;

for(j=1;j=num_st;j++) if(i==base[j]) k=1;

if(k==0sigma0) temp=sigma-1;

}//temp赋初值

for(i=1;i=num_x;i++) {

k=0;

for(j=1;j=num_st;j++) if(i==base[j]) k=1;

if(k==0)

if(sigmatempsigma0) {

base_in=i;

temp=sigma;

}

}

//确定换出变量

for(i=1;i=num_st;i++)

if(a[base_in]0) {

temp=b/a[base_in]+1;

break;

}//temp赋初值

for(i=1;i=num_st;i++) {

if(b/a[base_in]=tempa[base_in]0) {

for(j=1;j=num_ar;j++)

if(base==arti[j]) {

base_out=base;

base_elem=i;

temp=b/a[base_in];

break;

}

}//人工变量优先换出

if(b/a[base_in]tempa[base_in]0) {

base_out=base;

base_elem=i;

temp=b/a[base_in];

}

}

printf(" 基变量:");

for(i=1;i=num_st;i++) printf("x[%d] ",base);

printf("换入变量:x[%d] 换出变量:x[%d]",base_in,base_out);

//基变量变换,进行新方程初始化后迭代

for(i=1;i=num_st;i++) {

if(base==base_out) base=base_in;

}

//初始化主元素行系数

value_be=a[base_elem][base_in];

b[base_elem]/=value_be;

for(i=1;i=num_x;i++) a[base_elem]/=value_be;

for(i=1;i=num_st;i++) {

if(i!=base_elem) {

b-=b[base_elem]*a[base_in];

value_be=a[base_in];

for(j=1;j=num_x;j++) a[j]-=a[base_elem][j]*value_be;

}

}

stop++;

if(stopSTP) {status=-2; return;}

iterative();

}

void output() {

int i,j;

double X[MAX];

printf("\n结果如下:\n");

printf("\nX=(");

for(i=1;i=num_x;i++) {

for(j=1;j=num_st;j++)

if(i==base[j]) {X=b[j];break;}

else X=0;

printf("%lg ",X);

}

printf(")");

for(i=1;i=num_x;i++) max+=c*X;

if(ma_mi==1) printf("\nMax z= %lf\n",max);

else printf("\nMin z= %lf\n",-max);

}


分享文章:线性规划java代码 线性规划 java
网页路径:http://cdkjz.cn/article/ddsegsc.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

业务热线:400-028-6601 / 大客户专线   成都:13518219792   座机:028-86922220