使用COPT求解混合整数线性规划

这篇具有很好参考价值的文章主要介绍了使用COPT求解混合整数线性规划。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、使用Copt求解模型步骤

1.模型的引入

使用 from copt import * 引入模型

import coptpy as cp

2.创建求解环境

env = Envr()

创建优化模型,返回一个Model对象

mdl=env.ccreateModel("name")

3.添加决策变量

添加一个决策变量:mdl.addVar(lb=0.0, ub=COPT.INFINITY, obj=0.0, vtype=COPT.CONTINUOUS, name="", column=None)

Lb

变量的下界。可选参量,默认为0.0。

Ub

变量的上界。可选参量,默认为 COPT.INFINITY 。

Obj

变量的目标函数系数。可选参量,默认为0.0。

Vtype

变量类型。可选参量,默认为 COPT.CONTINUOUS ,可取值详见 变量类型 。

决策变量的类型用vtype决定。

COPT.CONTINUOUS(连续变量)

COPT.BINARY(二进制变量)

COPT.INTEGER(整数变量)

Name

变量的名字。可选参量,默认为 "" ,由求解器内部自动生成。

Column

变量对应的列。可选参量,默认为 None 。

添加一组变量到模型中。并返回一个tupledic类对象。 mdl.addVars(*indices, lb=0.0, ub=COPT.INFINITY, obj=0.0, vtype=COPT.CONTINUOUS, nameprefix="C")

*indices

变量的下标。

lb

变量的下界。可选参量,默认为0.0。

ub

变量的上界。可选参量,默认为 COPT.INFINITY 。

obj

变量的目标函数系数。可选参量,默认为0.0。

vtype

变量的类型。可选参量,默认为 COPT.CONTINUOUS ,可取值详见 变量类型 。

nameprefix

变量的名称前缀。可选参量,默认为 "C",其实际名称结合变量的下标自动生成。

例:

添加一组下标为i,j,k,n,名称为c的二进制变量

arcosC = tuplelist([(i, j, k, n) for i in P_0 for j in P_0 for k in K for n in N])

c = mdl.addVars(arcosC,vtype=COPT.BINARY,nameprefix='C')

4.添加目标函数

mdl.setObjective(expr, sense=None)

expr

目标函数的表达式。可取值为常数、Var类 对象、 LinExpr类 对象和 QuadExpr类 对象。

sense

目标函数的优化方向。可选参量,默认为 None ,表示不改动模型的优化方向。 模型的当前优化方向通过属性 ObjSense 查看。

sense=COPT.MAXIMIZE(优化方向为最大化)

sense= COPT.MINIMIZE(优化方向为最小化)

   例:

添加式子为:minZ=e+i,s,jyijs  kK,n∈N混合整数线性规划模型,算法,python  的目标函数  

TK = e + cp.quicksum(y[i, j, s] for i in P_1 for j in P_1 for s in S)

mdl.setObjective(TK,COPT.MINIMIZE)

5.添加约束条件

mdl.addConstr(lhs, sense=None, rhs=None, name="")添加一个线性约束

lhs

线性约束的左端项或约束构建器。

sense

线性约束的类型。可选参量,默认为 None 。

约束类型判断线性约束左边与右边的关系

约束类型为等于

Sense=COPT.EQUAL

约束类型为小于等于

Sense=COPT.LESS_EQUAL

rhs

线性约束的右端项。可选参量,默认为 None 。可取值为常数、 Var类 对象或 LinExpr类 对象。

name

线性约束的名称。可选参量,默认为 "",由求解器内部自动生成。

mdl.addConstrs(generator, nameprefix="C") 添加一组线性约束

generator

整数或表达式生成器。

Nameprefix

线性约束的名称前缀。可选参量,默认为 "C",其实际名称结合线性约束的下标自动生成。

例:添加式为:{i∈P0}cijkn+{i∈P1,  s∈S}aisjkn{i∈P1,  s∈S,jP0}aisjkn , ∀ jP0, k∈K,n∈N混合整数线性规划模型,算法,python  的约束条件。

mdl.addConstrs(cp.quicksum(c[i, j, k, n] for i in P_0 ) +cp.quicksum(a[i, j, s, k, n] for i in P_1 for s in S ) <=cp.quicksum(a[i, j, s, k, n] for i in P_1 for s in S for j in P_0 ) for j in P_0 for k in K for n in N)

cp.quicksum(data) 描述:快速构建表达式,返回一个 LinExpr类 对象。

生成表达式待加

6.求解

求解时间限制:

mdl.param.timelimit = time

求解

mdl.solve()

二、使用python求解一个混合整数线性规划模型代码实例

n=10 # 设置航点数为10

flypoint=[x for x in range(2,n+2)] #除起点外需要被旅行的航点数
point=[0]+[1]+flypoint
startpoint=[0]+[1] #有两个航点是起点

import numpy as np
rnd=np.random
rnd.seed(0)

rnd.seed(0)
loc_x=rnd.rand(len(point))*200 #随机生成航点的横坐标
loc_y=rnd.rand(len(point))*100 #随机生成航点的纵坐标


arcos={(i,j) for i in point for j in point if i!=j} #表示旅行者从航点i到航点j
distancia={(i,j):np.hypot(loc_x[i]-loc_x[j],loc_y[i]-loc_y[j])
           for i in point for j in point if i!=j}  #计算航点之间的距离

import coptpy as cp
from coptpy import *

# Create COPT environment
env = Envr()

# create model
mdl = env.createModel("MIP example")


x=mdl.addVars(arcos,vtype=COPT.BINARY,nameprefix='x') #一个名为x的二元变量
s=mdl.addVars(flypoint,vtype=COPT.CONTINUOUS,nameprefix='s') #一个名为s的连续变量

mdl.setObjective(cp.quicksum(x[i,j]*distancia[i,j] for i,j in arcos),COPT.MINIMIZE) #目标函数,最小化旅行距离
obj=mdl.getObjective()
print(obj)


#约束条件
mdl.addConstrs(cp.quicksum(x[i,j] for j in flypoint if (i,j) in x.keys() )==1 for i in startpoint)
mdl.addConstrs(cp.quicksum(x[i,j] for i in flypoint if (i,j) in x.keys() )==1 for j in startpoint)
mdl.addConstrs(cp.quicksum(x[i,j] for i in point if (i,j) in x.keys() )==1 for j in flypoint)
mdl.addConstrs(cp.quicksum(x[j,i] for i in point if (j,i) in x.keys() )==1 for j in flypoint)
mdl.addConstrs(s[i]-(n+1)*x[i,j] >=s[j]-n for i in flypoint for j in flypoint  if (i,j) in x.keys())

mdl.param.timelimit = 60
mdl.solve()

三、cplex求解结果与COPT求解结果对比

在小规模场景下COPT求解结果

混合整数线性规划模型,算法,python

混合整数线性规划模型,算法,python

同场景下CPLEX求解结果:

混合整数线性规划模型,算法,python

混合整数线性规划模型,算法,python文章来源地址https://www.toymoban.com/news/detail-737697.html

到了这里,关于使用COPT求解混合整数线性规划的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数学建模整理-线性规划、整数规划、非线性规划

    在人们的生产实践中,经常会遇到如何利用现有资源来安排生产,以取得最大经济 效益的问题。若目标函数及约束条件均为线性函数,则称为线性规划(Linear Programming 简记 LP)。 可行解 :满足约束条件的解。 可行预 :所有可行解构成的集合称为问题的可行域,记为R。 图解法

    2024年02月06日
    浏览(41)
  • ✨使用Python进行线性规划求解,高端操作亮瞎你的双眼(文末技术彩蛋)

    各位童鞋们大家好,我是小小明,前几天我给大家分享了一个SMT求解器z3,链接地址见: https://xxmdmst.blog.csdn.net/article/details/120279521 虽然SMT求解器很强大,能够解逻辑题、解数独、解方程、甚至解决逆向问题,但是有个缺点就是只能找出一个可行解,如果我想要找出可行解的

    2023年04月09日
    浏览(39)
  • 数学建模十大算法03—线性规划、整数规划、非线性规划、多目标规划

    一、线性规划(Linear Programming,LP) 1.1 引例 在人们的生产实践中,经常会遇到 如何利用现有资源来安排生产,以取得最大经济效益的问题。 此类问题构成了运筹学的一个重要分支一数学规划,而 线性规划(Linear Programming, LP) 则是数学规划的一个重要分支。 简而言之,线

    2024年02月13日
    浏览(46)
  • 整数规划、对偶理论、线性规划经典例题讲解

    整数规划是一类要求问题的解中的全部或一部分变量为整数的数学规划,应用范围极其广泛。不仅在工业和工程设计和科学研究方面有许多应用,而且在计算机设计、系统可靠性和经济分析等方面也有新的应用。 通过前面的学习,我们已经掌握了整数规划的数学模型、割平面

    2024年02月05日
    浏览(56)
  • python求解线性规划问题

    要在 Python 中求解线性规划问题,通常可以使用 scipy.optimize.linprog 函数。首先,确保你已经安装了 scipy 库。如果你还没有安装,可以通过以下命令进行安装: 接下来,我们来看一个简单的线性规划问题示例。假设我们有以下线性规划问题: 最大化:Z = 3x + 2y 满足以下约束条

    2024年01月15日
    浏览(39)
  • Matlab线性规划问题求解

    本文来源于司守奎编著的数学建模算法与应用 例1.1: 某机床厂生产甲、乙两种机床,每台销售后的利润分别为4000元与3000元。生产甲机床需用A、B机器加工,加工时间分别为每台2h和1h;生产乙机床需用A、B、C三种机器加工,加工时间为每台各1h。若每天可用于加工的机器时数分别为

    2024年02月08日
    浏览(52)
  • 二次规划(QP)求解与序列二次规划(SQP)求解非线性规划问题

    二次规划(QP)是求解一种特殊的数学优化问题的过程——具体地说,是一个(线性约束)二次优化问题,即优化(最小化或最大化)多个变量的二次函数,并服从于这些变量的线性约束。二次规划是一种特殊的非线性规划。        序列二次规划(SQP,Sequental Quadratic Programming)算法是

    2024年02月02日
    浏览(43)
  • lingo软件求解线性规划举例

      缺点,数据多时不好找 当变量有成千上万个时,而关心的非零解只是极少数,在当前窗口读解很麻烦。下面是读取非零解的窗口操作步骤: (1)缩小当前解的窗口(不是关闭!); (2)把鼠标点进模型所在窗口;

    2024年02月13日
    浏览(51)
  • 幺模矩阵-线性规划的整数解特性

    百度百科:幺模矩阵 在线性规划问题中,如果A为幺模矩阵,那么该问题具有最优整数解特性。也就是说使用单纯形法进行求解,得到的解即为整数解。无需再特定使用整数规划方法。 m i n c T x s . t . { A x ≥ b x ≥ 0 begin{align*} min quad mathbf{c}^T mathbf{x} \\\\ s.t. quad begin{cases} m

    2024年02月20日
    浏览(43)
  • 整数线性规划实现(matlab分枝界定法)

    文章目录 一、本次问题 1.利用第一天所学知识求解: 2.本题理解: (1)分支界定法 背景: 基本理论(解题步骤): 求解实现1: 1.第一步 2.第二步 3.第三步 4.第四步 结论:综上,最优解:x1 = 4 ,x2 = 2 ;最优值:340  求解实现2: 结果2:最优解:x1 = 4 ,x2 = 2 ;最优值:

    2024年02月05日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包