最近导导让牛牛改篇论文,牛牛在她的指导下把非线性问题化成了线性。然鹅,化成线性后的模型决策变量和约束条件均达到上百甚至上千个,这让牛牛犯了难,以下方法或许能为这样大规模模型的变量和约束输入提供思路(๑•́₃ •̀๑)

一、问题描述及模型建立

  • 指派问题: 分配\(n\)人去做\(n\)项工作;每人做且只做一项工作;若分配第\(i\)人去做第\(j\)项工作,需花费\(c_{ij}\)成本。问应如何分配工作使总成本最小?

  • 模型建立:

\[min\quad\sum^n_{i=1}\sum^n_{j=1}c_{ij}x_{ij}
\]

\(s.t.\)

\[\sum^n_{j=1}x_{ij}=1,\forall{i=1,2,\dots,n}
\]
\[\sum^n_{i=1}x_{ij}=1,\forall{j=1,2,\dots,n}
\]

二、模型参数变量及对应OPL语法

  • 参数(已知量):\(n\)、\(c_{ij}\),均为整型;

    • OPL定义参数(int/float):int n=5或者n=...,如果为连续型变量,int改为float即可定义小数;

    • n=...允许n先不定义它是多少,用三个点表示。这种写法实现的是模型文件和数据文件分开写。

  • 集合(已知量):\([1..n]\);

    • OPL定义集合(range):语法为range 变量名=1..n

    • 上面问题可以写成range worker=1..n1..n中的两个点也是CPLEX语法,指从1到n,注意一定是两个点。

    • 定义好了集合,模型中再遇到i∈1..n时,就可以简写成i in worker了;也可以直观写成i in 1..n,看个人编程喜好。

  • 变量:\(x_{ij}\),为0-1布尔型;

    • OPL定义变量(dvar):语法为dvar 数据类型 变量

    • 上面问题可定义为dvar boolean x[Worker][Job]dvar bool x[1..n][1..n]

    • 此外,数据类型除了boolean,还有整型(int),正整数(int+)、连续型(float)等。如定义一个正整数x则为: dvar int+ x

  • 定义模型时的符号有

    • 最小化问题(minmize)

      • OPL语法:minimize
    • 约束(subject to)

      • OPL语法:subject to
  • 定义约束时的符号有:

    • 求和号\(\sum\),OPL中可表示为sum

    • 任意号\(\forall\),OPL中可表示为forall,如\(\forall{i}\in{1,..n}\)可表示为forall(i in 1..n)

CPLEX编程思想: 先定义已知量(参数、集合),再定义未知量(决策变量),然后采用"集合语言"写目标和约束。

三、Cplex求解(OPL语言)

基于上面的模型进行求解:

  • 首先编写已知量\(n,c_{ij}、1..n\):
int n=...; // 参数n
range Worker=1..n; // 工人集合
range Job=1..n; // 任务集合
int c[Worker][Job]=...; // 成本参数
  • 编写决策变量\(x_{ij}\)
dvar boolean x[Worker][Job];  // 决策变量
  • 编写目标函数
minimize sum(i in Worker)sum(j in Job) c[i][j]*x[i][j];
  • 编写约束条件
subject to
{ forall(i in 1..n)
sum(j in 1..n) x[i][j] == 1;//约束1
forall(j in 1..n)
sum(i in 1..n) x[i][j] == 1;//约束2
}
  • 写入Cplex中.mod文件如下:

再将参数\(n,c_{ij}\)数据写入.dat文件:

n=3; // 3个工人去完成3个任务
c=[[3,8,2],[8,4,6],[6,2,10]]; // 成本矩阵

最后将这两个文件放入同一个运行配置中进行求解。本文分别将上面两个文件命名为demo1.moddemo1_data.dat,运行配置命名为confit_demo(运行配置必须为英文名,不能为中文)

得出的求解结果如下:

即\(x_{11},x_{22},x_{33}=1\),其余决策变量为\(0\)

Cplex求解教程(基于OPL语言,可作为大规模运算输入参考)的更多相关文章

  1. 基于STM32单片机光学指纹识别模块(FPM10A)全教程(基于C语言)

    本文转载,其来源在参考中:1,稍加修改,因为近期使用到这个模块,故而加以整理! 1.平台 首先我使用的是 奋斗 STM32 开发板 MINI板 基于STM32单片机光学指纹识别模块(FPM10A)全教 ...

  2. 基于Go语言的xmind读写库,我主要用来把有道云笔记思维导图转为xmind

    项目地址 xmind 基于go语言的xmind接口 使用方法参考: example 本库主要加载xmind文件为json结构,保存文件时也用的json结构而不是xml结构 本库只做了最基本的主题添加功 ...

  3. 【CPLEX教程03】java调用cplex求解一个TSP问题模型

    00 前言 前面我们已经搭建好cplex的java环境了,相信大家已经跃跃欲试,想动手写几个模型了.今天就来拿一个TSP的问题模型来给大家演示一下吧~ CPLEX系列教程可以关注我们的公众号哦!获取更 ...

  4. 《Selenium2自动化测试实战--基于Python语言》 --即将面市

    发展历程: <selenium_webdriver(python)第一版>   将本博客中的这个系列整理为pdf文档,免费. <selenium_webdriver(python)第 ...

  5. 基于Swift语言开发微信、QQ和微博的SSO授权登录代码分析

    前言 Swift 语言,怎么说呢,有一种先接受后排斥.又欢迎的感觉,纵观国外大牛开源框架或项目演示,Swift差点儿占领了多半,而国内尽管出现非常多相关技术介绍和教程,可是在真正项目开发中使用的占领非 ...

  6. 单片机教程4.C语言基础以及流水灯的实现

    单片机教程4.C语言基础以及流水灯的实现 C语言,没接触过计算机编程语言的人会把它看的很神秘,感觉非常的难,而在我看来,C语言的逻辑和运算,就是小学水平,所以大家不要怕它,我尽可能的从小学数学逻辑方式 ...

  7. 关于《Selenium3自动化测试实战--基于python语言》

    2016年1月,机缘巧合下我出版了<Selenium2自动化测试实战--基于python语言>这本书,当时写书的原因是,大部分讲Selenium的书并不讲编程语言和单元测试框,如果想在项目 ...

  8. selenium2自动化测试实战--基于Python语言

    自动化测试基础 一. 软件测试分类 1.1 根据项目流程阶段划分软件测试 1.1.1 单元测试 单元测试(或模块测试)是对程序中的单个子程序或具有独立功能的代码段进行测试的过程. 1.1.2 集成测试 ...

  9. 关于《selenium2自动测试实战--基于Python语言》

    关于本书的类型: 首先在我看来技术书分为两类,一类是“思想”,一类是“操作手册”. 对于思想类的书,一般作者有很多年经验积累,这类书需要细读与品位.高手读了会深有体会,豁然开朗.新手读了不止所云,甚至 ...

  10. Gogs - 基于 Go 语言的自助 Git 服务

    Gogs(Go Git Service) 是一个基于 Go 语言的自助 Git 服务.Gogs 的目标是打造一个最简单.最快速和最轻松的方式搭建自助 Git 服务.使用 Go 语言开发使得 Gogs ...

随机推荐

  1. CentOS Linux 7 安全基线设置

    作为一个生信人,不管是日常的数据分析还是其他工具应用的开发,服务器的安全始终是一个无法避免的话题.尤其是当我们拿到一台新的服务器,我们需要怎样才能确保它是安全可靠,并最小限度降低它被攻击的可能性? 下 ...

  2. JeeCms低代码开发平台了解及认知以及遇到的问题

    1.jeecms低代码开发平台自带标签,使用的标签延续freemarker标签或基于freemarker标签自定的标签(类似自jsp自定义标签) (1)什么是freemarker标签: FreeMar ...

  3. 专访泛境科技:如何借助3DCAT实时云渲染打造元宇宙解决方案

    随着5G.VR/AR等技术的发展,元宇宙(Metaverse)这一概念越来越受到关注.元宇宙是一个由虚拟世界构成的网络空间,其中人们可以通过数字化的身份和形象进行各种社交.娱乐.创作和商业活动.元宇宙 ...

  4. Java NIO原理 (Selector、Channel、Buffer、零拷贝、IO多路复用)

    系列文章目录和关于我 零丶背景 最近有很多想学的,像netty的使用.原理源码,但是苦于自己对于操作系统和nio了解不多,有点无从下手,遂学习之. 一丶网络io的过程 上图粗略描述了网络io的过程,了 ...

  5. Flutter状态管理新的实践

    1 背景介绍 1.1 声明式ui 声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热.单说移动端,跨平台方案有:RN.Flutter.iOS原生有:SwiftUI.android原 ...

  6. CF1608F MEX counting

    题意 给定 \(n, k\) 和序列 \(b_{1\dots n}\),计数序列 \(a_{1\dots n}\) 使得 \(\forall i \in [1, n], \operatorname{m ...

  7. 一文了解Go语言的匿名函数

    1. 引言 无论是在Go语言还是其他编程语言中,匿名函数都扮演着重要的角色.在本文中,我们将详细介绍Go语言中匿名函数的概念和使用方法,同时也提供一些考虑因素,从而帮助在匿名函数和命名函数间做出选择. ...

  8. vue报错解决Duplicate keys detected: ‘[object Object]’

    最近在做vue项目时遇到了报错 ​ Duplicate keys detected: '[object Object]'. This may cause an update error. ​ 由于这个 ...

  9. 【Flyway】初识Flyway,将Flyway集成于Spring项目

    什么是Flyway Flyway官方网站:点击这里 官方描述: Flyway extends DevOps to your databases to accelerate software deliv ...

  10. 报错 no currentsessioncontext configured!

    no currentsessioncontext configured! 使用hibernate框架报错 配置了session工厂类,使用getCurrentSession();时候引起的,原因是cu ...