选课策略——0-1整数规划

Github个人博客

选课策略

问题重述

已知某年数学与统计学院课程结构如图所示。要求至少选两门数学课、三门运筹学课和两门计算机课。

选课策略——0-1整数规划_第1张图片

  1. 为了选修课程总数最少,应学习哪些课程?
  2. 选修课程最少,且学分尽量多,应学习哪些课程?

选修课程总数最少

问题分析

分析上图可知,所属类别为两门的课程均有先修课程要求,可只选择基础课程又达不到课程结业要求。易知基础课程(微积分、线性代数、计算机编程)为必修课程,问题的关键在于如何在已修课程的基础上合理的选择多类别课程。

模型的建立

设 0-1 变量 d i , i = 1 , 2 , ⋯   , 9 d_i,i=1,2,\cdots ,9 di,i=1,2,,9 表示是否选择课程 i i i 。如 d 5 = 1 d_5=1 d5=1 表示选择了应用统计这门课。为完成结业要求与先修课机制,有以下约束条件:

  1. 由最低课程数目标准知:


    KaTeX parse error: No such environment: align at position 9: \begin{̲a̲l̲i̲g̲n̲}̲ d_1+d_2+d_3+d_…

  2. 由先修课机制知:


    KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ d_6 &\le d_7…

记不等式约束矩阵为 A A A ,约束向量为 b b b ,则可建立优化模型

KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ \min \quad S=&…

问题求解

使用 Matlab 的 intlinprog 进行求解得, d 1 = d 2 = d 3 = d 6 = d 7 = d 9 = 1 d_1=d_2=d_3=d_6=d_7=d_9=1 d1=d2=d3=d6=d7=d9=1 ,亦即为了选择课程总数最少,应该学习微积分、线性代数、最优化方法、计算机模拟、计算机编程、数学实验这 6 门课程。

课程数最少且学分尽量多

问题分析

此问题为一个多目标优化问题,但是要求选修课程最少,由 上述模型知必须在只能选 6 门课程的前提下使得学分尽可能大。

模型的改进

由题意知,只需在上述模型中增加一个等式约束

∑ i = 1 9 d i = 6 \sum_{i=1}^9d_i=6 i=19di=6

并将优化函数改为最大化总学分即可,优化模型如下

KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ \max \quad S^{…

其中 s i s_i si 表示每一项课程对应的学分。

模型的求解

利用 Matlab 易得结果得 d 1 = d 2 = d 3 = d 5 = d 6 = d 7 = 1 d_1=d_2=d_3=d_5=d_6=d_7=1 d1=d2=d3=d5=d6=d7=1,亦即应该选择微积分、线性代数、最优化方法、应用统计、计算机模拟、计算机编程这 6 门课程,并且可以达到 22 分的学分。较第 1 部分中的 21 分 更优。

总结

上述模型说明了整数规划的最优解并不一定是唯一的,模型 2 正是在模型 1 的最优解空间中进一步搜索从而得到同时还满足极大化总学分的理想解。事实上模型 2 的最优解解也不唯一,如还可以选择课程 1,2,3,5,7,9 。

程序源代码

最小化课程数目

clear,clc;
%% function
f=ones(1,9);
%% Inequality constraints
A=[-1,-1,-1,-1,-1,0,0,0,0;
    0,0,-1,0,-1,-1,0,-1,-1;
    0,0,0,-1,0,-1,-1,0,-1;
    0,0,0,0,0,1,-1,0,0;
    0,0,0,0,-1,0,0,1,0;
    0,0,0,1,0,0,-1,0,0;
    -1,-1,2,0,0,0,0,0,0;
    -1,-1,0,0,2,0,0,0,0;
    -1,-1,0,0,0,0,0,0,2;];
b=[-2,-3,-2,0,0,0,0,0,0]';
Aeq=[];
beq=[];
intcon=1:9;
%% solve
x=intlinprog(f,intcon,A,b,Aeq,beq,zeros(9,1),ones(9,1))

最小课程数目,极大化总学分

clear,clc;
xuefen_1=[5,4,4,3,4,3,2,2,3];
%% function
f=-ones(1,9).*xuefen_1;
A=[-1,-1,-1,-1,-1,0,0,0,0;
    0,0,-1,0,-1,-1,0,-1,-1;
    0,0,0,-1,0,-1,-1,0,-1;
    0,0,0,0,0,1,-1,0,0;
    0,0,0,0,-1,0,0,1,0;
    0,0,0,1,0,0,-1,0,0;
    -1,-1,2,0,0,0,0,0,0;
    -1,-1,0,0,2,0,0,0,0;
    -1,-1,0,0,0,0,0,0,2;];
b=[-2,-3,-2,0,0,0,0,0,0]';
%% Equality constraints
Aeq=ones(1,9);
beq=6; % the minimum number of courses
intcon=1:9;
[x,fval]=intlinprog(f,intcon,A,b,Aeq,beq,zeros(9,1),ones(9,1))

你可能感兴趣的:(数学建模,数学)