CPLEX求解柔性作业车间调度问题(详细)

目录

一、柔性作业车间概念

1.1柔性作业车间调度问题简介

1.2柔性作业车间数学模型

二、CPLEX软件

2.1CPLEX简介

2.2CPLEX基础语法

三、CPLEX求解柔性作业车间调度问题


最近研究了新的柔性作业车间相关问题,但是由于没有标准算例,所以只能用自己的算法和CPLEX求解结果进行对比,奈何网上的CPLEX求解车间调度的讲解实在是太少了,已有的也晦涩难懂,于是经过不懈的努力,跑通了FJSP问题,打算和大家分享一下。

一、柔性作业车间概念

1.1柔性作业车间调度问题简介

柔性作业车间是指假设有n个工件,工件集合为:_{_{_{_{}}}}^{J=J_1,J_2,...,J_n};每个工件的工序数为_{h_j}_{J_1}的工序为_{O_1,_1,O_1,_2,...,O_1,_h,_j},在m个机器上加工,机器集合_{M=M_1,M_2,...,M_m}上加工。_{O_i,_j}表示工件i的第j道工序,可以选择其可用的机器集合中的任意机器进行加工,每道工序的加工时间与加工机器相关。柔性作业车间在作业车间的基础上增加了机器选择子问题。

1.2柔性作业车间数学模型

要想在CPLEX上进行柔性作业车间求解,就得建立正确的数学模型,本文的数学模型主要参考论文Mathematical modeling and heuristic approaches to flexible job shop scheduling problems和教材《柔性作业车间调度智能算法及其应用》

Notation:(i表示机器索引,j表示工件索引,h表示工序索引)

n:工件总数;

m:机器总数;

h_j:工件j的工序数;

a_i,_j,_h :表示工件j的工序h的可选机器集中的机器i;

p_i,_j,_h:表示工件j的工序h在机器i上加工时间;

L:A large number;

variables(for i =1..m , j=1..n , h=1..hj)

Cmax:最大完工时间;

y_i,_j,_h:工件j的工序h选择机器i加工;

Ps_j,_h:工件j的工序h选择机器后的加工时间;

t_j,_h:工件j的工序h开始加工时间;

c_j,_h:工件j的工序h加工完成时间;

x_i,_j,_h,_k,_l:如果工序O_j,_h在机器i上先于O_k,_l加工则为1,否则为0;

数学模型:


\min\text{imize\,\,}C_{\begin{array}{c} \max\\ \end{array}}


c_{jh_j}\le C_{\max}

j=1,2,3...,n.


t_{j,h}+Ps_{j,h}\le c_{j,h}

j=1,2,3,...,n,h=1,2,3,...,h_j.


c_{jh}\le t_{j\left( h+1 \right)}

j=1,2,3,...,n;\,\,h=1,2,3,...,h_j-1.


y_{i,j,h}\le a_{i,j,h}

i=1,2,3...,m;j=1,2,...,n;h=1,2,...h_j.


Ps_i,_j,_h=\underset{i}{\varSigma}\left( y_{i,j,h}\cdot p_{i,j,h} \right)

j=1,2,3,...,n;\,\,h=1,2,3,...,h_{j.}\,\,


\underset{i=1}{\overset{m}{\varSigma}}y_{ijh}=1

j=1,2,3,...,n;\,\,h=1,2,3,...,h_j.


\underset{j=0}{\overset{n}{\varSigma}}\underset{h=0}{\overset{h_j}{\varSigma}}x_{i,j,h,k,l}=y_{i,k,l}

i=1,2,...,m;k=1,2,3,...,n;l=1,2,...,h_k.


\underset{k=0}{\overset{n}{\varSigma}}\underset{l=0}{\overset{h_k}{\varSigma}}x_{i,j,h,k,l}=y_{i,j,h}

i=1,2,...,m;j=1,2,3,...,n;h=1,2,...,h_j.


t_{j,h}+Ps_{j,h}\le t_{k,l}+L*\left( 1-x_{i,j,h,k,l} \right)

i=1,2,...,m;j=1,2,3,...,n;h=1,2,...,h_j,\\k=1,2,...,n;l=1,2,...,h_k.

二、CPLEX软件

2.1CPLEX简介

  • Cplex是IBM公司开发的一个优化工具引擎,可以用其求解线性规划、二次规划、整数规划等问题;能够快速解决一些行业难题。
  • 自带IBM ILOG Cplex Optimization Studio既能使用自带语言进行编程,也提供了众多流行语言的接口,具有广泛的应用前景

2.2CPLEX基础语法

CPLEX的语法可以参考这篇文章:

CPLEX & OPL建模语言从入门到放弃(一)~(八)

三、CPLEX求解柔性作业车间调度问题

假设有3个工件,3个机器,具体信息如下表:

表1 柔性作业车间案例

M1M2M3
J1O11103
O12230
O13414
J2O21324
O22053
O23402
J3O31401
O32420

下面是已知数据,需要自己传入:

//柔性作业车间FJSP数学模型求解

//已知参数
int n=...; //工件数
int m=...; //机器数
int H[0..n]=...; //每个工件的工序数
int hmax=...; //工序的最大值
range i1=1..m; //机器索引i
range j1=1..n; //工件索引j
range k1=1..n;

int a[i1][j1][1..hmax]=...; //如果工件j的第h个工序可以再机器i上加工,则为1,否则为0
int p[i1][j1][1..hmax]=...; //工件j的第h个工序在机器i上的加工时间;
int bigL=1000; //A Large Number

 接下来是设置的变量:

dvar int Cmax in 0..maxint; //最大完工时间
dvar boolean y[i1][j1][1..hmax]; //如果工件j的第h个工序选择机器i,则为true
dvar int+ Ps[j1][1..hmax]; //工件j的第h个工序选择机器后的加工时间
dvar int t[j1][1..hmax] in 0..maxint; //工件j的第h个工序的加工开始时间
dvar int c[j1][1..hmax] in 0..maxint; //工件j的第h个工件的加工完成时间
dvar boolean x[i1][0..n][0..hmax][0..n][0..hmax];

 最后是目标函数和约束条件:

//目标函数
minimize Cmax;

//约束条件:
subject to
{
    forall(j in j1)
      Cmax>=c[j][H[j]];
   
    forall(j in j1,h in 1..H[j])
      t[j][h]+Ps[j][h]==c[j][h];
   
    forall(j in j1,h in 1..(H[j]-1))
      c[j][h]<=t[j][h+1];
     
    forall(i in i1,j in j1,h in 1..H[j])
      y[i][j][h]<=a[i][j][h];
   
    forall(j in j1,h in 1..H[j])
      Ps[j][h]==sum(i in i1) y[i][j][h]*p[i][j][h];


    forall(j in j1,h in 1..H[j])
      sum(i in i1)
        y[i][j][h]==1;        
     
    forall(i in i1)
      sum(k in j1,l in 1..H[k])
        x[i][0][0][k][l]==1;
    

    forall(i in i1,k in j1,l in 1..H[k])
      sum(j in 0..n,h in 0..H[j])
        x[i][j][h][k][l]==y[i][k][l];

    forall(i in i1,j in j1,h in 1..H[j])
      sum(k in 0..n,l in 0..H[k])
        x[i][j][h][k][l]==y[i][j][h];
   
    forall(i in i1,j in j1,h in 1..H[j],k in j1,l in 1..H[k])
      x[i][j][h][k][l]+x[i][k][l][j][h]<=1;    
   
    forall(i in i1,j in 0..n,h in 0..H[j])
      x[i][j][h][j][h]==0;
     
    forall(i in i1,j in j1,k in j1,l in 1..H[k])
      x[i][j][0][k][l]==0;

    forall(i in i1,j in j1,h in 1..H[j],k in j1)
      x[i][j][h][k][0]==0;
     
    forall(i in i1,j in j1,h in 1..H[j],k in j1,l in 1..H[k])
      t[j][h]+Ps[j][h]<=t[k][l]+bigL*(1-x[i][j][h][k][l]);
}

 数据长这样:

n=3; //工件数
m=3; //机器数
H=[0,3,3,2]; //每个工件的工序数
hmax=3; //工件工序的最大值
a=
[
[[1,1,1],[1,0,1],[1,1,0]],
[[0,1,1],[1,1,0],[0,1,0]],
[[1,0,1],[1,1,1],[1,0,0]],
];

p=
[
[[1,2,4],[3,0,4],[4,4,0]], //机器1
[[0,3,1],[2,5,0],[0,2,0]], //机器2
[[3,0,4],[4,3,2],[1,0,0]], //机器3
];

 总结:需要建立正确的模型,这样在CPLEX就可以直接写代码,但是CPLEX的变量索引不能处理一下求解过程中的未知变量...。

第一次写,希望大家批评指正!

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要使用Pyomo指定CPLEX求解器来求解问题,可以按照以下步骤进行编程: 1. 确保已经安装了CPLEX求解器并设置了正确的路径。你可以从IBM官方网站下载并安装CPLEX求解器,并按照安装说明进行配置。 2. 导入必要的模块和函数: ```python from pyomo.environ import * from pyomo.opt import SolverFactory ``` 3. 创建一个Pyomo模型实例: ```python model = ConcreteModel() ``` 4. 定义决策变量: ```python model.x = Var() model.y = Var() ``` 5. 定义目标函数和约束条件: ```python model.objective = Objective(expr=model.x**2 + model.y**2, sense=minimize) model.constraint = Constraint(expr=model.x + model.y >= 1) ``` 在这个例子中,我们定义了一个二次目标函数`model.objective`,以及一个约束条件`model.constraint`。 6. 指定CPLEX求解器并求解问题: ```python solver = SolverFactory('cplex') # 使用CPLEX求解器 results = solver.solve(model) ``` 这里使用了`cplex`求解器,你也可以选择其他求解器。`solve()`函数将求解器应用于模型,并返回结果。 7. 打印结果: ```python model.display() ``` 你可以使用`display()`函数来打印变量和目标函数的最优解。 下面是一个完整的示例代码: ```python from pyomo.environ import * from pyomo.opt import SolverFactory # 创建模型实例 model = ConcreteModel() # 定义决策变量 model.x = Var() model.y = Var() # 定义目标函数和约束条件 model.objective = Objective(expr=model.x**2 + model.y**2, sense=minimize) model.constraint = Constraint(expr=model.x + model.y >= 1) # 指定CPLEX求解器并求解问题 solver = SolverFactory('cplex') results = solver.solve(model) # 打印结果 model.display() ``` 希望这个示例代码能帮助你使用Pyomo指定CPLEX求解器来求解问题!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值