利用MATLAB实现分支定界法求解整数规划

classdef Model < matlab.mixin.CopyablepropertiesintconlbubsolverAineqbineqAeqbeqf0foptionsendmethodsfunction obj = Model(prob)problem = prob.prob2struct;prob_cell = struct2cell(problem);[obj.intcon, obj.lb, obj.ub, obj.solver, obj.Aineq, obj.bineq, ...obj.Aeq, obj.beq, obj.f0, obj.f, obj.options] = prob_cell{:};endendmethodsfunction [x, fvl, status] = solve(obj)obj.options = optimset(Display="off");[x, fvl, status] = linprog(obj.f, ...obj.Aineq, obj.bineq,...obj.Aeq, obj.beq,...obj.lb, obj.ub, ...obj.options);if status > 0fprintf("x_curve = %s\n", mat2str(x'));fprintf("v_curve = %f\n", fvl);endendendend

主程序

clear;clc;close all
n = 4;
eps = 1e-6;
x = optimvar("x", n, Type="continuous",LowerBound=0,UpperBound=1);
prob = optimproblem(Description="12-4");
prob.ObjectiveSense = "min";
prob.Objective = 7*x(1) + 12*x(2) + 5*x(3) + 14*x(4);
prob.Constraints.C1 = 300*x(1) + 600*x(2) + 500*x(3) + 1600*x(4) >= 700;%% Step 0: 初始化:
t = 0;             % 初始化解的索引为0
v_hat = inf;       % 不存在已知可行解,模型求最小,因此v为正无穷
x_hat = [];
mdl = Model(prob);
active_mdl = [mdl]; %#ok<NBRAK2>
active_level = [0]; %#ok<NBRAK2>
while true%% Step 1:  停止if isempty(active_mdl)if isempty(x_hat)disp("模型不可行");elsefprintf("最优解: %s\n", mat2str(x_hat'));fprintf("目标值: %d\n", v_hat);endbreakend%% Step 2: 松弛% 尝试求解一个与x(t)对应的候选问题的线性规划松弛模型% 按照深度优先的原则,找出最深的节点max_node_index = find(active_level == max(active_level));% 具有相同深度的节点可能有两个,我们设定先择固定1的那个% 一般在分支的时候,我们依次加入固定0,固定1,因此1的索引靠后select_model = active_mdl(max_node_index(end));% 求解该模型fprintf("t=%d, 松弛求解\n", t);[x_curve, v_curve, flag] = select_model.solve;%% Step 3: 通过不可行终止% 如果线性规划模型不可行if flag < 1% 部分解x(t)没有完全形式,终止x(t)active_mdl(max_node_index(end)) = [];active_level(max_node_index(end)) = [];% t<-t+1fprintf("t=%d, 通过不可行终止\n", t);t = t + 1;% 返回步骤1continueend%% Step 4: 通过定界终止% 模型为最小化模型,如果v~ > v_^    if v_curve > v_hat% 则部分解x(t)最有可行的完全形式不能使最佳解更优active_mdl(max_node_index(end)) = [];active_level(max_node_index(end)) = [];% t<-t+1fprintf("t=%d, 通过定界终止\n", t);t = t + 1;% 返回步骤1continueend%% Step 5: 通过求解终止% 当线性规划松弛模型的最优解满足模型中所有的二元约束% 这个最优解就是部分解的最优可行完全形式idx = find(abs(x_curve - round(x_curve)) > eps, 1);if isempty(idx)% 保存这个解为最新的最佳解x_hat = round(x_curve);v_hat = v_curve;% 终止               active_mdl(max_node_index(end)) = [];active_level(max_node_index(end)) = [];% t<-t+1fprintf("t=%d, 通过求解终止\n", t);t = t + 1;% 返回步骤1continueend%% Step 6 分支fprintf("t=%d, 分支\n", t);% 选择线性规划松弛最优解中某些分数的自由二元约束分量x_p% 选择哪个变量进行分支,有很多不同策略,这里按照顺序来计算p = idx(1);% x_p固定为0new_mdl_l = copy(select_model);new_mdl_l.ub(p) = floor(x_curve(p));new_mdl_r = copy(select_model);new_mdl_r.lb(p) = ceil(x_curve(p));level = t + 1;active_mdl = [active_mdl, new_mdl_l, new_mdl_r]; %#ok<AGROW>active_level = [active_level, level, level]; %#ok<AGROW>t = t + 1;% 终止active_mdl(max_node_index(end)) = [];active_level(max_node_index(end)) = [];end

MATLAB实现分支定界法求解整数规划相关推荐

  1. 数学建模 分支限界算法求解整数规划原理以及编程实现

    引入 线性规划问题(松弛问题) 图解法: 使用图解法求出最优解,再使用四舍五入求出的整数解不满足条件 完全枚举法(穷举法):找出集合内所有满足条件的整数点,再带入不等式中,看是否有最优解 分支限界法 ...

  2. 分支定界 matlab,使用MATLAB实现分枝定界法求解整数规划的详细资料说明

    分支定界法是一种求解离散最优化问题的计算分析方法.它是由Land Doig和Dakin等人在20世纪60年代初提出的.分支定界法可求纯整数或混合整数线性规划问题,求解方法由分支和定界组成." ...

  3. matlab割平面方法程序,用割平面法求解整数规划问题max z=x1 x2, s.t.-x1 x2

    用lingo求解0-1整数规划的程序? min=x1+x2+x3;x1+x2>1;x2+x3>1;@bin(x1);@bin(x2);@bin(x3); Lingo求解0-1规划的问题 l ...

  4. 数学建模 割平面算法求解整数规划基本原理与编程实现

    基本思想 松弛问题:线性规划 割掉一块全部都是小数的区域(这一部分取不到整数) 案例 1)横坐标x1,纵坐标x2 2)蓝色小三角形的区域:x2:(1,7/4) x1:(0,3/4) 这块区域,x1与x ...

  5. matlab建模三要素,MATLAB建模与求解详解.ppt

    3.编写MATLAB程序为: f=[-72,-64]; A=[1,1;12,8;3,0]; b=[50;480;100]; lb=zeros(2,1); [x,fval]=linprog(f,A,b, ...

  6. matlab两个多项式相除,C++和MATLAB混合编程求解多项式系数(矩阵相除)

    摘要:MATLAB对于矩阵处理是非常高效的,而C++对于矩阵操作是非常麻烦的,因而可以采用C++与MATLAB混合编程求解矩阵问题. 主要思路就是,在MATLAB中编写函数脚本并使用C++编译为dll ...

  7. matlab龙格库塔法求通解,基于matlab及龙格库塔法求解布拉修斯方程.doc

    基于matlab及龙格库塔法求解布拉修斯方程 Runge-Kutta法求解布拉修斯解 摘要 薄剪切层方程主要有三种解法,即相似解,非相似条件下对偏微分方程组的数值解和近似解.布拉修斯解是布拉修斯于19 ...

  8. Matlab随笔之求解线性方程

    原文:Matlab随笔之求解线性方程 理论知识补充: %矩阵除分为矩阵右除和矩阵左除. %矩阵右除的运算符号为"/",设A,B为两个矩阵,则"A/B"是指方程X ...

  9. matlab求解多项式系数,C++和MATLAB混合编程求解多项式系数(矩阵相除)

    摘要:MATLAB对于矩阵处理是非常高效的,而C++对于矩阵操作是非常麻烦的,因而可以采用C++与MATLAB混合编程求解矩阵问题. 主要思路就是,在MATLAB中编写函数脚本并使用C++编译为dll ...

最新文章

  1. photoshop小结
  2. 最让青年科学家们困惑的 10 个问题,是什么?
  3. 异常记录: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError
  4. C++中rdbuf()简介及文件流的概念
  5. UiBot Creator v1.2火热体验中……
  6. Windows 8 :妥协的产物
  7. 立镖机器人浙江_立镖在美国获2020 NextGen供应链解决方案奖
  8. LeetCode:位运算实现加法
  9. SetConsoleCtrlHandler() -- 设置控制台信号处理函数
  10. java数组 arraylist_JAVA 用数组实现 ArrayList
  11. 数学上人可以永生!这是什么原理?
  12. Python凭什么成为增速最快的编程语言:21条调查说明一切
  13. 深入Java集合学习系列:TreeMap实现
  14. 聊聊我的 ACL2020 论文
  15. 使用python把txt文件转为csv文件并且利用自己想要的分割符号
  16. 最新ApkIDE少月版+JAVA环境变量一键配置软件合集
  17. 「玻璃鸟不会归来」读后感
  18. 服务器显示连接网络连接失败是怎么回事儿,app出现网络连接失败是什么原因
  19. 温德姆集团加速麦客达品牌在华扩张;柏悦酒店将进驻长沙;希尔顿惠庭中国首店将在深圳开业 | 美通社头条...
  20. vue3 tsx语法

热门文章

  1. OCP问题debug
  2. linux 如何延迟100ms,Linux延时函数
  3. HC-05蓝牙配对AT指令
  4. 如何:创建 C# 控制台应用程序
  5. 数据可视化~matplotlib阶梯图,直方图
  6. 叠加阶梯图和线图及合并线图和针状图
  7. 《Access 2007开发指南(修订版)》一一2.7 操作查阅向导
  8. 设计模式之 Interpreter(解释器) 通俗理解
  9. 谷歌的云计算是什么样子的?
  10. 如何从VDS明网下载钱包