一、基本概念
整数规划是一种特殊的线性规划,其中某些或所有决策变量必须是整数。线性规划的概念可以阅读下面文章:
数模方法论-线性规划-CSDN博客https://blog.csdn.net/qq_41489047/article/details/142134282 这种方法用于解决那些要求解变量为整数的优化问题,例如资源分配、调度问题或网络设计。整数规划可以分为两类:
- 整数线性规划(ILP):所有决策变量都是整数。
- 混合整数线性规划(MILP):只有部分决策变量是整数,其余的可以是连续的。
整数规划是运筹学和优化中的一个重要领域,它涉及在优化问题中要求某些或所有变量为整数。整数规划问题通常比普通的线性规划问题更复杂,因为整数约束使得问题变成了组合优化问题。整数规划在实际中应用广泛,包括:
- 生产调度:安排生产任务以优化资源使用。
- 运输和物流:设计高效的运输路线。
- 资源分配:如项目选择或资金分配问题。
- 网络设计:优化通信或电力网络布局。
二. 整数规划类型和实际问题
1、整数规划类型
-
纯整数规划(Pure Integer Programming, IP):所有决策变量都为整数。
-
混合整数规划(Mixed-Integer Programming, MIP):只有一部分变量为整数,其余为连续。
-
0-1 整数规划(Binary Integer Programming):变量只能取0或1的值。
2、实际问题
-
约束条件互斥类问题
-
固定费用问题
-
指派类问题
三. 求解方法
常见的求解方法包括:
- 分支定界法(Branch and Bound):通过递归地分解问题并使用界限来剪枝。
- 割平面法(Cutting Plane Method):通过添加约束来改善解的可行性。
- 启发式算法:如遗传算法、模拟退火等。
四. 计算机求解实例
例题一
Python代码:
import numpy as np
from pulp import LpProblem, LpVariable, lpSum, LpMinimize, value
# 定义目标函数系数
c = np.array([
[3, 8, 2, 10, 3],
[8, 7, 2, 9, 7],
[6, 4, 2, 7, 5],
[8, 4, 2, 3, 5],
[9, 10, 6, 9, 10]
])
c = c.flatten()
# 创建整数规划问题
prob = LpProblem("Integer_Programming_Problem", LpMinimize)
# 定义决策变量
x = LpVariable.dicts("x", (range(25)), cat='Binary')
# 定义目标函数
prob += lpSum(c[i] * x[i] for i in range(25))
# 定义约束条件
# 约束:每行和每列的和必须为1
for i in range(5):
prob += lpSum(x[i*5+j] for j in range(5)) == 1 # 行约束
prob += lpSum(x[j*5+i] for j in range(5)) == 1 # 列约束
# 求解问题
prob.solve()
# 提取并显示结果
solution = np.array([value(x[i]) for i in range(25)])
solution = solution.reshape((5, 5))
print("Optimal solution:")
print(solution)
Matlab代码:
clc, clear
c=[3 8 2 10 3;8 7 2 9 7;6 4 2 7 5
8 4 2 3 5;9 10 6 9 10];
c=c(:); a=zeros(10,25); intcon=1:25;
for i=1:5
a(i,(i-1)*5+1:5*i)=1;
a(5+i,i:5:25)=1;
end
b=ones(10,1); lb=zeros(25,1); ub=ones(25,1);
x=intlinprog(c,intcon,[],[],a,b,lb,ub);
x=reshape(x,[5,5])
例题二
Python代码:
import numpy as np
from scipy.optimize import linprog
# 定义目标函数
f = [-3, -2, -1]
# 定义约束条件
A = [np.ones(3)] # 等价于 a
b = [7]
A_eq = [[4, 2, 1]]
b_eq = [12]
# 定义变量的上下界
lb = [0, 0, 0]
ub = [np.inf, np.inf, 1] # 这里 x3 的上下界是 0 到 1
# 将不等式约束合并为一个矩阵
bounds = [(lb[i], ub[i]) for i in range(len(lb))]
# 解决整数规划问题
res = linprog(c=f, A_ub=A, b_ub=b, A_eq=A_eq, b_eq=b_eq, bounds=bounds, method='highs')
# 打印结果
print("Optimal value:", res.fun)
print("Optimal solution:", res.x)
MATLAB代码
clc, clear
f=[-3;-2;-1]; intcon=3; %整数变量的地址
a=ones(1,3); b=7;
aeq=[4 2 1]; beq=12;
lb=zeros(3,1); ub=[inf;inf;1]; %x(3)为0-1变量
x=intlinprog(f,intcon,a,b,aeq,beq,lb,ub)