【数学建模】储药柜的设计

news2024/11/26 16:27:19

2014高教社杯全国大学生数学建模竞赛D题目

题目描述

储药柜的结构类似于书橱,通常由若干个横向隔板和竖向隔板将储药柜分割成若干个储药槽(如图1所示)。为保证药品分拣的准确率,防止发药错误,一个储药槽内只能摆放同一种药品。药品在储药槽中的排列方式如图2所示。药品从后端放入,从前端取出。一个实际储药柜中药品的摆放情况如图3所示。
为保证药品在储药槽内顺利出入,要求药盒与两侧竖向隔板之间、与上下两层横向隔板之间应留2mm的间隙,同时还要求药盒在储药槽内推送过程中不会出现并排重叠、侧翻或水平旋转。在忽略横向和竖向隔板厚度的情况下,建立数学模型,给出下面几个问题的解决方案。

  1. 药房内的盒装药品种类繁多,药盒尺寸规格差异较大,附件1中给出了一些药盒的规格。请利用附件1的数据,给出竖向隔板间距类型最少的储药柜设计方案,包括类型的数量和每种类型所对应的药盒规格。
  2. 药盒与两侧竖向隔板之间的间隙超出2mm的部分可视为宽度冗余。增加竖向隔板的间距类型数量可以有效地减少宽度冗余,但会增加储药柜的加工成本,同时降低了储药槽的适应能力。设计时希望总宽度冗余尽可能小,同时也希望间距的类型数量尽可能少。仍利用附件1的数据,给出合理的竖向隔板间距类型的数量以及每种类型对应的药品编号。
  3. 考虑补药的便利性,储药柜的宽度不超过2.5m、高度不超过2m,传送装置占用的高度为0.5m,即储药柜的最大允许有效高度为1.5m。药盒与两层横向隔板之间的间隙超出2mm的部分可视为高度冗余,平面冗余=高度冗余×宽度冗余。在问题2计算结果的基础上,确定储药柜横向隔板间距的类型数量,使得储药柜的总平面冗余量尽可能地小,且横向隔板间距的类型数量也尽可能地少。
  4. 附件2给出了每一种药品编号对应的最大日需求量。在储药槽的长度为1.5m、每天仅集中补药一次的情况下,请计算每一种药品需要的储药槽个数。为保证药房储药满足需求,根据问题3中单个储药柜的规格,计算最少需要多少个储药柜。

提出关键点

一个储药槽内只能摆放同一种药品。
要求药盒与两侧竖向隔板之间、与上下两层横向隔板之间应留2mm的间隙,同时还要求药盒在储药槽内推送过程中不会出现并排重叠、侧翻或水平旋转。在忽略横向和竖向隔板厚度的情况下,建立数学模型。

建立数学模型

模型一:储药槽和药盒关系模型

已知药盒长宽高分别是 a , b , c a,b,c a,b,c毫米,设计储药槽长宽高分别是 x , y , z x,y,z x,y,z毫米。

要求药盒在储药槽内推送过程中不会出现:

1.并排重叠 ,

即储药槽高度不能高于两倍的药盒高,储药槽宽度不能高于两倍的药盒宽
{ z < 2 c y < 2 b \begin{cases}z\lt 2c\\y \lt 2b\end{cases} {z<2cy<2b

2.侧翻,

在这里插入图片描述

如上图,红色为药盒,分两种情况,情况一:绿色为储药槽;情况二:黑色为储药槽。

假设考虑的是不能完全侧翻情况,那么模型为:
{ z < b 2 + c 2 + M ( 1 − μ ) y < b 2 + c 2 + M ( 1 − v ) μ + v ≥ 1 μ , v ∈ {   0 , 1   } \begin{cases} z\lt \sqrt{b^2+c^2} + M(1-\mu)\\ y \lt \sqrt{b^2+c^2} + M(1-v)\\ \mu + v \ge 1\\ \mu,v \in \set{0,1} \end{cases} z<b2+c2 +M(1μ)y<b2+c2 +M(1v)μ+v1μ,v{0,1}
其中 M M M为定值,并且 M ≥ b 2 + c 2 M \ge \sqrt{b^2+c^2} Mb2+c2

考虑实际情况,假设侧翻角度超过 45 45 45度即为侧翻
观察上图,下方绿线和红线夹角为45度时为极限角度可以得到:
y = 2 2 ( a + b ) y = \dfrac{\sqrt{2}}{2}(a+b) y=22 (a+b)
并且侧翻时侧面解刨图来看,长方形的一个点会和储药槽底部接触,模拟物体旋转过程发现当长方形的对角线和底部垂直时候,整个物体触顶高度达到最高值。也就是说如果储药槽设计高度低于物体的对角线长度物体将无法侧翻
可以得到模型:
{ z < b 2 + c 2 + M ( 1 − μ ) y < 2 2 ( a + b ) + M ( 1 − v ) μ + v ≥ 1 μ , v ∈ {   0 , 1   } \begin{cases} z\lt \sqrt{b^2+c^2} + M(1-\mu)\\ y \lt \dfrac{\sqrt{2}}{2}(a+b) + M(1-v)\\ \mu + v \ge 1\\ \mu,v \in \set{0,1} \end{cases} z<b2+c2 +M(1μ)y<22 (a+b)+M(1v)μ+v1μ,v{0,1}
其中 M M M为定值,并且 M ≥ max ⁡ ( b 2 + c 2 , 2 2 ( a + b ) ) M \ge \max{(\sqrt{b^2+c^2},\dfrac{\sqrt{2}}{2}(a+b))} Mmax(b2+c2 ,22 (a+b))

将45度推广为 α \alpha α度(准确来讲是物体抬起的角度),模型将变为
{ z < b 2 + c 2 + M ( 1 − μ ) y < b cos ⁡ α + c cos ⁡ ( π 2 − α ) + M ( 1 − v ) μ + v ≥ 1 μ , v ∈ {   0 , 1   } \begin{cases} z\lt \sqrt{b^2+c^2} + M(1-\mu)\\ y \lt b\cos{\alpha}+c\cos{(\dfrac{\pi}{2}-\alpha)} + M(1-v)\\ \mu + v \ge 1\\ \mu,v \in \set{0,1} \end{cases} z<b2+c2 +M(1μ)y<bcosα+ccos(2πα)+M(1v)μ+v1μ,v{0,1}
其中 M M M为定值,并且 M ≥ max ⁡ ( b 2 + c 2 , b cos ⁡ α + c cos ⁡ ( π 2 − α ) ) M \ge \max{(\sqrt{b^2+c^2},b\cos{\alpha}+c\cos{(\dfrac{\pi}{2}-\alpha)})} Mmax(b2+c2 ,bcosα+ccos(2πα))

3.水平旋转 ,

实际上和侧翻的情况一类似,只是宽和高变成了长和宽
设物体水平旋转了 α \alpha α度就称为水平旋转了
y < b cos ⁡ α + a cos ⁡ ( π 2 − α ) y \lt b\cos{\alpha}+a\cos{(\dfrac{\pi}{2}-\alpha)} y<bcosα+acos(2πα)

要求药盒与两侧竖向隔板之间、与上下两层横向隔板之间应留2mm的间隙

{ z ≥ c + 2 y ≥ b + 2 \begin{cases} z\ge c+2\\ y \ge b + 2 \end{cases} {zc+2yb+2

建立解决问题的数学模型

问题一

假设已知所有盒装药品所需的储药槽宽度 x x x约束,和所有盒装药品总数 N N N
a i ≤ x i < b i , i = 1 , 2 , 3... N a_i\le x_i\lt b_i , i = 1,2,3...N aixi<bi,i=1,2,3...N

那么

解决模型一:

y j y_j yj为第 j j j种竖向隔板间距类型大小
g i j g_{ij} gij表示第 i i i种药盒可不可以放进第 j j j种药槽里面

{ min ⁡ ∑ j = 1 M f j a i g i j ≤ y j f j < b i + M ′ ( 1 − g i j ) ∑ j = 1 M g i j ≥ 1 f j , g i j ∈ {   0 , 1   } i = 1 , 2 , 3 , . . . N , j = 1 , 2 , 3 , . . . M \begin{cases} \min \displaystyle\sum_{j=1}^M f_j\\ a_ig_{ij} \le y_jf_j \lt b_i+M'(1-g_{ij})\\ \displaystyle\sum_{j=1}^M g_{ij} \ge 1\\ f_j , g_{ij} \in \set{0,1}\\ i = 1,2,3,...N , j = 1,2,3,...M \end{cases} minj=1Mfjaigijyjfj<bi+M(1gij)j=1Mgij1fj,gij{0,1}i=1,2,3,...N,j=1,2,3,...M
M ′ ≥ max ⁡ i = 1 N b i M'\ge \max_{i=1}^Nb_i Mmaxi=1Nbi
这种模型就要先求出所有可能为竖向隔板间距类型的大小

解决模型二:

我们可以得出第 i i i种药盒能放进的药槽都得出来,记做 d i j d_{ij} dij
如果 d i j = 1 d_{ij}=1 dij=1表示得出第 i i i种药盒能放进第 j j j种药槽,反之不能
{ min ⁡ ∑ j = 1 M f j ∑ j = 1 M d i j f j > 1 f j , g i j ∈ {   0 , 1   } i = 1 , 2 , 3 , . . . N , j = 1 , 2 , 3 , . . . M \begin{cases} \min \displaystyle\sum_{j=1}^M f_j\\ \displaystyle\sum_{j=1}^M d_{ij}f_j \gt 1\\ f_j , g_{ij} \in \set{0,1}\\ i = 1,2,3,...N , j = 1,2,3,...M \end{cases} minj=1Mfjj=1Mdijfj>1fj,gij{0,1}i=1,2,3,...N,j=1,2,3,...M

解决模型三:

{ a i g i ≤ x j < b i g i max ⁡ ∑ i = 1 N g i f j , g i ∈ {   0 , 1   } i = 1 , 2 , 3 , . . . N , j = 1 , 2 , 3 , . . . M \begin{cases} a_ig_i \le x_j \lt b_ig_i\\ \max \displaystyle\sum_{i=1}^N g_i\\ f_j , g_i \in \set{0,1}\\ i = 1,2,3,...N , j = 1,2,3,...M \end{cases} aigixj<bigimaxi=1Ngifj,gi{0,1}i=1,2,3,...N,j=1,2,3,...M
不断增加 M M M的值,直到答案 ∑ i = 1 N g i ≥ N \displaystyle\sum_{i=1}^N g_i \ge N i=1NgiN,就求出其中一组解

问题二

简单来说就是要求所有 药盒与两侧竖向隔板之间的间隙超出2mm的部分 之和最小
利用上一问的模型三:
{ a i g i ≤ x j < b i g i max ⁡ ∑ i = 1 N g i f j , g i ∈ {   0 , 1   } i = 1 , 2 , 3 , . . . N , j = 1 , 2 , 3 , . . . M \begin{cases} a_ig_i \le x_j \lt b_ig_i\\ \max \displaystyle\sum_{i=1}^N g_i\\ f_j , g_i \in \set{0,1}\\ i = 1,2,3,...N , j = 1,2,3,...M \end{cases} aigixj<bigimaxi=1Ngifj,gi{0,1}i=1,2,3,...N,j=1,2,3,...M
其中 M M M的临界值 M 1 M_1 M1在问题一已经求出
所以就可以规定 M ≥ M 1 M\ge M_1 MM1

同问题一的假设:
假设已知所有盒装药品所需的储药槽宽度 x x x约束,和所有盒装药品总数 N N N
a i ≤ x i < b i , i = 1 , 2 , 3... N a_i\le x_i\lt b_i , i = 1,2,3...N aixi<bi,i=1,2,3...N
观察模型一:储药槽和药盒关系模型中的所有约束条件,发现 a i a_i ai只能是药盒的宽度加两毫米,为已知量
那么药盒与两侧竖向隔板之间的间隙超出2mm的部分可以表示为:
x i − a i x_i - a_i xiai
因为还要约束两侧竖向隔板之间的间隙的种类,所以
m i n ∑ j = 1 M ∑ i = 1 N x j − a i , x j ≥ a i min \displaystyle\sum_{j=1}^M\displaystyle\sum_{i=1}^N x_j-a_i , x_j\ge a_i minj=1Mi=1Nxjai,xjai
得到

模型一:

{ m i n ∑ j = 1 M ∑ i = 1 N x j − a i , x j ≥ a i a i g i ≤ x j < b i g i ∑ i = 1 N g i = N f j , g i ∈ {   0 , 1   } i = 1 , 2 , 3 , . . . N , j = 1 , 2 , 3 , . . . M \begin{cases} min \displaystyle\sum_{j=1}^M\displaystyle\sum_{i=1}^N x_j-a_i , x_j\ge a_i\\ a_ig_i \le x_j \lt b_ig_i\\ \displaystyle\sum_{i=1}^N g_i = N\\ f_j , g_i \in \set{0,1}\\ i = 1,2,3,...N , j = 1,2,3,...M \end{cases} minj=1Mi=1Nxjai,xjaiaigixj<bigii=1Ngi=Nfj,gi{0,1}i=1,2,3,...N,j=1,2,3,...M

当然这种模型求解/优化都不容易
如果换个思路,在问题一已知有多少种两侧竖向隔板之间的间隙的种类了,并且求出了对应药盒对应的两侧竖向隔板之间的间隙,那么就可以把两侧竖向隔板之间的间隙相同的都分为一组,最后形成 M M M组药盒和对应的两侧竖向隔板之间的间隙

只需要每一组对应的两侧竖向隔板之间的间隙都取最小值,那么 M M M组加起来也就是所有 药盒与两侧竖向隔板之间的间隙超出2mm的部分 之和最小

那么

模型二:

{ a i g i ≤ x j < b i g i ∑ i = 1 N g i = N a i k j ≤ x j < b i k j m i n ∑ i = 1 N x j − a i k j , j = 1 , 2 , 3 , . . . M f j , g i , k j ∈ {   0 , 1   } i = 1 , 2 , 3 , . . . N , j = 1 , 2 , 3 , . . . M \begin{cases} a_ig_i \le x_j \lt b_ig_i\\ \displaystyle\sum_{i=1}^N g_i = N\\ a_ik_j \le x_j \lt b_ik_j\\ min \displaystyle\sum_{i=1}^N x_j-a_ik_j ,j = 1,2,3,...M\\ f_j , g_i , k_j\in \set{0,1}\\ i = 1,2,3,...N , j = 1,2,3,...M \end{cases} aigixj<bigii=1Ngi=Naikjxj<bikjmini=1Nxjaikj,j=1,2,3,...Mfj,gi,kj{0,1}i=1,2,3,...N,j=1,2,3,...M

发现模型二实际上就是模型一的改进,模型二利用0/1变量 k j k_j kj去定位药盒所对应的两侧竖向隔板之间的间隙的同时也是在解决模型一中$ x_j\ge a_i$条件

由此就可以得到一个"通用"的解决手段:
如果出现当 x i ≤ a j x_i\le a_j xiaj时候某个式子 f ( x i , a j ) f(x_i,a_j) f(xi,aj)才执行/成立
f ( x i , a j ) , x i ≤ a j f(x_i,a_j) , x_i\le a_j f(xi,aj),xiaj
假设为 u = { f ( x i , a j ) , x i ≤ a j 0 , x i > a j u = \begin{cases}f(x_i,a_j) , x_i\le a_j\\0,x_i\gt a_j\end{cases} u={f(xi,aj),xiaj0,xi>aj
这时候引入一个0/1变量 k i k_i ki
$ \begin{cases}u =f(x_i,a_jk_i)\x_i\le a_jk_j\end{cases}$
但要注意:
1. f ( x i , a j ) 改成 f ( x i , a j k i ) f(x_i,a_j)改成f(x_i,a_jk_i) f(xi,aj)改成f(xi,ajki)时候不能改变题目本意
2.之所以是 f ( x i , a j k i ) f(x_i,a_jk_i) f(xi,ajki)而不是 f ( x i , a j ) k i f(x_i,a_j)k_i f(xi,aj)ki,是因为最好不出现决策变量和决策变量相乘
3.如果非要用 f ( x i , a j ) k i f(x_i,a_j)k_i f(xi,aj)ki,需要将决策变量和决策变量相乘的模型重新转化为线性模型

问题三

储药柜的宽度不超过2.5m、高度不超过2m,传送装置占用的高度为0.5m,即储药柜的最大允许有效高度为1.5m。
假设已知所有盒装药品所需的储药槽宽度 x x x约束,和所有盒装药品总数 N N N
a i < x i < b i , i = 1 , 2 , 3... N a_i\lt x_i\lt b_i , i = 1,2,3...N ai<xi<bi,i=1,2,3...N
假设已知所有盒装药品所需的储药槽高度度 y y y约束,和所有盒装药品总数 N N N
c i < y i < d i , i = 1 , 2 , 3... N c_i\lt y_i\lt d_i , i = 1,2,3...N ci<yi<di,i=1,2,3...N
则:
储药柜的宽度不超过2.5m
∑ i = 1 N x i ≤ 2500 \displaystyle\sum_{i=1}^N x_i \le 2500 i=1Nxi2500
储药柜的最大允许有效高度为1.5m
∑ i = 1 N y i ≤ 1500 \displaystyle\sum_{i=1}^N y_i \le 1500 i=1Nyi1500

在问题二中宽度冗余为 ∑ i = 1 N x j − a i k j \displaystyle\sum_{i=1}^N x_j-a_ik_j i=1Nxjaikj
同理我们也可以得到高度冗余为 ∑ i = 1 N y j − c i l j \displaystyle\sum_{i=1}^N y_j-c_il_j i=1Nyjcilj
平面冗余=高度冗余×宽度冗余
即平面冗余为 ( ∑ i = 1 N x j − a i k j ) ( ∑ i = 1 N y j − c i l j ) (\displaystyle\sum_{i=1}^N x_j-a_ik_j)(\displaystyle\sum_{i=1}^N y_j-c_il_j) (i=1Nxjaikj)(i=1Nyjcilj)

要使横向隔板间距的类型数量也尽可能地少。我们可以利用问题一中的模型求出横向隔板间距的类型数量临界值 M 2 M_2 M2

{ a i g i ≤ x j < b i g i ∑ i = 1 N g i = N c i o i ≤ y k < d i o i ∑ i = 1 N o i = N a i h j ≤ x j < b i h j a i l k ≤ y k < b i l k m i n ( ∑ i = 1 N x j − a i h j ) ( ∑ i = 1 N y k − c i l k ) , j = 1 , 2 , 3 , . . . M f j , g i , h j , o i , l k ∈ {   0 , 1   } i = 1 , 2 , 3 , . . . N , j = 1 , 2 , 3 , . . . M , k = 1 , 2 , 3 , . . . K \begin{cases} a_ig_i \le x_j \lt b_ig_i\\ \displaystyle\sum_{i=1}^N g_i = N\\ c_io_i\le y_k\lt d_io_i\\ \displaystyle\sum_{i=1}^N o_i = N\\ a_ih_j \le x_j \lt b_ih_j\\ a_il_k \le y_k \lt b_il_k\\ min (\displaystyle\sum_{i=1}^N x_j-a_ih_j)(\displaystyle\sum_{i=1}^N y_k-c_il_k) ,j = 1,2,3,...M\\ f_j , g_i , h_j , o_i ,l_k\in \set{0,1}\\ i = 1,2,3,...N , j = 1,2,3,...M ,k = 1,2,3,...K \end{cases} aigixj<bigii=1Ngi=Ncioiyk<dioii=1Noi=Naihjxj<bihjailkyk<bilkmin(i=1Nxjaihj)(i=1Nykcilk),j=1,2,3,...Mfj,gi,hj,oi,lk{0,1}i=1,2,3,...N,j=1,2,3,...M,k=1,2,3,...K

问题四

已知第 i i i种药品编号对应的最大日需求量为 e i e_i ei和该药盒长度为 z i z_i zi毫米
在储药槽的长度为1.5m、每天仅集中补药一次的情况下,计算每一种药品需要的储药槽个数 x i x_i xi.
2 ∗ 1500 e i ∗ z i ≤ x i \dfrac{2*1500}{e_i*z_i}\le x_i eizi21500xi
这样就得出了所有药品对应所需储药槽个数 x i x_i xi
在问题三中得出了一个药柜中所有横向(竖向)隔板间距的类型大小以及数量
同问题二从模型一到模型二的分组思路,每个药品其实对应一个组别
可以得出第 i i i种药品对应的组号 m i m_i mi,并且也知道组号 m i m_i mi对应的储药槽的个数 σ m i \sigma_{m_i} σmi

假设有 M M M组, x j i x_{ji} xji表示第 j j j组第 i i i种药品对应所需储药槽个数, σ j \sigma_j σj表示一个药柜种组号 j j j对应的储药槽的个数。
得到问题模型:
m i n ( m a x j = 1 M ∑ i = 1 N j x j i σ j ) min(max_{j=1}^M \dfrac{\displaystyle\sum_{i=1}^{N_j} x_{ji}}{\sigma_j}) min(maxj=1Mσji=1Njxji)

解决问题

问题一

模型一

在此之前已经初始化药盒长宽高分别放进数组length,weight,height中
处理一下数据,得到模型一的 a i a_i ai b i b_i bi,并且得到 y j y_j yj的所以可能取值
C++

void solve(){
    outFile.open("data.xlsx");
    if (!outFile.is_open()) {
        std::cerr << "无法打开文件" << std::endl;
        return ;
    }
    set<double>y;
    double a[N],b[N];
    for(int i=1;i<=1919;i++){
        a[i] = 2+weight[i];
        y.insert(a[i]);
        b[i] = min({2.0*weight[i],sqrt(weight[i]*weight[i] + height[i]*height[i]), sqrt(weight[i]*weight[i] + length[i]*length[i])});
        y.insert(b[i]);
    }
    for(int i=1;i<=1919;i++){
        outFile << a[i] << '\t';
    }
    outFile << '\n';
    for(int i=1;i<=1919;i++){
        outFile << b[i] << '\t';
    }
    outFile << '\n';
    for(auto x:y){
        outFile << x << '\t';
    }
}

这样我们就完成了上面讲的先求出所有可能为竖向隔板间距类型的大小

线性化:

void solve(){
    outFile.open("data.xlsx");
    if (!outFile.is_open()) {
        std::cerr << "无法打开文件" << std::endl;
        return ;
    }
    set<double>y;
    double a[N],b[N];
    for(int i=1;i<=1919;i++){
        a[i] = 2+weight[i];
        y.insert(a[i]);
        b[i] = min({2.0*weight[i],sqrt(weight[i]*weight[i] + height[i]*height[i]), sqrt(weight[i]*weight[i] + length[i]*length[i])});
        if((long long)b[i] == b[i])b[i]--;
        b[i] = (int)b[i];
    }
    for(int i=1;i<=1919;i++){
        outFile << a[i] << '\t';
    }
    outFile << '\n';
    for(int i=1;i<=1919;i++){
        outFile << b[i] << '\t';
    }
    outFile << '\n';
    cout << (int)y.size();
    for(auto x:y){
        outFile << x << '\t';
    }
}

解决模型一:

sets:
 aa/1..1919/:a,b;
 bb/1..47/:f,y;
 cc(aa,bb):g;
endsets
data:
 a=@ole("D:\homewrok\建模\储药柜的设计问题\data.xls",A1:BUU1);
 b=@ole("D:\homewrok\建模\储药柜的设计问题\data.xls",A2:BUU2);
 y=@ole("D:\homewrok\建模\储药柜的设计问题\data.xls",A3:AU3);
enddata
min=@sum(bb(j):f(j));
@for(aa(i):@for(bb(j):a(i)*g(i,j)<y(j)*f(j)));
@for(aa(i):@for(bb(j):b(i)+58*(1-g(i,j))>y(j)*f(j)));
@for(aa(i):@sum(bb(j):g(i,j))>1);
@for(cc(i,j):@bin(g(i,j)));
@for(bb(j):@bin(f(j)));

解得

  Global optimal solution found.
  Objective value:                              4.000000
  Objective bound:                              4.000000
  Infeasibilities:                              0.000000
  Extended solver steps:                               0
  Total solver iterations:                            13


                       Variable           Value        Reduced Cost
                          F( 7)        1.000000            1.000000
                         F( 22)        1.000000            1.000000
                         F( 33)        1.000000            1.000000
                         F( 47)        1.000000            1.000000

对应类型长度为:
18,33,44,58

模型二求解

C++预处理数据

void solve(){
    outFile.open("data2.xlsx");
    if (!outFile.is_open()) {
        std::cerr << "无法打开文件" << std::endl;
        return ;
    }
    double a[N],b[N];
    for(int i=1;i<=1919;i++){
        a[i] = 2+weight[i];
        b[i] = min({2.0*weight[i],sqrt(weight[i]*weight[i] + height[i]*height[i]), sqrt(weight[i]*weight[i] + length[i]*length[i])});
        b[i] = (int)(b[i]+0.5);
    }
    for(int i=1;i<=1919;i++){
        for(int j=12;j<=58;j++){
            int flag = a[i]<j&&j<b[i];
            outFile << flag << '\t';
        }
        outFile << '\n';
    }
}
sets:
 aa/1..1919/:;
 bb/1..47/:f;
 cc(aa,bb):d;
endsets
data:
 d = @ole("D:\homewrok\建模\储药柜的设计问题\data2.xls",A1:AU1919);
enddata
min=@sum(bb(j):f(j));
@for(aa(i):@sum(bb(j):d(i,j)*f(j))>1);
@for(bb(j):@bin(f(j)));

得到

  Global optimal solution found.
  Objective value:                              4.000000
  Objective bound:                              4.000000
  Infeasibilities:                              0.000000
  Extended solver steps:                               0
  Total solver iterations:                            58


                       Variable           Value        Reduced Cost
                          F( 8)        1.000000            1.000000
                         F( 23)        1.000000            1.000000
                         F( 33)        1.000000            1.000000
                         F( 47)        1.000000            1.000000

对应类型长度为:
19,34,44,58

纯编程求解:

问题一转换:给出1919个范围 [ a i , b i ] [a_i,b_i] [ai,bi],问最少取多少个点使得每个范围内至少有一个点

vector<pair<int,int>>v(1919);
void solve(){
    double a[N],b[N];
    for(int i=1;i<=1919;i++){
        a[i] = 2+weight[i];
        b[i] = min({2.0*weight[i],sqrt(weight[i]*weight[i] + height[i]*height[i]), sqrt(weight[i]*weight[i] + length[i]*length[i])});
        if((long long)b[i] == b[i])b[i]--;
        b[i] = (int)b[i];
        v[i-1].first = a[i]  , v[i-1].second=b[i];
    }
}
void solve2(){//贪心 每次未放入取上限最小的上限
    sort(v.begin(),v.end(),[&](pair<int,int> x, pair<int,int> y){
       if(x.first == y.first)return x.second < y.second;
       return x.first < y.first;
    });
    int cnt = 0 , start=0 , end;
    vector<pair<int,int>>ans;
    while(cnt < 1919){
        double x = v[start].second;
        cnt++;
        bool flag = false;
        for(int i=start;i<v.size();i++){
            if(v[i].first>x){
                end = i-1;
                flag = true;
                break;
            }
        }
        if(flag)
            ans.push_back(make_pair(v[end].first,x));
        else{
            ans.push_back(make_pair(v[v.size()-1].first,x));
            break;
        }
        start = end+1;
    }
    cout << cnt << '\n';//答案 4 个
    for(auto x:ans){
        cout << x.first << ',' << x.second << '\n';
    }
}

问题二转换:给出1919个范围 [ a i , b i ] [a_i,b_i] [ai,bi],给出最少取多少个点使得每个范围内至少有一个点,求全部可能取值
注:不知道最小值为4,当新题做

vector<int>ans2;
int now_ans = 47;
int k=0;//不同取值种类数
int main() {
    solve();
    sort(v.begin(),v.end(),[&](pair<int,int> x, pair<int,int> y){
        if(x.first == y.first)return x.second < y.second;
        return x.first < y.first;
    });
    solve2_f(0,1);
    cout << k;
    return 0;
}
void solve2_f(int start ,  int cnt){
    if(cnt > now_ans)return ;
    for(int i = v[start].second;i>=v[start].first;i--){
        bool flag = false;
        for(int j=start;j<v.size();j++){
            if(v[j].first>i){
                flag = true;
                ans2.push_back(i);
                solve2_f(j,cnt+1);
                ans2.pop_back();
                break;
            }
        }
        if(!flag){
            ans2.push_back(i);
            for(auto x:ans2)cout << x << ' ';
            cout << '\n';
            ans2.pop_back();
            now_ans = min(now_ans,cnt);
        }
    }
}

问题二

纯编程求解:

在上一个问题基础上加个冗余计算即可

void solve2_f(int start ,  int cnt ,int rong){
    if(cnt > now_ans)return ;
    for(int i = v[start].second;i>=v[start].first;i--){
        bool flag = false;
        int sum = 0;
        for(int j=start;j<v.size();j++){
            if(v[j].first>i){
                flag = true;
                ans2.push_back(i);
                solve2_f(j,cnt+1,rong + sum);
                ans2.pop_back();
                break;
            }
            sum += i-v[j].first;
        }
        if(!flag){
            k++;
            ans2.push_back(i);
            for(auto x:ans2)cout << x << ' ';
            cout << "rong:" << rong;
            cout << '\n';
            ans2.pop_back();
            now_ans = min(now_ans,cnt);
        }
    }
}

求解得到最小的有

19 33 44 60 rong:10875
19 33 44 59 rong:10875
19 33 44 58 rong:10875

答案为19,33,44,58
因为最后一个取值没有计算冗余度,明显取58时候冗余度是最少的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1688914.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络版本计算器的实现】

本章重点 理解应用层的作用, 初识HTTP协议理解传输层的作用, 深入理解TCP的各项特性和机制对整个TCP/IP协议有系统的理解对TCP/IP协议体系下的其他重要协议和技术有一定的了解学会使用一些分析网络问题的工具和方法 ⭐注意!! 注意!! 注意!! 本课是网络编程的理论基础.是一个服务…

IT廉连看——UniApp——事件绑定

IT廉连看——UniApp——事件绑定 这是我们上节课最终的样式&#xff1b; 一、现在我有这样一个需求&#xff0c;当我点击“生在国旗下&#xff0c;长在春风里”它的颜色由红色变为蓝色&#xff0c;该怎么操作&#xff1f; 这时候我们需要一个事件的绑定&#xff0c;绑定一个单…

设计模式—23种设计模式重点 表格梳理

设计模式的核心在于提供了相关的问题的解决方案&#xff0c;使得人们可以更加简单方便的复用成功的设计和体系结构。 按照设计模式的目的可以分为三大类。创建型模式与对象的创建有关&#xff1b;结构型模式处理类或对象的组合&#xff1b;行为型模式对类或对象怎样交互和怎样…

pytorch-20_1 LSTM在股价数据集上的预测实战

LSTM在股价数据集上的预测实战 使用完整的JPX赛题数据&#xff0c;并向大家提供完整的lstm流程。 导包 import numpy as np #数据处理 import pandas as pd #数据处理 import matplotlib as mlp import matplotlib.pyplot as plt #绘图 from sklearn.preprocessing import M…

Unreal Engine5 Landscape地形材质无法显示加载

UE5系列文章目录 文章目录 UE5系列文章目录前言一、解决办法 前言 在使用ue5做地形编辑的时候&#xff0c;明明刚才就保存的Landscape地形完全消失不见&#xff0c;或者是地形的材质不见了。重新打开UE5发现有时候能解决&#xff0c;但大多数时候还是没有解决&#xff0c;我下…

有效的变位词

如果哈希表的键的取值范围是固定的&#xff0c;并且范围不是很大&#xff0c;则可以用数组来模拟哈希表。数组的下标和哈希表的键相对应&#xff0c;而数组的值和哈希表的值相对应。 英文小写字母只有26个&#xff0c;因此可以用一个数组来模拟哈希表。 class Solution {publi…

中国主要城市房价指数数据集(2011-2024)

数据来源&#xff1a;东方财富网 时间跨度&#xff1a;2011年1月 - 2024年4月 数据范围&#xff1a;中国主要城市 包含指标&#xff1a; 日期、城市 新建商品住宅价格指数-同比 新建商品住宅价格指数-环比 新建商品住宅价格指数-定基 二手住宅价格指数-环比 二手住宅价格指…

CS西电高悦计网课设——校园网设计

校园网设计 一&#xff0c;需求分析 所有主机可以访问外网 主机可以通过域名访问Web服务器 为网络配置静态或者动态路由 图书馆主机通过DHCP自动获取IP参数 为办公楼划分VLAN 为所有设备分配合适的IP地址和子网掩码&#xff0c;IP地址的第二个字节使用学号的后两位。 二…

学习平台|基于Springboot+vue的学习平台系统的设计与实现(源码+数据库+文档)

学习平台系统 目录 基于Springboot&#xff0b;vue的学习平台系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3学生功能模块 4教师功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八…

基于STM32实现智能风扇控制系统

目录 文章主题环境准备智能风扇控制系统基础代码示例&#xff1a;实现智能风扇控制系统 PWM控制风扇速度温度传感器数据读取串口通信控制应用场景&#xff1a;智能家居与环境调节问题解决方案与优化收尾与总结 1. 文章主题与命名 文章主题 本教程将详细介绍如何在STM32嵌入式…

layui扩展件(xm-select)实现下拉框

layui扩展件&#xff08;xm-select&#xff09;实现下拉框 扩展组件 xm-select 效果图 html代码 <div class"layui-inline"><label class"layui-form-label">职位</label><div class"layui-input-inline" style"wid…

你以为的私域是真正的私域嘛??你的私域流量真的属于你嘛?

大家好 我是一个软件开发公司的产品经理 专注私域电商行业7年有余 您的私域流量是真正的属于你自己嘛&#xff1f; 私域的定义 私域的界定&#xff1a;一个互联网私有数据&#xff08;资产&#xff09;积蓄的载体。这个载体的数据权益私有&#xff0c;且具备用户规则制定权…

法那科机器人M-900iA维修主要思路

发那科工业机器人是当今制造业中常用的自动化设备之一&#xff0c;而示教器是发那科机器人操作和维护的重要组成部分。 一、FANUC机械手示教器故障分类 1. 硬件故障 硬件故障通常是指发那科机器人M-900iA示教器本身的硬件问题&#xff0c;如屏幕损坏、按键失灵、电源故障等。 2…

脆皮之“字符函数与字符串函数”宝典

hello&#xff0c;大家好呀&#xff0c;感觉我之前有偷偷摸鱼了&#xff0c;今天又开始学习啦。加油&#xff01;&#xff01;&#xff01; 文章目录 1. 字符分类函数2. 字符转换函数3. strlen的使用和模拟实现3.1 strlen 的使用3.1 strlen 的模拟1.计算器方法2.指针-指针的方…

【Spring Security + OAuth2】身份认证

Spring Security OAuth2 第一章 Spring Security 快速入门 第二章 Spring Security 自定义配置 第三章 Spring Security 前后端分离配置 第四章 Spring Security 身份认证 第五章 Spring Security 授权 第六章 OAuth2 1、用户认证信息 1.1、基本概念 在Spring Security框架中…

Axure RP 9 for Mac/win:重新定义交互原型设计的未来

在当今数字化时代&#xff0c;交互原型设计已成为产品开发中不可或缺的一环。Axure RP 9作为一款功能强大的交互原型设计软件&#xff0c;凭借其出色的性能和用户友好的界面&#xff0c;赢得了广大设计师的青睐。 Axure RP 9不仅支持Mac和Windows两大主流操作系统&#xff0c;…

PMP 学习笔记(增量更新中)

PMP 作为最流行的项目管理方法论&#xff0c;是项目管理领域的对话基础&#xff0c;了解它能帮助我理解术语和规范的管理过程&#xff0c;也许后面会考一个认证。感谢 B 站视频《 PMP 认证考试课程最新完整免费课程零基础一次通过项目管理 PMP 考试》的作者&#xff0c;我通过它…

【简单介绍下深度神经网络】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

人工智能应用-实验7-胶囊网络分类minst手写数据集

文章目录 &#x1f9e1;&#x1f9e1;实验内容&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;代码&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;分析结果&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;实验总结&#x1f9e1;&#x1f9e1; &#x1f9…