建模算法(二)——整数规划

一、概述

1、定义:规划中变量部分或全部定义成整数是,称为整数规划。

2、分诶:纯整数规划和混合整数规划。

3、特点:

(1)原线性规划有最优解,当自变量限制为整数后:

a、原最优解全是整数,那最优解仍成立

b、整数规划没有可行解

c、有可行解,但是不是原最优解

4、求解方法分类

(1)分支定界法

(2)割平面法

(3)隐枚举法

(4)匈牙利法

(5)蒙特卡洛法

二、分支定界法

1、算法如下(求解整数规划最大化问题)

MATLAB实现

function r=checkint(x)
%判断x(i)是不是整数了。是的话r(i)返回1,不是的话,返回0

%输入参数:x   X向量
%输出参数:r   R向量

for i=1:length(x)
    if(min(abs(x(i)-floor(x(i))),abs(x(i)-ceil(x(i))))<1e-3)
        r(i)=1;
    else
        r(i)=0;
    end
end
function val=isrowinmat(arow,mat)
%用来判断mat中是否包含与arow一样的向量

%输入变量:arow    向量
%         mat     矩阵
%输出变量:val     1表示有,0表示没有
val=0;
rows=size(mat,1);
for i=1:rows
    temp=(mat(i,:)==arow);
    if length(find(temp==0))==0
        val=1;
        return;
    else
        val=0;
    end;
end
function [x,fval,exitflag,output,lambda]=linprogdis(ifint,f,A,b,Aeq,beq,lb,ub,x0,options)
% 用法
%    [x,fval,exitflag,output,lambda]=lpint(ifint.f,A,b,Aeq,beq)
%    [x,fval,exitflag,output,lambda]=lpint(ifint,f,A,b,Aeq,beq,lb)
%    [x,fval,exitflag,output,lambda]=lpint(ifint,f,A,b,Aeq,beq,lb,ub)
%    [x,fval,exitflag,output,lambda]=lpint(ifint,f,A,b,Aeq,beq,lb,ub,x0)
%    [x,fval,exitflag,output,lambda]=lpint(ifint,f,A,b,Aeq,beq,lb,ub,x0,options)

if nargin<10, options=[];  end
if nargin<9,  x0=[];       end
if nargin<8,  ub=inf*ones(size(f));      end
if nargin<7,  lb=zeros(size(f));      end

[x,fval,exitflag,output,lambda]=linprog(f,A,b,Aeq,beq,lb,ub,x0,options);

if exitflag<=0        %表示线性规划没有最优解
    return
end

v1=find(ifint==1);  %找到需要整数规划的变量的下标

temp=x(v1);%如果不是要求整数规划的就可以返回了。
if isempty(temp)
    return
end

v2=find(checkint(temp)==0);
if isempty(v2)   %都是整数,得到最众解
    return
end

k=v1(v2(1));

temp1=zeros(1,length(f));
temp1(k)=1;
low=floor(x(k));
if isrowinmat([temp1,low],[A,b])==1
    thisA=A;
    thisb=b;
else
    thisA=[A;temp1];
    thisb=b;
    thisb(end+1)=low;
end

[x1,fval1,exitflag1,output1,lambda1]=linprogdis(ifint,f,thisA,thisb,Aeq,beq,lb,ub,x0,options);

temp2=zeros(1,length(f));
temp2(k)=-1;
high=-ceil(x(k));
if isrowinmat([temp2,high],[A,b])==1
    thisA=A;
    thisb=b;
else
    thisA=[A;temp2];
    thisb=b;
    thisb(end+1)=high;
end

[x2,fval2,exitflag2,output2,lambda2]=linprogdis(ifint,f,thisA,thisb,Aeq,beq,lb,ub,x0,options);

if (isempty(v2) && ((exitflag1>0 && exitflag2<=0 && fval<=fval)||(exitflag2>0 && exitflag1<=0 && fval<=fval2)||(exitflag1>0 && exitflag2>0 && fval<=fval1 && fval<=fval2)))
    disp(‘error call‘);
    return ; %表示都是整数
end

if exitflag1>0&&exitflag2<=0
     x=x1;
     fval=fval1;
     exitflag=exitflag1;
     output=output1;
     lambda=lambda1;
elseif exitflag1<=0&&exitflag2>0
     x=x2;
     fval=fval2;
     exitflag=exitflag2;
     output=output2;
     lambda=lambda2;
elseif exitflag1>0 && exitflag2>0
    if fval1<fval2
        x=x1;
        fval=fval1;
        exitflag=exitflag1;
        output=output1;
        lambda=lambda1;
    else
         x=x2;
         fval=fval2;
         exitflag=exitflag2;
         output=output2;
         lambda=lambda2;
    end
end
时间: 2024-09-30 20:37:56

建模算法(二)——整数规划的相关文章

数据结构与算法二

1.课程安排表: 1. 线性表 2. 字符串 3. 栈和队列 4.树 5.查找 6.排序 7.暴力枚举法 8.广度优先搜索 9.深度优先搜索 10.分治 11.贪心 12.动态规划 13.图 14.数学方法与常见模型 15.大整数运算 16. 基础功能 2.   编程技巧: 1.把较大的数组放在main 函数(全局变量)外,作为全局变量,这样可以防止栈溢出,因为栈的大小是有限制的.GCC (C编译器) 段错误 2.如果能够预估栈,队列的上限,则不要用stack,queue,使用数组来模拟,这样速

Graham算法—二维点集VC++实现

一.凸包定义 通俗的说就是:一组平面上的点,求一个包含所有点的最小凸多边形,这个最小凸多边形就是凸包. 二.Graham算法思想 概要:Graham算法的主要思想就是,最终形成的凸包,即包围所有点的凸多边形,假定多边形是按逆时针方向生成的,那么多边形内部包围的所有点与多边形每个有向边的关系都是:点在有向边的左边.依照此思想,只要找到一个出发点,然后依此出发点按逆时针方向构建多边形,并保证每加入一条有向边时,都要满足其余点都在该边的左边. ***点与线的关系定义:平面上的三点P1(x1,y1),P

Kruskal算法(二)之 C++详解

本章是克鲁斯卡尔算法的C++实现. 目录 1. 最小生成树 2. 克鲁斯卡尔算法介绍 3. 克鲁斯卡尔算法图解 4. 克鲁斯卡尔算法分析 5. 克鲁斯卡尔算法的代码说明 6. 克鲁斯卡尔算法的源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的

每周算法(二)

每周算法 二 视屏地址:http://edu.51cto.com/course/course_id-5113.html 1.  递归实现my_strlen <1> 题目描述:实现求字符串长度函数my_strlen <2> 方法一:直接法 <3> 方法二:递归法 2.  递归实现n! <1> 题目描述:输入n值,求解n的阶乘 <2> 方法一:累乘法 <3> 方法二:递归法 3.  递归实现斐波那契数列Fib(n) <1> 题

白话经典算法二叉堆排序之思想简介

常用的排序算法有冒泡排序,插入排序和选择排序.他们的时间复杂度是o(n2),与数据量的平方成正比.他们的效率还是比较低的.现在来说说他们的效率为什么比较低下.以冒泡排序为例,它每一轮都是与相邻的元素进行交换,交换的距离为1,每次每个(没有冒泡出来的)元素都要与前一个比较再交换.每次相邻的比较只能比较出两个元素的大小,不能以整个数组进行参照来确定在整个数组里的大小,也就是说每次的比较不能确定其他元素的相对位置,因而每次比较的贡献不大,所以这样的比较是笨拙的,进而需要完全比较O(n2)次才能得出正确

{区块链教程}以太坊源码分析fast sync算法二

{区块链教程}以太坊源码分析fast sync算法二:上面的表格应该这样解释:如果我们每隔K个区块头验证一次区块头,在N个区块头之后,伪造的概率小于***者产生SHA3冲突的概率.这也意味着,如果确实发现了伪造,那么最后的N个头部应该被丢弃,因为不够安全.可以从上表中选择任何{N,K}对,为了选择一个看起来好看点的数字,我们选择N = 2048,K = 100.后续可能会根据网络带宽/延迟影响以及可能在一些CPU性能比较受限的设备上运行的情况来进行调整. Using this caveat ho

数学建模算法(二):相关分析

1.典型相关分析 R test<-read.csv("D:\\data\\hongputao_l.csv",header=T) test2<-scale(test[,1:10]) ca<-cancor(test2[,1:8],test2[,9:10]) #由ca分析结果可知典型变量应选1.2两对 U<-as.matrix(test2[, 1:8]) %*% ca$xcoef V<-as.matrix(test2[, 9:10]) %*% ca$ycoef

建模算法(一)&mdash;&mdash;线性规划

一.解决问题 主要是安排现有资源(一定),取得最好的效益的问题解决,而且约束条件都是线性的. 二.数学模型 1.一般数学模型 2.MATLAB数学模型 其中c,x都是列向量,A,Aeq是一个合适的矩阵,b,beq是合适的列向量.然后lb和ub是下限和上线(但是请注意= =,lb是一个变量的名字) 三.相关方程解法 1.图解法,画出可行域,这个可以进行编程进行实现. 2.直接使用MATLAB的相关方法进行解题. [x,fval]=linprog(c,A,b,Aeq,beq,LB,UB,Xo,OPT

一维数组建模表示二维的棋盘状态

当我们想写一个棋类游戏的时候,不难发现,很多棋类游戏的棋盘都可以用一个二维数组表示,比如: 井字棋(3*3的二维数组).黑白棋(8*8的二维数组).五子棋(15*15的二维数组)等等 使用二维数组表示棋盘,数组的下标就是棋子的坐标,数组中的值就是棋子的状态. 好处就是数据访问比较直观,可直接根据下标快速找到某个位置的棋子的状态. 但缺点也是很明显的 比如: 首先是遍历棋盘需要用双重循环处理横坐标跟纵坐标: 其次是判断棋子状态,比如以上所说的三种棋子,需要判断行.列以及斜线8个方向上的棋子状态,因