二维优化问题——背包问题

背包问题要求从 n 个物品中选取若干装入一个背包中。每个物品有体积(vi>0)和价值(pi),每个箱子有体积限制(V_{0}>0)。目标是寻找最优的将物品分配到背包的方案,使每个背包中物品的体积之和不超过容积限制,而价值最大。

max z(x)=\sum_{i=1}^{n}p_{i}(x_{i})(1)

(2)

式中,xi=1表示物品i被装入箱子,xi=0则表示物品i未被选中。

从下面物品中选取若干,在总体积不超过1000情况下使总价值最大。

序号

1

2

3

4

5

6

7

8

9

10

体积

80

82

85

70

72

70

66

50

55

25

价值

220

208

198

192

180

180

165

162

160

158

序号

11

12

13

14

15

16

17

18

19

20

体积

50

55

40

48

50

32

22

60

30

32

价值

155

130

125

122

120

118

115

110

105

101

序号

21

22

23

24

25

26

27

28

29

30

体积

40

38

35

32

25

28

30

22

50

30

价值

100

100

98

96

95

90

88

82

80

77

序号

31

32

33

34

35

36

37

38

39

40

体积

45

30

60

50

20

65

20

25

30

10

价值

75

73

72

70

69

66

65

63

60

58

序号

41

42

43

44

45

46

47

48

49

50

体积

20

25

15

10

10

10

4

4

2

1

价值

56

50

30

20

15

10

8

5

3

1

遗传编码考虑为长度为50,表示某个物品是否被选中,变异交叉可正常进行。

%v=profit
v=xlsread('H:\original\profit_and_weight.xlsx','sheet1','A1:A50');
V0=1500;
%种群大小
popsize=4;
%二进制编码长度
chromlength=50;
%交叉概率
pc = 0.3;
%变异概率
pm = 0.001;
%初始种群
pop = initpop(popsize,chromlength);
hanshuzhi=zeros(100,1);
% [bestindividual,bestfit] = best(pop,fitvalue);
%  hanshuzhi(1)=bestfit;
for i = 1:100
    %计算适应度值(函数值)
    [objvalue,newpop1] = cal_objvalue(pop,V0,v);
    fitvalue = objvalue;
    %选择操作
    newpop = selection(newpop1,fitvalue);
    %交叉操作
    newpop = crossover(newpop,pc);
    %变异操作
    newpop = mutation(newpop,pm);
    %寻找最优解
    [bestindividual,bestfit] = best(pop,fitvalue);
    hanshuzhi(i)=bestfit;
    %更新种群 
    t=1;
    for j=1:popsize
        if fitvalue(j)==bestfit
            newpop(t)=pop(j);
            t=t+1;
        end
    end
    pop = newpop;
    
    
if i==100
number=1:50;
lastindividual=number(bestindividual==1);
end
end
extra_space=ones(100,1);
for i=1:100
    extra_space(i)=V0-hanshuzhi(i);
end
fprintf('The best individual is --->>%2f\n');
lastindividual
fprintf('The best value is --->>%5.2f\n',min(extra_space));
figure
plot(extra_space(:),'k');

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

古道西风瘦码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值