线性规划相关学习

线性规划相关学习

线性规划是统筹学中最重要的一种系统优化方案,引用领域十分广泛,包括生产计划、物资调运、任务分配、资源优化配置、经济规划等问题。也有许多线性规划的应用,我们这里就用COPT的规划求解器去学习使用。

线性规划的基本定义

一般形式为:

\(\max (\min) z = c_1x_1+c_2x_2+ \cdots +c_nx_n\)

\(s.t. \begin{cases} a_{11}x_1+a_{12}x_2+\cdots + c_{1n}x_n = b_1 \\ a_{21}x_1 + a_{22}x_2 + \cdots+c_{2n}x_n = b_2 \\ \cdots \\ x_1,x_2,x_3\cdots x_n \geq 0 \end{cases}\)

其中\(\max (\min) z = c_1x_1+c_2x_2+ \cdots +c_nx_n\) 称为目标函数,

\(a_{11}x_1+a_{12}x_2+\cdots + c_{1n}x_n = b_1 \\ a_{21}x_1 + a_{22}x_2 + \cdots+c_{2n}x_n = b_2\) 称为约束条件,这里的=号,可以更换成\(\leq \ \geq \ \neq\)

\(x_1,x_2,x_3\cdots x_n \geq 0\) 称为非负约束。

线性规划问题可以由向量和矩阵表示:

\(\max(\min) z = C^T X \\ s.t. \begin{cases} AX \leq(=,\geq) \ b \\ X \geq 0 \end{cases}\)

对于正常的解法,单纯形法等方法,不在介绍,直接上COPT怎么用。

COPT如何解决线性规划

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
"""
题目:某加工厂需要加工一批圆钢调料,规格为70cm,52cm,35cm,这三种圆钢条料的需要量为100条,150条,900条
库房库存一批长 180cm 的圆钢坯料,先对圆钢坯料进行切割。
问:如何下料,使总余料最少。
"""
import coptpy as cp
from coptpy import COPT

env = cp.Envr()
model = env.createModel("eg2") # 搭建环境

x1 = model.addVar(lb=0, name="x1") # 定义变量,参数lb为下界,ub为上界
x2 = model.addVar(lb=0, name="x2") # vtype为变量类型COPT.CONTINUOUS连续型变量,COPT.BINARY二进制变量
x3 = model.addVar(lb=0, name="x3") # COPT.INTEGER 为整数变量
x4 = model.addVar(lb=0, name="x4")
x5 = model.addVar(lb=0, name="x5")
x6 = model.addVar(lb=0, name="x6")
x7 = model.addVar(lb=0, name="x7")
x8 = model.addVar(lb=0, name="x8")

model.addConstr(2*x1 + x2 + x3 + x4 >= 100) # 给出约束条件
model.addConstr(2*x2 + x3 + 3*x5 + 2*x6 + x7 >= 150)
model.addConstr(x1 + 3*x3 + 2*x6 + 3*x7 + 5*x8 >= 900)

model.setObjective(5*x1 + 6*x2 + 23*x3 + 5*x4 + 24*x5 + 6*x6 + 23*x7 + 5*x8, sense=COPT.MINIMIZE)
# 设置目标函数 setObjective(expr, sense=None),expr为表达式,sense为目标函数的优化方向,有MAXIMIZE和MINIMIZE

model.solve()
# 解线性规划

if model.status == COPT.OPTIMAL: # 输出规划中的一些变量值
print("Objective value: {}".format(model.objval))
allvars = model.getVars()

print("Variable solution:")
for var in allvars:
print(" x[{0}]: {1}".format(var.index, var.x))

print("Variable basis status:")
for var in allvars:
print(" x[{0}]: {1}".format(var.index, var.basis))

整数规划

跟线性规划没有什么差距,就只是将连续型的变量变成了离散的,只能取整数 COPT.INTEGER

所有变量全取整数的规划叫纯整数规划,部分变量取整数的规划称为混合整数规划。所有变量都取0,1两个值的规划叫0-1规划,部分的叫0-1混合规划。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!