线性整数规划
约束和目标函数均为线性,但变量值为整数。实际应用有去和不去、取和不取等01决策问题和物品不可拆分、所求人数等要求变量为整数的问题。
指派问题
每个任务指派一个人
每个人只做一项任务
旅行商问题
从任意城市出发,每个城市只经过依次,任意两个城市之间通过有费用,问最终回到出发城市的最小费用。
,避免绕环
指只进入一次,即的入度为1
指从只出去一次,即的出度为1
-
- 定义为从出发点到的编号,起点编号为0,第二个到达点为1,依次增加。则
- 若,则。若,则。
- 对于不含子回路的路线,由于当时,只有。所以约定。一定满足。
- 对于含子回路的路线,由于当时,不一定为,还可能有其他的边。,所以不满足约束
- 所以约束排除了含有子回路的路线
排斥约束线性化——利用01决策
单端不等式之间的排斥约束
有个互斥的不等式约束,每次满足一个即可。
将不等式都化为同类型,则
等式与双端不等式之间的排斥约束
或
扩展:
有个等式和个双端不等式,将个等式放在个双端不等式中
单端不等式可以转为双端不等式
不等于约束可以转为两个互相排斥的单端不等式
例题:
工厂生产产品有种方式,问生产一批产品所用的最小成本。
定义:
表示采用第种方式生产的产品个数
表示采用第种方式生产每件产品的变动成本(即额外成本)
表示采用第种方式生产的固定成本(即必需成本)
则每种生产方式对应的成本为
分段函数,有两个互相排斥的约束,用01决策转化,则
整数规划典型题
问题描述
10个站点,在站点上建立网点进行网络覆盖 。一个网点可以覆盖到与它距离小于等于10的站点,且一个网点最多只能覆盖5个站点。问如何建立最少的网点实现全覆盖。
数据如下
竖着为一个站点坐标
9.4888 8.7928 11.5960 11.5643 5.6756 9.8497 9.1756 13.1385 15.4663 15.5464
5.6817 10.3868 3.9294 4.4325 9.9658 17.6632 6.1517 11.8569 8.8721 15.5868
解题思路
- 一个网点最多覆盖5个,且满足全覆盖,则
- 求出任意两个站点之间的距离,利用 (给10个坐标,返回10x10的矩阵)
- 一个网点可以覆盖到与它距离小于等于的站点,则
- 表示在处建立网点
- ,即
- ,
clc,clear,close all
c=load("data1.txt");
d=dist(c);
disp(d);
prob=optimproblem();
y=optimvar("y",10,10,"Type","integer","LowerBound",0,"UpperBound",1);
prob.Objective=sum(diag(y));
prob.Constraints.con1=sum(y,1)>=1;
prob.Constraints.con2=sum(y,2)<=5;
con3=[];con4=[];con5=[];
for i=1:10
for j=1:10
con3=[con3;d(i,j)*y(i,j)<=10];
con4=[con4;y(i,i)>=y(i,j)];
end
end
prob.Constraints.con3=con3;
prob.Constraints.con4=con4;
[s,v]=solve(prob);
disp(s.y);
disp(v);
可满足的方案有多种,但最小网点数为2