CSharp遗传算法求解背包问题
断断续续写了四天,感觉背包问题是最适合了解遗传算法的问题模型
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Bag
{ /// <summary>
/// 背包类
/// </summary>
public class Bag
{
public int Size { get; }
public Bag(int Size)
{
this.Size = Size;
}
}
/// <summary>
/// 货物类
/// </summary>
public class Goods
{
public int Weight { set; get; }
public int Value { set; get; }
/// <summary>
/// 这里随机生成货物属性
/// </summary>
public Goods()
{
this.Weight = APP.Rd.Next() % 200 + 10;
this.Value = APP.Rd.Next() % 1000 + 50;
}
}
/// <summary>
/// 测试结果,编号,总重与总价
/// </summary>
public class Total
{
public int Index { set; get; }
public long TotalWeight { set; get; }
public long TotalValue { get; set; }
public Total(int Index, long TotalWeight, long TotalValue)
{
this.Index = Index;
this.TotalWeight = TotalWeight;
this.TotalValue = TotalValue;
}
} public class Chromosome
{
private bool[] _GeneList = new bool[APP.GoodsNumber];
public bool[] GeneList
{
get
{
return this._GeneList;
}
}
public Chromosome()
{
for (int i = 0; i < APP.GoodsNumber; ++i)
{
this._GeneList[i] = ((APP.Rd.Next() % 2) == 0);
}
}
public Chromosome(Chromosome Father, Chromosome Mother)
{
int CutPoint = (APP.Rd.Next() % (APP.GoodsNumber - 1)) + 1;
Array.Copy(Father._GeneList, 0, this._GeneList, 0, CutPoint);
Array.Copy(Mother._GeneList, CutPoint, this._GeneList, CutPoint, APP.GoodsNumber - CutPoint);
if ((APP.Rd.Next() % APP.Mutation) == 0)
{
var MutationIndexList = APP.RandomSelect(APP.MutationNumber);
foreach (var Index in MutationIndexList)
{
this._GeneList[Index] = !this._GeneList[Index];
}
}
}
} public class Population
{
private Chromosome[] _ChromosomeList = new Chromosome[APP.PopulationSize];
public Chromosome[] ChromosomeList
{
get
{
return this._ChromosomeList;
}
} private Total Test(int Index, Chromosome pChromosome, Goods[] pGoodsList)
{
long WeightSum = 0;
long ValueSum = 0;
int i = 0;
foreach (var BValue in pChromosome.GeneList)
{
if (BValue)
{
WeightSum += pGoodsList[i].Weight;
ValueSum += pGoodsList[i].Value;
}
++i;
}
return new Total(Index, WeightSum, ValueSum);
} public Population()
{
for (int i = 0; i < APP.PopulationSize; ++i)
{
this._ChromosomeList[i] = new Chromosome();
}
} /// <summary>
/// 随机选取一个繁殖对象
/// </summary>
/// <returns></returns>
public int Select()
{
for (int i = 0; i < APP.PopulationSize; ++i)
{
if (APP.Rd.Next() % 2 == 0)
{
return i;
}
}
return APP.PopulationSize - 1;
}
/// <summary>
/// 随机选取两个不同的繁殖对象
/// </summary>
/// <param name="Index1"></param>
/// <param name="Index2"></param>
public void SelectDouble(out int Index1, out int Index2)
{
int I1 = -1, I2 = -1;
while (I1 == I2)
{
I1 = Select();
I2 = Select();
}
Index1 = I1;
Index2 = I2;
} /// <summary>
/// 总群演化方法
/// </summary>
/// <param name="pBag">背包</param>
/// <param name="pGoodsList">商品清单</param>
/// <returns></returns>
public Total[] Evolution(Bag pBag, Goods[] pGoodsList)
{
Total[] TotalList = new Total[this.ChromosomeList.Count()];
for (int i = 0; i < this.ChromosomeList.Count(); ++i)
{
TotalList[i] = Test(i, this.ChromosomeList[i], pGoodsList);
}
var OkList = TotalList.Where(p => p.TotalWeight <= pBag.Size).OrderByDescending(p => p.TotalValue);
var OutList = TotalList.Where(p => p.TotalWeight > pBag.Size).OrderByDescending(p =>
{
double BaseA = (double)p.TotalValue / p.TotalWeight;
double BaseB = ((double)pBag.Size * pBag.Size) / ((double)p.TotalWeight * p.TotalWeight);
return BaseA * BaseB;
}); var NewList = OkList.Concat(OutList).ToArray();
var SubChromosomeList = new Chromosome[APP.PopulationSize]; int FatherIndex;
int MotherIndex;
SelectDouble(out FatherIndex, out MotherIndex);
var Father = this.ChromosomeList[NewList[FatherIndex].Index];
var Mother = this.ChromosomeList[NewList[MotherIndex].Index]; for (int i = 0; i < SubChromosomeList.Count(); ++i)
{
if (i % 2 == 0)
{
SubChromosomeList[i] = new Chromosome(Father, Mother);
}
else
{
SubChromosomeList[i] = new Chromosome(Mother, Father);
SelectDouble(out FatherIndex, out MotherIndex);
Father = this.ChromosomeList[TotalList[FatherIndex].Index];
Mother = this.ChromosomeList[TotalList[MotherIndex].Index];
}
} this._ChromosomeList = SubChromosomeList; return NewList;
}
} public class APP
{
//伪随机数产生器
public static Random Rd = new Random();
//货物个数,对应染色体基因长度
public static int GoodsNumber = 200;
//突变比率倒数
public static int Mutation = 10;
//突变基因数量
public static int MutationNumber = 2;
//种群大小
public static int PopulationSize = 1000; /// <summary>
/// 从列表之中随机选取一定数量的元素
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="pList">源列表</param>
/// <param name="pLen">随机选取的元素列表长度</param>
/// <returns></returns>
public static List<T> GetRandomList<T>(IEnumerable<T> pList, int pLen)
{
if (pLen > pList.Count())
{
pLen = pList.Count();
}
List<T> TmpList = pList.ToList<T>();
List<T> DstList = new List<T>();
for (int i = 0; i < pLen && TmpList.Count() > 1; ++i)
{
int Index = APP.Rd.Next() % TmpList.Count();
DstList.Add(TmpList[Index]);
TmpList.RemoveAt(Index);
}
return DstList;
}
/// <summary>
/// 随机选取一定数量的Index序列
/// </summary>
/// <param name="Num">数量</param>
/// <returns></returns>
public static List<int> RandomSelect(int Num)
{
int[] NumList = new int[APP.GoodsNumber];
for (int i = 0; i < APP.GoodsNumber; ++i)
{
NumList[i] = i;
}
return GetRandomList<int>(NumList, Num);
} public APP()
{
#region 初始化背包与货物列表
Bag MyBag = new Bag(10000);
Goods[] GoodsList = new Goods[APP.GoodsNumber];
for (int i = 0; i < GoodsList.Count(); ++i)
{
GoodsList[i] = new Goods();
}
#endregion #region 创建总群与进行演化
Population iPopulation = new Population();
Total MaxTotal = null;
while (true)
{
var Fst = iPopulation.Evolution(MyBag, GoodsList).First();
if (MaxTotal == null)
{
MaxTotal = Fst;
}
else
{
if (Fst.TotalValue > MaxTotal.TotalValue)
{
MaxTotal = Fst;
}
}
//这里没有保存染色体,仅仅是取出当前总群的最优结果显示
Console.WriteLine("Value: " + MaxTotal.TotalValue + " Weight: " + MaxTotal.TotalWeight);
}
#endregion
}
} public class Program
{
static void Main(string[] args)
{
APP App = new APP();
}
}
}
CSharp遗传算法求解背包问题的更多相关文章
- 利用遗传算法求解TSP问题
转载地址 https://blog.csdn.net/greedystar/article/details/80343841 目录 一.问题描述 二.算法描述 三.求解说明 四.参考资料 五.源代码 ...
- 简单遗传算法求解n皇后问题
版权声明:本文为博主原创文章,转载请注明出处. 先解释下什么是8皇后问题:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法.在不 ...
- 基于遗传算法求解TSP问题(Java界面)
近期为做展示,改写了一个遗传算法求TSP的Java界面版,思路代码和 http://blog.csdn.net/wangqiuyun/article/details/12838903 这篇文章思路是一 ...
- 遗传算法求解TSP问题
package com.louis.tsp; /** * Project Name:GeneticAlgorithm * File Name:Individual.java * Package Nam ...
- 遗传算法求解旅行商(TSP)问题 -- python
参考资料: 遗传算法解决TSP旅行商问题(附:Python实现) 遗传算法详解(GA)(个人觉得很形象,很适合初学者) from itertools import permutations impor ...
- Python动态展示遗传算法求解TSP旅行商问题(转载)
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/jiang425776024/articl ...
- 经典递归问题:0,1背包问题 kmp 用遗传算法来解背包问题,hash表,位图法搜索,最长公共子序列
0,1背包问题:我写笔记风格就是想到哪里写哪里,有很多是旧的也没删除,代码内部可能有很多重复的东西,但是保证能运行出最后效果 '''学点高大上的遗传算法''' '''首先是Np问题的定义: npc:多 ...
- 遗传算法的C语言实现(二)-----以求解TSP问题为例
上一次我们使用遗传算法求解了一个较为复杂的多元非线性函数的极值问题,也基本了解了遗传算法的实现基本步骤.这一次,我再以经典的TSP问题为例,更加深入地说明遗传算法中选择.交叉.变异等核心步骤的实现.而 ...
- 遗传算法的简单应用-巡回旅行商(TSP)问题的求解
上篇我们用遗传算法求解了方程,其中用到的编码方式是二进制的编码,实现起来相对简单很多, 就连交配和变异等操作也是比较简单,但是对于TSP问题,就稍微复杂一点,需要有一定的策略, 才能较好的实现. 这次 ...
随机推荐
- The.Glory.of.Innovation 创新之路3放飞好奇
教育最重要的就是 问题不在于教他各种学问,而在于培养他爱好学问的兴趣,而且在这种兴趣充分增长起来的时候,教他以研究学问的方法. ———— 卢梭 如何辨识不同的观点, 老师考查的重点不在于学生 ...
- IntelliJ IDEA 中自动生成 serialVersionUID 的方法
as, idea plugin中搜如下关键字,并安装该插件: GenerateSerialVersionUID 如上图所示,创建一个类并实现Serializable接口,然后按alt+Enter键,即 ...
- 一条bash命令,清除指定的网络接口列表
在K8S的安装配置过程, 由于不断的测试, 会不断的生成各式各样的虚拟网络接口. 那么,不重新安装之前,清除前次产生的这些垃圾接口, 不让它们影响下次的测试,是很有必要的. 如何快速删除呢? 如下命令 ...
- C#学习-面向对象
封装:把客观事物封装成类,并将类内部的实现隐藏,以保证数据的完整性: 比如年龄赋值为负数,就是个例子.当我们把类的字段定义为公共类型时,外部对象可以直接对类内部的数据进行操作,此时无法对这些操作进行一 ...
- JDK1.7 Update14 HotSpot虚拟机GC收集器
在测试服务器上使用如下命令可以查看当前使用的 GC收集器,当然不止这一个命令可以看到,还有其他一些方式 第三列”=”表示第四列是参数的默认值,而”:=” 表明了参数被用户或者JVM赋值了 [csii@ ...
- [转] meta标签的作用及整理
meta的标签的使用是我在前端学习中曾经困惑过一段时间的问题.一方面不是很了解meta标签的用途,另一方面是对于meta标签里的属性和值不是懂,也不知道从哪里冒出来的,所以这篇文章专门整理下meta标 ...
- [转] AES,SHA1,DES,RSA,MD5区别
AES:更快,兼容设备,安全级别高: SHA1:公钥后处理回传 DES:本地数据,安全级别低 RSA:非对称加密,有公钥和私钥 MD5:防篡改 相关: 公开密钥加密(英语:public-key cry ...
- thinkphp5验证码使用
simple 控制器中 /** * 生成验证码 * @param viod */ public function verify() { $captcha = new \think\captcha\Ca ...
- Response.AddHeader小结
(一)文件下载,指定默认名 Response.AddHeader("content-type","application/x-msdownload"); Res ...
- Docker Client (another java docker client api)
前一篇提到了docker-java,这里介绍另一个docker client 库,Docker Client 版本兼容 兼容17.03.1~ce - 17.12.1~ce (点 [here][1]查看 ...