Linear programming 使用CPLEX python API进行连续输入线性规划

Linear programming 使用CPLEX python API进行连续输入线性规划,linear-programming,cplex,Linear Programming,Cplex,我是CPLEX Python API的新手。我希望用python解决一个线性编程问题,我已经在CPLEX OPL IDE中通过将.mod和.dat文件作为输入完成了这个问题。我希望在python中使用它,因为我希望不断地改变输入。下面给出了我针对这个问题的mod文件。有人能帮助我如何在pythonapi中使用它吗 int n = ...; int m = ...; int c = ...; int s = ...; range v = 1..n; range p = 1..m; i

我是CPLEX Python API的新手。我希望用python解决一个线性编程问题,我已经在CPLEX OPL IDE中通过将.mod和.dat文件作为输入完成了这个问题。我希望在python中使用它,因为我希望不断地改变输入。下面给出了我针对这个问题的mod文件。有人能帮助我如何在pythonapi中使用它吗

int n = ...; 
int m = ...; 

int c = ...; 
int s = ...; 

range v = 1..n;
range p = 1..m;

int c_req[v] = ...;
int s_req[v] = ...;

int trust[v][v] = ...;


// decision variables

dvar boolean assign[p][v]; 

// expressions

dexpr int used[pi in p] = max(vi in v) assign[pi][v]; // used[i] = 1     iff pi is used
dexpr int totalUsed = sum(pi in p) used[pi];

execute {
  cplex.tilim = 60; // Time limit 60 seconds
}

// model

minimize totalUsed;

subject to {
  forall(pi in p) 
    c_cap:
    sum(vi in v) c_req[vi] * assign[pi][vi] <= c;

  forall(pi in p)
    s_cap:
    sum(vi in v) s_req[vi] * assign[pi][vi] <= s;

  forall(vi in v)
    v_all:
    sum(pi in p) assign[pi][vi] == 1;

  forall(pi in p, v1 in v, v2 in v) if (v1 < v2) if (trust[v1][v2] ==  0)
    trust_constraint:
    assign[p][v1] + assign[p][v2] <= 1;
}
intn=。。。;
int m=。。。;
int c=。。。;
int s=。。。;
范围v=1..n;
范围p=1..m;
int c_请求[v]=。。。;
int s_请求[v]=。。。;
国际信托[v][v]=。。。;
//决策变量
dvar布尔赋值[p][v];
//表情
使用的dexpr int[pi in p]=max(vi in v)赋值[pi][v];//当使用pi时,使用的[i]=1
dexpr int totalUsed=sum(p中的pi)used[pi];
执行{
cplex.tilim=60;//时间限制60秒
}
//模型
最大限度地减少总使用量;
服从{
forall(p中的pi)
c_上限:
求和(v中的vi)c_请求[vi]*分配[pi][vi]您可以编写

subprocess.check_call(["C:/CPLEXStudio127/opl/bin/x64_win64/oplrun", "diet.mod", "diet.dat"]) 
为了从python.调用OPL,您需要事先生成diet.dat

完整示例

这样就不必将模型从OPL迁移到Python

您也可以将模型转换为Python,然后我推荐DOCPLEX:


如果生成diet.dat,请确保文件句柄已刷新并关闭。