线性规划相关学习
线性规划是统筹学中最重要的一种系统优化方案,引用领域十分广泛,包括生产计划、物资调运、任务分配、资源优化配置、经济规划等问题。也有许多线性规划的应用,我们这里就用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") x2 = model.addVar(lb=0, name="x2") x3 = model.addVar(lb=0, name="x3") 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)
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混合规划。