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

一、问题描述及模型建立

  • 指派问题: 分配\(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. ImageMagick 图像处理学习笔记

    Use ImageMagick to create, edit, compose, or convert bitmap images. It can read and write images in ...

  2. DASCTF二进制专项部分Writeup

    easynote create:堆大小可以任意分配只要不超过0xFFF create()  unsigned __int64 create() { int i; // [rsp+0h] [rbp-20 ...

  3. 使用脚本收发 protobuf 协议数据

    问题背景 最近做了一个 ipv6 相关的功能,发现使用 getifaddrs 获取的本地 ipv6 地址有可能不是真实的网络 ipv6 地址: 例如上图中通过 getifaddrs 获得了多个本地 i ...

  4. Python潮流周刊#6:Python 3.12 有我贡献的代码!

    你好,我是猫哥.这里记录每周值得分享的 Python 及通用技术内容,部分为英文,已在小标题注明.(标题取自其中一则分享,不代表全部内容都是该主题,特此声明.) 首发于我的博客,https://pyt ...

  5. Spring配置动态数据库

    前言 本文主要介绍使用spring boot 配置多个数据库,即动态数据库 开始搭建 首先创建一个SpringWeb项目--dynamicdb(spring-boot2.5.7) 然后引入相关依赖lo ...

  6. Taro项目引入Tailwindcss

    前情 Tailwind CSS 是一个原子类 CSS 框架,它将基础的 CSS 全部拆分为原子级别,同时还补全各种浏览器模式前缀,兼容性也不错.它的工作原理是扫描所有 HTML 文件.JavaScri ...

  7. 【linux命令】最强大的编辑器vim用法简介(基础篇)

    vim编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器.它主要分为命令令行模式.插入模式和底行模式这三种,下面主要介绍一下这三种模式最简单常用的用法. 一.命令 ...

  8. 无法将“Ethernet0”连接到虚拟网络“VMnet8”。

    出现这个问题的解决办法,请参考右侧链接:https://blog.csdn.net/big_bigwolf/article/details/79147388

  9. 性能_3 jmeter连接数据库jdbc(sql server举例)

    一.下载第三方工具包驱动数据库 1. 因为JMeter本身没有提供链接数据库的功能,所以我们需要借助第三方的工具包来实现.  (有这个jar包之后,jmeter可以发起jdbc请求,没有这个jar包, ...

  10. HCL实验:3.两台PC通过路由器交换机PING通

    拓扑图 路由器配置网关 PC1 ping PC2, PC3