用CPLEX写个数学模型就这么难?

一、前言

小编有个小伙伴,隔三差五就过来跟我说:这个模型CPLEX怎么写呢?我说我不是给你讲过好多次?他说CPLEX太复杂了,俺没学过学不会呢。

Similarly,遇到这个问题的不止小编这个小伙伴。很多刚入行的小伙伴都表示CPLEX对初学者来说并不是很友好,就连学习资料都不知道去哪里看,不像Excel或者Word,百度一下出来好多资料。

其实吧,这玩意儿并没有大家想的那么难,尤其是简单使用CPLEX求解一个模型的话,用来用去都是那几个函数而已。下面小编来给大家好好理一下,看完相信你也能用CPLEX跑一下论文上的模型啦。

当然啦,为了方便小编还是选择大家熟悉的Java平台,用Python也是可以的,处理数据可能还更方便。但是我们一般都是用Java写的算法,因此就统一平台啦。

我们今天以一个最经典的VRPTW arc-flow model为例,手把手给大家演示下,CPLEX其实并不是那么的难用。

二、模型集合定义

运行一个模型之前,首先要定义模型中用到的一些参数和集合,如果这些都没有,是无从谈起的。因此没有的话第一步是要先生成这些数据哦。

2.1 读取数据

首先,你需要在程序中定义相关的变量(通常的做法是写一个instance的类,把算例的数据读进来,放到成员变量上。)比如:

至于你怎么定义怎么写都无所谓啦,反正你知道这些数据对应模型的哪些参数就可以啦。

2.2 定义集合

其实小编发现,大家之所以觉得写模型难,还有一个原因就是自己建模的时候纯粹瞎搞。很多集合啊,参数啊,范围啊都没有想清楚,到写代码的时候就各种凌乱了。。。

好了回到我们的正题,刚刚读入了算例。接下来我们需要定义模型中需要用到的集合,这些集合是哪些集合呢?就是我指出来的这些:

然后你需要在程序中把这些集合给定义好了,然后把相应的数据填充进去,比如 N \mathscr{N} N为所有节点的集合, V \mathscr{V} V为所有车辆集合,那么就for一下填充就好啦:

for(i = 0; i < inst.nbCust + 2; ++i){
   
			this.N.add(i);
}

for(i = 0; i < inst.nbVeh; ++i){
   
    this.K.add(i);
}

当然了,在程序中不用定义这些集合也能实现我们的模型,这样做只是为了让程序更清晰,不至于到后面杂乱无章,debug起来也无从下手。

三、CPLEX建模

做完数据的定义,基本上就成功50%了。就像追女孩纸一样,当你喜欢她的时候就成功了50%,当她再喜欢你的时候,就100%成功了。现在我们就来完成剩下的50%。

在CPLEX中,你只需要知道以下三点,就能轻松驾驭一个数学模型啦:

  • 决策变量定义
  • 添加优化目标
  • 添加约束

想想也是哦,一个数学模型无非就是由决策变量、优化目标和约束组成嘛。下面我们来一个一个讲解。

不过,在此之前,我们先new一个CPLEX的对象出来,并设置一些参数:

this.cplex = new IloCplex();
this.cplex.setParam(IloCplex.Param.Simplex.Tolerances.Optimality, 1e-9);
this.cplex.setParam(IloCplex.Param.MIP.Tolerances.MIPGap, 1e-9);
this.cplex.setParam(IloCplex.DoubleParam.TimeLimit, 3600);
this.cplex.setOut(null)
  • 20
    点赞
  • 149
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值