如何在遗传算法中设置变量约束条件

如何在遗传算法中设置变量约束条件,第1张

1、首先打开matlab软件,在“APP(应用)”选项卡中选择“Optimization(优化)”工具箱。

2、在优化工具箱中选择遗传算法,图中标出的选项。

3、遗传算法界面有一部分是输入约束条件的,根据题目输入对应的参数即可。

4、在命令行窗口将以上矩阵用变量代替,则在工具箱中直接输入变量即可。

5、最后将已经定义好的参数,直接输入在对应的位置即可。

你用round肯定不可能限制这些变量为整数的。

对于混合整数线性规划问题(MILP),2014a引入了一个函数intlinprog可用于求解。

intlinprog(c,1:8,A,B,[],[],zeros(8,1))

另外,可以用遗传算法求解混合整数非线性规划问题(当然,用于线性规划也可以)

ga(@(x)c*x(:),8,A,B,[],[],zeros(1,8),[],[],1:8)

但是,用两种方法得到的结果都是无法找到可行解(也就是,无法满足所有的约束条件,与目标函数无关),请题主还是检查一下问题自身是否有误。

为验证上述结果的正确性,我把模型转为Lingo格式,用Lingo求解:

max=x1

12*x1+0*x2+10*x3+0*x4+0*x5+0*x6+0*x7+0*x8<=47

-12*x1+0*x2+10*x3+0*x4+0*x5+0*x6+0*x7+0*x8<=-37

18*x1+0*x2+10*x3+8*x4+0*x5+0*x6+0*x7+0*x8<=88

-18*x1+0*x2+-10*x3+-8*x4+0*x5+0*x6+0*x7+0*x8<=-80

0*x1+12*x2+0*x3+0*x4+10*x5+0*x6+0*x7+0*x8<=31

0*x1+-12*x2+0*x3+0*x4+-10*x5+0*x6+0*x7+0*x8<=-21

0*x1+18*x2+0*x3+0*x4+10*x5+8*x6+0*x7+0*x8<=81

0*x1+-18*x2+0*x3+0*x4+-10*x5+-8*x6+0*x7+0*x8<=73

0*x1+6*x2+0*x3+0*x4+10*x5+8*x6+8*x7+0*x8<=131

0*x1+-6*x2+0*x3+0*x4+-10*x5+-8*x6+-8*x7+0*x8<=-123

18*x1+18*x2+10*x3+8*x4+-10*x5+8*x6+8*x7+8*x8<=252

-18*x1+-18*x2+-10*x3+-8*x4+10*x5+-8*x6+-8*x7+-8*x8<=-244

1*x1+1*x2+-0.2*x3+-0.2*x4+-0.2*x5+-0.2*x6+-0.2*x7+-0.2*x8<=0

@gin(x1)

@gin(x2)

@gin(x3)

@gin(x4)

@gin(x5)

@gin(x6)

@gin(x7)

@gin(x8)

其中目标函数是随便写的,因为现在主要是要验证约束条件存在冲突,导致找不到可行解,与目标函数无关。验证的结果同样是找不到可行解(81. NO FEASIBLE SOLUTION FOUND)。

对于这种情况,Lingo提供了Debug功能,可以帮助用户找出导致不可行的最小约束集合,得到的结果如下:

  Constraints and bounds that cause an infeasibility:

  Sufficient Rows:

  (Dropping any sufficient row will make the model feasible.)

   [_3] - 12 * X1 + 10 * X3 <= - 37 

   [_2] 12 * X1 + 10 * X3 <= 47 

  Sufficient Variable Bounds:

  (Dropping any sufficient bound will make the model feasible.)

   X3 >=  0

也就是说,去掉第一个或第二个约束都可以解决可行解的问题,或者去掉x3>=0的变量限制也可以(我试了一下,好像这个不起作用?)。总之还是请题主好好check一下题目的条件。

这个一定要用遗传算法来做吗?目前我能找到的遗传算法程序似乎都不能处理整数约束。自己编程的话工作量比较大,我倒是有点兴趣,但实在没时间做。

建议可以试一下2014a新引入的函数intlinprog,可以处理混合整数线性规划问题(Mixed-integer linear programming,MILP)。

对这个特定的例子来说,可以对X6~X10引入一个简单的变换:Xi=3*xi-8,其中xi=0~6取整数。

最终求得的结果是

x =

  -10.0000

    9.0000

   10.0000

  -10.0000

    9.0000

   -8.0000

   -8.0000

   10.0000

    4.0000

   -8.0000

目标函数值为-36。

参考代码:

A = [0 0 1 1 1 3 3 0 0 0]

b = 20

Ae = [1 0 1 0 1 0 3 0 3 0 0 1 0 1 1 3 0 3 0 3]

be = [21 26]

lb = [-10*ones(5,1) zeros(5,1)]

ub = [10*ones(5,1) 6*ones(5,1)]

f = [1 0 0 1 0 3 0 0 0 3]

intcon = 6:10

x = intlinprog(f,intcon,A,b,Ae,be,lb,ub)

f*x-16

x(6:10) = 3*x(6:10) - 8


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11736158.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存