python目标函数教程 pycharm目标检测

万字教你如何用 Python 实现线性规划

想象一下,您有一个线性方程组和不等式系统。这样的系统通常有许多可能的解决方案。线性规划是一组数学和计算工具,可让您找到该系统的特定解,该解对应于某些其他线性函数的最大值或最小值。

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册虚拟主机、营销软件、网站建设、定州网站维护、网站推广。

混合整数线性规划是 线性规划 的扩展。它处理至少一个变量采用离散整数而不是连续值的问题。尽管乍一看混合整数问题与连续变量问题相似,但它们在灵活性和精度方面具有显着优势。

整数变量对于正确表示自然用整数表示的数量很重要,例如生产的飞机数量或服务的客户数量。

一种特别重要的整数变量是 二进制变量 。它只能取 零 或 一 的值,在做出是或否的决定时很有用,例如是否应该建造工厂或者是否应该打开或关闭机器。您还可以使用它们来模拟逻辑约束。

线性规划是一种基本的优化技术,已在科学和数学密集型领域使用了数十年。它精确、相对快速,适用于一系列实际应用。

混合整数线性规划允许您克服线性规划的许多限制。您可以使用分段线性函数近似非线性函数、使用半连续变量、模型逻辑约束等。它是一种计算密集型工具,但计算机硬件和软件的进步使其每天都更加适用。

通常,当人们试图制定和解决优化问题时,第一个问题是他们是否可以应用线性规划或混合整数线性规划。

以下文章说明了线性规划和混合整数线性规划的一些用例:

随着计算机能力的增强、算法的改进以及更多用户友好的软件解决方案的出现,线性规划,尤其是混合整数线性规划的重要性随着时间的推移而增加。

解决线性规划问题的基本方法称为,它有多种变体。另一种流行的方法是。

混合整数线性规划问题可以通过更复杂且计算量更大的方法来解决,例如,它在幕后使用线性规划。这种方法的一些变体是,它涉及使用 切割平面 ,以及。

有几种适用于线性规划和混合整数线性规划的合适且众所周知的 Python 工具。其中一些是开源的,而另一些是专有的。您是否需要免费或付费工具取决于问题的规模和复杂性,以及对速度和灵活性的需求。

值得一提的是,几乎所有广泛使用的线性规划和混合整数线性规划库都是以 Fortran 或 C 或 C++ 原生和编写的。这是因为线性规划需要对(通常很大)矩阵进行计算密集型工作。此类库称为求解器。Python 工具只是求解器的包装器。

Python 适合围绕本机库构建包装器,因为它可以很好地与 C/C++ 配合使用。对于本教程,您不需要任何 C/C++(或 Fortran),但如果您想了解有关此酷功能的更多信息,请查看以下资源:

基本上,当您定义和求解模型时,您使用 Python 函数或方法调用低级库,该库执行实际优化工作并将解决方案返回给您的 Python 对象。

几个免费的 Python 库专门用于与线性或混合整数线性规划求解器交互:

在本教程中,您将使用SciPy和PuLP来定义和解决线性规划问题。

在本节中,您将看到线性规划问题的两个示例:

您将在下一节中使用 Python 来解决这两个问题。

考虑以下线性规划问题:

你需要找到X和Ÿ使得红色,蓝色和黄色的不平等,以及不平等X 0和ÿ 0,是满意的。同时,您的解决方案必须对应于z的最大可能值。

您需要找到的自变量(在本例中为 x 和 y )称为 决策变量 。要最大化或最小化的决策变量的函数(在本例中为 z) 称为 目标函数 、 成本函数 或仅称为 目标 。您需要满足的 不等式 称为 不等式约束 。您还可以在称为 等式约束 的约束中使用方程。

这是您如何可视化问题的方法:

红线代表的功能2 X + Ý = 20,和它上面的红色区域示出了红色不等式不满足。同样,蓝线是函数 4 x + 5 y = 10,蓝色区域被禁止,因为它违反了蓝色不等式。黄线是 x + 2 y = 2,其下方的黄色区域是黄色不等式无效的地方。

如果您忽略红色、蓝色和黄色区域,则仅保留灰色区域。灰色区域的每个点都满足所有约束,是问题的潜在解决方案。该区域称为 可行域 ,其点为 可行解 。在这种情况下,有无数可行的解决方案。

您想最大化z。对应于最大z的可行解是 最优解 。如果您尝试最小化目标函数,那么最佳解决方案将对应于其可行的最小值。

请注意,z是线性的。你可以把它想象成一个三维空间中的平面。这就是为什么最优解必须在可行区域的 顶点 或角上的原因。在这种情况下,最佳解决方案是红线和蓝线相交的点,稍后您将看到。

有时,可行区域的整个边缘,甚至整个区域,都可以对应相同的z值。在这种情况下,您有许多最佳解决方案。

您现在已准备好使用绿色显示的附加等式约束来扩展问题:

方程式 x + 5 y = 15,以绿色书写,是新的。这是一个等式约束。您可以通过向上一张图像添加相应的绿线来将其可视化:

现在的解决方案必须满足绿色等式,因此可行区域不再是整个灰色区域。它是绿线从与蓝线的交点到与红线的交点穿过灰色区域的部分。后一点是解决方案。

如果插入x的所有值都必须是整数的要求,那么就会得到一个混合整数线性规划问题,可行解的集合又会发生变化:

您不再有绿线,只有沿线的x值为整数的点。可行解是灰色背景上的绿点,此时最优解离红线最近。

这三个例子说明了 可行的线性规划问题 ,因为它们具有有界可行区域和有限解。

如果没有解,线性规划问题是 不可行的 。当没有解决方案可以同时满足所有约束时,通常会发生这种情况。

例如,考虑如果添加约束x + y 1会发生什么。那么至少有一个决策变量(x或y)必须是负数。这与给定的约束x 0 和y 0相冲突。这样的系统没有可行的解决方案,因此称为不可行的。

另一个示例是添加与绿线平行的第二个等式约束。这两行没有共同点,因此不会有满足这两个约束的解决方案。

一个线性规划问题是 无界的 ,如果它的可行区域是无界,将溶液不是有限。这意味着您的变量中至少有一个不受约束,可以达到正无穷大或负无穷大,从而使目标也无限大。

例如,假设您采用上面的初始问题并删除红色和黄色约束。从问题中删除约束称为 放松 问题。在这种情况下,x和y不会在正侧有界。您可以将它们增加到正无穷大,从而产生无限大的z值。

在前面的部分中,您研究了一个与任何实际应用程序无关的抽象线性规划问题。在本小节中,您将找到与制造业资源分配相关的更具体和实用的优化问题。

假设一家工厂生产四种不同的产品,第一种产品的日产量为x ₁,第二种产品的产量为x 2,依此类推。目标是确定每种产品的利润最大化日产量,同时牢记以下条件:

数学模型可以这样定义:

目标函数(利润)在条件 1 中定义。人力约束遵循条件 2。对原材料 A 和 B 的约束可以从条件 3 和条件 4 中通过对每种产品的原材料需求求和得出。

最后,产品数量不能为负,因此所有决策变量必须大于或等于零。

与前面的示例不同,您无法方便地将其可视化,因为它有四个决策变量。但是,无论问题的维度如何,原理都是相同的。

在本教程中,您将使用两个Python 包来解决上述线性规划问题:

SciPy 设置起来很简单。安装后,您将拥有开始所需的一切。它的子包 scipy.optimize 可用于线性和非线性优化。

PuLP 允许您选择求解器并以更自然的方式表述问题。PuLP 使用的默认求解器是COIN-OR Branch and Cut Solver (CBC)。它连接到用于线性松弛的COIN-OR 线性规划求解器 (CLP)和用于切割生成的COIN-OR 切割生成器库 (CGL)。

另一个伟大的开源求解器是GNU 线性规划工具包 (GLPK)。一些著名且非常强大的商业和专有解决方案是Gurobi、CPLEX和XPRESS。

除了在定义问题时提供灵活性和运行各种求解器的能力外,PuLP 使用起来不如 Pyomo 或 CVXOPT 等替代方案复杂,后者需要更多的时间和精力来掌握。

要学习本教程,您需要安装 SciPy 和 PuLP。下面的示例使用 SciPy 1.4.1 版和 PuLP 2.1 版。

您可以使用pip以下方法安装两者:

您可能需要运行pulptest或sudo pulptest启用 PuLP 的默认求解器,尤其是在您使用 Linux 或 Mac 时:

或者,您可以下载、安装和使用 GLPK。它是免费和开源的,适用于 Windows、MacOS 和 Linux。在本教程的后面部分,您将看到如何将 GLPK(除了 CBC)与 PuLP 一起使用。

在 Windows 上,您可以下载档案并运行安装文件。

在 MacOS 上,您可以使用 Homebrew:

在 Debian 和 Ubuntu 上,使用apt来安装glpk和glpk-utils:

在Fedora,使用dnf具有glpk-utils:

您可能还会发现conda对安装 GLPK 很有用:

安装完成后,可以查看GLPK的版本:

有关详细信息,请参阅 GLPK 关于使用Windows 可执行文件和Linux 软件包进行安装的教程。

在本节中,您将学习如何使用 SciPy优化和求根库进行线性规划。

要使用 SciPy 定义和解决优化问题,您需要导入scipy.optimize.linprog():

现在您已经linprog()导入,您可以开始优化。

让我们首先解决上面的线性规划问题:

linprog()仅解决最小化(而非最大化)问题,并且不允许具有大于或等于符号 ( ) 的不等式约束。要解决这些问题,您需要在开始优化之前修改您的问题:

引入这些更改后,您将获得一个新系统:

该系统与原始系统等效,并且将具有相同的解决方案。应用这些更改的唯一原因是克服 SciPy 与问题表述相关的局限性。

下一步是定义输入值:

您将上述系统中的值放入适当的列表、元组或NumPy 数组中:

注意:请注意行和列的顺序!

约束左侧和右侧的行顺序必须相同。每一行代表一个约束。

来自目标函数和约束左侧的系数的顺序必须匹配。每列对应一个决策变量。

下一步是以与系数相同的顺序定义每个变量的界限。在这种情况下,它们都在零和正无穷大之间:

此语句是多余的,因为linprog()默认情况下采用这些边界(零到正无穷大)。

注:相反的float("inf"),你可以使用math.inf,numpy.inf或scipy.inf。

最后,是时候优化和解决您感兴趣的问题了。你可以这样做linprog():

参数c是指来自目标函数的系数。A_ub和b_ub分别与不等式约束左边和右边的系数有关。同样,A_eq并b_eq参考等式约束。您可以使用bounds提供决策变量的下限和上限。

您可以使用该参数method来定义要使用的线性规划方法。有以下三种选择:

linprog() 返回具有以下属性的数据结构:

您可以分别访问这些值:

这就是您获得优化结果的方式。您还可以以图形方式显示它们:

如前所述,线性规划问题的最优解位于可行区域的顶点。在这种情况下,可行区域只是蓝线和红线之间的绿线部分。最优解是代表绿线和红线交点的绿色方块。

如果要排除相等(绿色)约束,只需删除参数A_eq并b_eq从linprog()调用中删除:

解决方案与前一种情况不同。你可以在图表上看到:

在这个例子中,最优解是红色和蓝色约束相交的可行(灰色)区域的紫色顶点。其他顶点,如黄色顶点,具有更高的目标函数值。

您可以使用 SciPy 来解决前面部分所述的资源分配问题:

和前面的例子一样,你需要从上面的问题中提取必要的向量和矩阵,将它们作为参数传递给.linprog(),然后得到结果:

结果告诉您最大利润是1900并且对应于x ₁ = 5 和x ₃ = 45。在给定条件下生产第二和第四个产品是没有利润的。您可以在这里得出几个有趣的结论:

opt.statusis0和opt.successis True,说明优化问题成功求解,最优可行解。

SciPy 的线性规划功能主要用于较小的问题。对于更大和更复杂的问题,您可能会发现其他库更适合,原因如下:

幸运的是,Python 生态系统为线性编程提供了几种替代解决方案,这些解决方案对于更大的问题非常有用。其中之一是 PuLP,您将在下一节中看到它的实际应用。

PuLP 具有比 SciPy 更方便的线性编程 API。您不必在数学上修改您的问题或使用向量和矩阵。一切都更干净,更不容易出错。

像往常一样,您首先导入您需要的内容:

现在您已经导入了 PuLP,您可以解决您的问题。

您现在将使用 PuLP 解决此系统:

第一步是初始化一个实例LpProblem来表示你的模型:

您可以使用该sense参数来选择是执行最小化(LpMinimize或1,这是默认值)还是最大化(LpMaximize或-1)。这个选择会影响你的问题的结果。

一旦有了模型,就可以将决策变量定义为LpVariable类的实例:

您需要提供下限,lowBound=0因为默认值为负无穷大。该参数upBound定义了上限,但您可以在此处省略它,因为它默认为正无穷大。

可选参数cat定义决策变量的类别。如果您使用的是连续变量,则可以使用默认值"Continuous"。

您可以使用变量x和y创建表示线性表达式和约束的其他 PuLP 对象:

当您将决策变量与标量相乘或构建多个决策变量的线性组合时,您会得到一个pulp.LpAffineExpression代表线性表达式的实例。

注意:您可以增加或减少变量或表达式,你可以乘他们常数,因为纸浆类实现一些Python的特殊方法,即模拟数字类型一样__add__(),__sub__()和__mul__()。这些方法用于像定制运营商的行为+,-和*。

类似地,您可以将线性表达式、变量和标量与运算符 ==、=以获取表示模型线性约束的纸浆.LpConstraint实例。

注:也有可能与丰富的比较方法来构建的约束.__eq__(),.__le__()以及.__ge__()定义了运营商的行为==,=。

考虑到这一点,下一步是创建约束和目标函数并将它们分配给您的模型。您不需要创建列表或矩阵。只需编写 Python 表达式并使用+=运算符将它们附加到模型中:

在上面的代码中,您定义了包含约束及其名称的元组。LpProblem允许您通过将约束指定为元组来向模型添加约束。第一个元素是一个LpConstraint实例。第二个元素是该约束的可读名称。

设置目标函数非常相似:

或者,您可以使用更短的符号:

现在您已经添加了目标函数并定义了模型。

注意:您可以使用运算符将 约束或目标附加到模型中,+=因为它的类LpProblem实现了特殊方法.__iadd__(),该方法用于指定 的行为+=。

对于较大的问题,lpSum()与列表或其他序列一起使用通常比重复+运算符更方便。例如,您可以使用以下语句将目标函数添加到模型中:

它产生与前一条语句相同的结果。

您现在可以看到此模型的完整定义:

模型的字符串表示包含所有相关数据:变量、约束、目标及其名称。

注意:字符串表示是通过定义特殊方法构建的.__repr__()。有关 的更多详细信息.__repr__(),请查看Pythonic OOP 字符串转换:__repr__vs__str__ .

最后,您已准备好解决问题。你可以通过调用.solve()你的模型对象来做到这一点。如果要使用默认求解器 (CBC),则不需要传递任何参数:

.solve()调用底层求解器,修改model对象,并返回解决方案的整数状态,1如果找到了最优解。有关其余状态代码,请参阅LpStatus[]。

你可以得到优化结果作为 的属性model。该函数value()和相应的方法.value()返回属性的实际值:

model.objective持有目标函数model.constraints的值,包含松弛变量的值,以及对象x和y具有决策变量的最优值。model.variables()返回一个包含决策变量的列表:

如您所见,此列表包含使用 的构造函数创建的确切对象LpVariable。

结果与您使用 SciPy 获得的结果大致相同。

注意:注意这个方法.solve()——它会改变对象的状态,x并且y!

您可以通过调用查看使用了哪个求解器.solver:

输出通知您求解器是 CBC。您没有指定求解器,因此 PuLP 调用了默认求解器。

如果要运行不同的求解器,则可以将其指定为 的参数.solve()。例如,如果您想使用 GLPK 并且已经安装了它,那么您可以solver=GLPK(msg=False)在最后一行使用。请记住,您还需要导入它:

现在你已经导入了 GLPK,你可以在里面使用它.solve():

该msg参数用于显示来自求解器的信息。msg=False禁用显示此信息。如果要包含信息,则只需省略msg或设置msg=True。

您的模型已定义并求解,因此您可以按照与前一种情况相同的方式检查结果:

使用 GLPK 得到的结果与使用 SciPy 和 CBC 得到的结果几乎相同。

一起来看看这次用的是哪个求解器:

正如您在上面用突出显示的语句定义的那样model.solve(solver=GLPK(msg=False)),求解器是 GLPK。

您还可以使用 PuLP 来解决混合整数线性规划问题。要定义整数或二进制变量,只需传递cat="Integer"或cat="Binary"到LpVariable。其他一切都保持不变:

在本例中,您有一个整数变量并获得与之前不同的结果:

Nowx是一个整数,如模型中所指定。(从技术上讲,它保存一个小数点后为零的浮点值。)这一事实改变了整个解决方案。让我们在图表上展示这一点:

如您所见,最佳解决方案是灰色背景上最右边的绿点。这是两者的最大价值的可行的解决方案x和y,给它的最大目标函数值。

GLPK 也能够解决此类问题。

现在你可以使用 PuLP 来解决上面的资源分配问题:

定义和解决问题的方法与前面的示例相同:

在这种情况下,您使用字典 x来存储所有决策变量。这种方法很方便,因为字典可以将决策变量的名称或索引存储为键,将相应的LpVariable对象存储为值。列表或元组的LpVariable实例可以是有用的。

上面的代码产生以下结果:

如您所见,该解决方案与使用 SciPy 获得的解决方案一致。最有利可图的解决方案是每天生产5.0第一件产品和45.0第三件产品。

让我们把这个问题变得更复杂和有趣。假设由于机器问题,工厂无法同时生产第一种和第三种产品。在这种情况下,最有利可图的解决方案是什么?

现在您有另一个逻辑约束:如果x ₁ 为正数,则x ₃ 必须为零,反之亦然。这是二元决策变量非常有用的地方。您将使用两个二元决策变量y ₁ 和y ₃,它们将表示是否生成了第一个或第三个产品:

除了突出显示的行之外,代码与前面的示例非常相似。以下是差异:

这是解决方案:

事实证明,最佳方法是排除第一种产品而只生产第三种产品。

就像有许多资源可以帮助您学习线性规划和混合整数线性规划一样,还有许多具有 Python 包装器的求解器可用。这是部分列表:

其中一些库,如 Gurobi,包括他们自己的 Python 包装器。其他人使用外部包装器。例如,您看到可以使用 PuLP 访问 CBC 和 GLPK。

您现在知道什么是线性规划以及如何使用 Python 解决线性规划问题。您还了解到 Python 线性编程库只是本机求解器的包装器。当求解器完成其工作时,包装器返回解决方案状态、决策变量值、松弛变量、目标函数等。

python遗传算法目标函数怎么编

一、遗传算法介绍

遗传算法是通过模拟大自然中生物进化的历程,来解决问题的。大自然中一个种群经历过若干代的自然选择后,剩下的种群必定是适应环境的。把一个问题所有的解看做一个种群,经历过若干次的自然选择以后,剩下的解中是有问题的最优解的。当然,只能说有最优解的概率很大。这里,我们用遗传算法求一个函数的最大值。

f(x) = 10 * sin( 5x ) + 7 * cos( 4x ), 0 = x = 10

1、将自变量x进行编码

取基因片段的长度为10, 则10位二进制位可以表示的范围是0到1023。基因与自变量转变的公式是x = b2d(individual) * 10 / 1023。构造初始的种群pop。每个个体的基因初始值是[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]

2、计算目标函数值

根据自变量与基因的转化关系式,求出每个个体的基因对应的自变量,然后将自变量代入函数f(x),求出每个个体的目标函数值。

3、适应度函数

适应度函数是用来评估个体适应环境的能力,是进行自然选择的依据。本题的适应度函数直接将目标函数值中的负值变成0. 因为我们求的是最大值,所以要使目标函数值是负数的个体不适应环境,使其繁殖后代的能力为0.适应度函数的作用将在自然选择中体现。

4、自然选择

自然选择的思想不再赘述,操作使用轮盘赌算法。其具体步骤:

假设种群中共5个个体,适应度函数计算出来的个体适应性列表是fitvalue = [1 ,3, 0, 2, 4] ,totalvalue = 10 , 如果将fitvalue画到圆盘上,值的大小表示在圆盘上的面积。在转动轮盘的过程中,单个模块的面积越大则被选中的概率越大。选择的方法是将fitvalue转化为[1 , 4 ,4 , 6 ,10], fitvalue / totalvalue = [0.1 , 0.4 , 0.4 , 0.6 , 1.0] . 然后产生5个0-1之间的随机数,将随机数从小到大排序,假如是[0.05 , 0.2 , 0.7 , 0.8 ,0.9],则将0号个体、1号个体、4号个体、4号个体、4号个体拷贝到新种群中。自然选择的结果使种群更符合条件了。

5、繁殖

假设个体a、b的基因是

a = [1, 0, 0, 0, 0, 1, 1, 1, 0, 0]

b = [0, 0, 0, 1, 1, 0, 1, 1, 1, 1]

这两个个体发生基因交换的概率pc = 0.6.如果要发生基因交换,则产生一个随机数point表示基因交换的位置,假设point = 4,则:

a = [1, 0, 0, 0, 0, 1, 1, 1, 0, 0]

b = [0, 0, 0, 1, 1, 0, 1, 1, 1, 1]

交换后为:

a = [1, 0, 0, 0, 1, 0, 1, 1, 1, 1]

b = [0, 0, 0, 1, 0, 1, 1, 1, 0, 0]

6、突变

遍历每一个个体,基因的每一位发生突变(0变为1,1变为0)的概率为0.001.突变可以增加解空间

二、代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

def b2d(b): #将二进制转化为十进制 x∈[0,10] t = 0 for j in range(len(b)): t += b[j] * (math.pow(2, j)) t = t * 10 / 1023 return tpopsize = 50 #种群的大小#用遗传算法求函数最大值:#f(x)=10*sin(5x)+7*cos(4x) x∈[0,10]chromlength = 10 #基因片段的长度pc = 0.6 #两个个体交叉的概率pm = 0.001; #基因突变的概率results = [[]]bestindividual = []bestfit = 0fitvalue = []tempop = [[]]pop = [[0, 1, 0, 1, 0, 1, 0, 1, 0, 1] for i in range(popsize)]for i in range(100): #繁殖100代 objvalue = calobjvalue(pop) #计算目标函数值 fitvalue = calfitvalue(objvalue); #计算个体的适应值 [bestindividual, bestfit] = best(pop, fitvalue) #选出最好的个体和最好的函数值 results.append([bestfit,b2d(bestindividual)]) #每次繁殖,将最好的结果记录下来 selection(pop, fitvalue) #自然选择,淘汰掉一部分适应性低的个体 crossover(pop, pc) #交叉繁殖 mutation(pop, pc) #基因突变 results.sort() print(results[-1]) #打印函数最大值和对应的

来自CODE的代码片

GA.py

1

2

3

4

5

6

7

8

9

def best(pop, fitvalue): #找出适应函数值中最大值,和对应的个体 px = len(pop) bestindividual = [] bestfit = fitvalue[0] for i in range(1,px): if(fitvalue[i] bestfit): bestfit = fitvalue[i] bestindividual = pop[i] return [bestindividual, bestfit]

来自CODE的代码片

best.py

1

2

3

4

5

6

7

8

9

10

11

def calfitvalue(objvalue):#转化为适应值,目标函数值越大越好,负值淘汰。 fitvalue = [] temp = 0.0 Cmin = 0; for i in range(len(objvalue)): if(objvalue[i] + Cmin 0): temp = Cmin + objvalue[i] else: temp = 0.0 fitvalue.append(temp) return fitvalue

来自CODE的代码片

calfitvalue.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

import mathdef decodechrom(pop): #将种群的二进制基因转化为十进制(0,1023) temp = []; for i in range(len(pop)): t = 0; for j in range(10): t += pop[i][j] * (math.pow(2, j)) temp.append(t) return tempdef calobjvalue(pop): #计算目标函数值 temp1 = []; objvalue = []; temp1 = decodechrom(pop) for i in range(len(temp1)): x = temp1[i] * 10 / 1023 #(0,1023)转化为 (0,10) objvalue.append(10 * math.sin(5 * x) + 7 * math.cos(4 * x)) return objvalue #目标函数值objvalue[m] 与个体基因 pop[m] 对应

来自CODE的代码片

calobjvalue.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

import randomdef crossover(pop, pc): #个体间交叉,实现基因交换 poplen = len(pop) for i in range(poplen - 1): if(random.random() pc): cpoint = random.randint(0,len(pop[0])) temp1 = [] temp2 = [] temp1.extend(pop[i][0 : cpoint]) temp1.extend(pop[i+1][cpoint : len(pop[i])]) temp2.extend(pop[i+1][0 : cpoint]) temp2.extend(pop[i][cpoint : len(pop[i])]) pop[i] = temp1 pop[i+1] = temp2

来自CODE的代码片

crossover.py

1

2

3

4

5

6

7

8

9

10

11

12

13

import randomdef mutation(pop, pm): #基因突变 px = len(pop) py = len(pop[0]) for i in range(px): if(random.random() pm): mpoint = random.randint(0,py-1) if(pop[i][mpoint] == 1): pop[i][mpoint] = 0 else: pop[i][mpoint] = 1

来自CODE的代码片

mutation.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

import randomdef sum(fitvalue): total = 0 for i in range(len(fitvalue)): total += fitvalue[i] return totaldef cumsum(fitvalue): for i in range(len(fitvalue)): t = 0; j = 0; while(j = i): t += fitvalue[j] j = j + 1 fitvalue[i] = t;def selection(pop, fitvalue): #自然选择(轮盘赌算法) newfitvalue = [] totalfit = sum(fitvalue) for i in range(len(fitvalue)): newfitvalue.append(fitvalue[i] / totalfit) cumsum(newfitvalue) ms = []; poplen = len(pop) for i in range(poplen): ms.append(random.random()) #random float list ms ms.sort() fitin = 0 newin = 0 newpop = pop while newin poplen: if(ms[newin] newfitvalue[fitin]): newpop[newin] = pop[fitin] newin = newin + 1 else: fitin = fitin + 1 pop = newpop

python基础教程

你可以看黑马程序员Python入门教程:

教程学习时间15天

1-3天内容:为Linux基础命令

4-13天内容:为Python基础教程14-15 天内容:为飞机大战项目演练

第一阶段(1-3天):

该阶段首先通过介绍不同领域的三种操作系统,操作系统的发展简史以及Linux系统的文件目录结构让大家对Linux系统有一个简单的认识,同时知道为什么要学习Linux命令。然后我们会正式学习Linux命令

1. 文件和目录命令:ls,cd,touch,mkdir,rm

2. 拷贝和移动命令:tree,cp,mv

3. 文件内容命令:cat,more,grep

4. 远程管理命令:ifconfig,ping,SSH的工作方式简介以及ssh命令

5. 用户权限及用户管理命令:chmod,chgrp,useradd,passwd,userdel

6. 软件安装及压缩命令:apt简介及命令,tar,gzip压缩命令,bzip2压缩命令

7. vim的基本使用

第二阶段(4-10天)

该阶段我们正式进入Python这门语言的学习,首先通过了解Python语言的起源,Python语言的设计目标,Python语言的设计哲学,Python语言的优缺点和面向对象的基本概念,以及Python语言的执行方式,还有Python集成开发环境PyCharm的使用为我们接下来的学习做铺垫。

然后我们会学习int,string,float三种简单的变量类型,变量间的计算,变量的输入输出,if判断语句,while循环语句,for循环语句,break和continue的使用,函数的基本使用,模块的使用,列表,元组,字典三种高级变量,字符串的常用操作。

接下来我们会通过一个名片管理系统的案例,把这一阶段的知识进行一个串联。在学习名片管理系统时,首先我们会学习怎么去搭建这一系统的框架,然后我们会分别实现新增名片,显示全部名片,查询名片,删除名片,修改名片这些功能。

最后我们会学习语法的进阶内容,全局变量,局部变量,可变数据类型和不可变数据类型以及函数返回多个值,函数的缺省参数,多值参数,递归的基本使用。

第三阶段(11-13天)

该阶段我们会学习面向对象(OOP)这一重要的编程思想,首先学习的知识点有类和对象的基本概念,dir函数,self的作用,初始化方法__init__,内置函数__str__,__del__,单继承,方法重写,私有属性和方法,多继承,多态,类属性,静态方法。

然后我们还会学习单例模式这一设计模式,异常的捕获,异常的抛出,from import局部导入,from import导入同名工具, from import导入所有工具,包的使用,制作模块,pip的使用以及文件的相关操作。

第四阶段(14-15天)

该阶段是项目演练阶段,我们会带领大家通过使用之前学习过的知识开发飞机大战这一经典游戏,项目中分别有游戏窗口,图像绘制,游戏循环,事件监听,精灵和精灵组以及创建敌机,创建英雄和发射子弹,碰撞检测等模块


当前名称:python目标函数教程 pycharm目标检测
本文URL:http://pwwzsj.com/article/doeoiig.html