栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

lingo学习笔记(3)分段函数的处理

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

lingo学习笔记(3)分段函数的处理

给出一个分段函数:
c ( x ) = { 10 x 0 ≤ x ≤ 500 1000 + 8 x 5 00 ≤ x ≤ 1000 3000 + 6 x 1 000 ≤ x ≤ 1500 c(x) = begin{cases} 10x &text 0le xle 500 \ 1000+8x &text 500le xle 1000\ 3000+6x &text 1000le xle 1500 end{cases} c(x)=⎩⎪⎨⎪⎧​10x1000+8x3000+6x​0≤x≤500500≤x≤10001000≤x≤1500​

第一种解法:

将采购量x分为三个部分:
x = x 1 + x 2 + x 3 x=x_{1}+x_{2}+x_{3} x=x1​+x2​+x3​
则有:
( x 1 − 500 ) x 2 = 0 ( x 2 − 500 ) x 3 = 0 (x_{1}-500)x_{2}=0 \ (x_{2}-500)x_{3}=0 (x1​−500)x2​=0(x2​−500)x3​=0
x2只有在x1超过500后才不为0,而x1=500时该式为0,故该式始终为0

第二种解法

引入0-1规划,令y1,y2,y3分别为0-1变量,当取1时分别表示以10元,8元,6元购买,则有:
500 y 2 ≤ x 1 ≤ 500 y 1 500 y 3 ≤ x 2 ≤ 500 y 2 x 3 ≤ 500 y 3 500y_{2}le x_{1}le 500y_{1} \ 500y_{3}le x_{2}le 500y_{2} \ x_{3}le 500y_{3} 500y2​≤x1​≤500y1​500y3​≤x2​≤500y2​x3​≤500y3​
y1必然取1,当y2取0时,表示购买量没有超过500,而当y2取1时,说明购买量已超过500,进入下一段

第三种解法

对于任意区间[a,b],其中的一点x,总存在:
x = k 1 a + k 2 b , k 1 + k 2 = 1 x=k_{1}a+k_{2}b,k_{1}+k_{2}=1 x=k1​a+k2​b,k1​+k2​=1
且此段函数能够表示为:
c ( x ) = k 1 c ( a ) + k 2 c ( b ) c(x)=k_{1}c(a)+k_{2}c(b) c(x)=k1​c(a)+k2​c(b)
此处,对于函数的三段,有四个分界点:
b 0 = 0 , b 1 = 500 , b 2 = 1000 , b 3 = 1500 b_{0}=0,b_{1}=500, b_{2}=1000, b_{3}=1500 b0​=0,b1​=500,b2​=1000,b3​=1500
x在哪个区间上?引入0-1变量y1,y2,y3,则:
k 1 ≤ y 1 k 2 ≤ y 1 + y 2 k 3 ≤ y 2 + y 3 k 4 ≤ y 3 k_{1}le y_{1}\ k_{2}le y_{1}+y_{2}\ k_{3}le y_{2}+y_{3}\ k_{4}le y_{3} k1​≤y1​k2​≤y1​+y2​k3​≤y2​+y3​k4​≤y3​
统一表示为:
x = k 1 b 1 + k 2 b 2 + k 3 b 3 c ( x ) = k 1 c ( b 1 ) + k 2 c ( b 2 ) + k 3 c ( b 3 ) k 1 + k 2 + k 3 = 1 x=k_{1}b_{1}+k_{2}b_{2}+k_{3}b_{3}\ c(x)=k_{1}c(b_{1})+k_{2}c(b_{2})+k_{3}c(b_{3})\ k_{1}+k_{2}+k_{3}=1 x=k1​b1​+k2​b2​+k3​b3​c(x)=k1​c(b1​)+k2​c(b2​)+k3​c(b3​)k1​+k2​+k3​=1

sets:
points/1..4/: b, c, y, k;
endsets
data:
n=3;
b=0 500 1000 1500;!函数分段点
c=0 5000 9000 12000;
enddata
Max=4.8*x11 + 4.8*x21 + 5.6*x12 + 5.6*x22 - @sum(points: c*k);
x11+x12 < x + 500;
x21+x22 < 1000;
0.5*x11 - 0.5*x21 > 0;  
0.4*x12 - 0.6*x22 > 0;
@for(points(k)|(k#NE#1)#AND#(k#NE#(n+1)):  !#NE#不等于
	z(k) < y(k-1) + y(k); 
);
z(1)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/854284.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号