多个内部背包和健身计算

时间:2016-10-28 00:18:14

标签: c# genetic-algorithm knapsack-problem genetic-programming

抓住我的头,我可能会认为它错了。

基本上它是背包问题但经过修改。你有一套各种重量的物品,你可以把它放在三个背包中,每个背包的容量为20个。

我有代码在麻袋中随机初始化所有项目。这意味着我可以拥有超过20,小于20,等于20的麻袋。问题是这些项目都被添加,因此我的总分对于所有人群都是相同的,因此无法进行变异。

例如,

  • KnapsackA 1得分= 72
  • KnapsackA 2得分= 50
  • KnapsackA 3得分= 10

如果我有四个人口,这意味着我将拥有基因组中的其他物体,背包之间的背包不同,但总数将是相同的。

  • KnapsackB 1得分= 80
  • KnapsackB 2得分= 18
  • KnapsackB 3得分= 34

我只是想到我可以运行一个代码来随机生成一个随机数来为第一代重新分配项目而不是初始化,但我也可能是错的。 。

我如何计算一个独特的分数(评估适应度),这样我可以移除最低的基因组并对剩余的基因组进行变异?

分数 - 容量总是相同的数字。

(x在其他论坛发帖)

1 个答案:

答案 0 :(得分:0)

您可以使用不同的信息编码,以便让物品不在背包中。

例如,我会将一个基因视为一个项目的背包号码,并0表示该项目不在任何背包中:

gene[0] = 1 (item 0 is in knapsack 1)
gene[1] = 0 (item 1 is not in any knapsack) 
gene[2] = 3 (item 2 is in knapsack 3)
gene[3] = 2 (item 3 is in knapsack 2)
gene[4] = 1 (item 4 is in knapsack 1)

因此,个人代表了3个背包的可能解决方案。例如,你可以拥有100个人口。

利用这种信息编码,计算突变和繁殖很容易。

要变异基因,只需为其分配一个新值,即[0,3]范围内的随机数。例如,变异算法:

n = number of genes
mutation_rate = 0.01 // it means a mutation rate of 1%
For i from 0 to n-1
  r = random real number between 0.0 and 1.0
  If(r < mutation_rate) 
    gene[i] of new individual = (random integer number) modulo 4
  Else
    gene[i] of new individual = gene[i] of original individual
  EndIf
EndFor

如果你想实现繁殖,你只需要选择第一个个体的一半基因,以及第二个个体的相反一半的基因。

n = number of genes
For i from 0 to n-1
  r = random integer number
  If(r modulo 2 == 0) 
    gene[i] of new individual = gene[i] of first individual
  Else
    gene[i] of new individual = gene[i] of second individual
  EndIf
EndFor

你可以把两个先例算法合二为一,以便比第一次计算一个孩子更有效地计算两个人的变异孩子,然后改变它。

我不是健身功能方面的专家,但我认为你可以从以下方面中吸取灵感,这是非常基础的,只要考虑到背包必须尽可能多地填充。对于这个适应度函数,适应度值越高,解决方案就越好:

n = number of genes

fitness = 0

weight_noknapsack = 0
weight_knapsack1 = 0
weight_knapsack2 = 0
weight_knapsack3 = 0

For i from 0 to n-1
  Switch gene[i]

    case 0: weight_noknapsack += item[i].weight

    case 1: weight_knapsack1 += item[i].weight

    case 2: weight_knapsack2 += item[i].weight

    case 3: weight_knapsack3 += item[i].weight

  EndSwitch
EndFor

If(weight_knapsack1 <= MAX_WEIGHT_KNAPSACK1)
  fitness += weight_knapsack1
EndIf
If(weight_knapsack2 <= MAX_WEIGHT_KNAPSACK2)
  fitness += weight_knapsack2
EndIf
If(weight_knapsack3 <= MAX_WEIGHT_KNAPSACK3)
  fitness += weight_knapsack3
EndIf

它计算健身,但我认为可能有更好的健身功能。