编程之美--买书问题

        有个人去买书,买不同的本数有不同的折扣,一共有5种书,买的书种类不同,本数越多折扣越高,折扣表如下:

本数12345
折扣00.050.10.20.25


        买两本不同的书将得到2*0.05的折扣,3本得到3*0.1。问怎样设计一个买书方案使得要买n本书的时候获得的折扣最高?

        贪心算法在这里不适用,因为如果每次都是选择最大折扣的话可能获得不了最优解。如要买8本的话用贪心得到的是5+3的方

案,而事实上两个4本比5+3获得的折扣要高。

        既然贪心不行,那么我们就考虑动态规划方法吧。动态规划适合以下场景。

  • 1.每个问题可以变为若干最优子问题
  • 2.子问题之间求解有大量的重复计算
        对于条件1,我们每得到一个要买的书本数n,他都可以转化为max{(n-i)+disount[i]}的问题,同时在计算过程中较低的最优解必然会
在较高的最优解中重复用到。可以反证如果不是的话我们最终得到的就不是最优解,因为有折扣更大的方案。
实现如下:
#include <iostream>

using namespace std;

float best[9];

float discount[5]={0,0.1,0.3,0.8,1.25};

float max(float x,float y)
{
	return x>y?x:y;
}

float bestChoice(int  n)
{
	if(best[n-1]!=-1)
		return best[n-1];
	float temp=0;
	for(int i=1;i<=5;i++)
		temp=max(bestChoice(n-i)+discount[i-1],temp);
	best[n-1]=temp;
	return temp;
}

int main()
{
	int i; 
	float temp;
	for(i=0;i<5;i++)
		best[i]=discount[i];
	for(i=5;i<9;i++)
		best[i]=-1;
	temp=bestChoice(8);
	cout<<temp<<endl;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: NSGA-II(Non-dominated Sorting Genetic Algorithm II)是一种多目标优化算法,主要用于解决多目标优化问题。Python编程语言具有丰富的库和工具,可以用于实现NSGA-II算法。 在Python中,可以使用多种库来实现NSGA-II算法,如DEAP(Distributed Evolutionary Algorithms in Python),PyGMO(Python Parallel Global Multiobjective Optimizer)等。这些库提供了NSGA-II算法的基本实现,包括种群初始化、适应度评估、交叉和变异操作等。 首先,需要定义问题的目标函数和约束条件。NSGA-II算法的目标是找到一组解,使得它们相互之间不可比较(也即非支配关系),且在所有可能的解中具有最好的逼近解(也即帕累托最优)。 然后,可以使用Python编程语言编写NSGA-II算法的主要步骤。首先,需要初始化一个种群,用于表示解空间中的各种解。然后,通过计算每个个体的适应度值,根据非支配排序和拥挤度距离进行选择、交叉和变异操作,生成新一代的种群。接下来,对新一代的种群进行非支配排序和拥挤度距离计算,重复上述步骤,直到达到指定的停止条件。 最后,根据NSGA-II算法生成的帕累托前沿,可以选择最优解或从前沿中进行进一步的决策。 在Python中,可以使用matplotlib等可视化库将生成的帕累托前沿图形化展示,以便更好地理解问题的解集。 总之,通过使用Python编程语言实现NSGA-II算法,可以有效解决多目标优化问题,并生成最优帕累托解集。 ### 回答2: NSGA-II(多目标遗传算法非支配排序遗传算法)是一种常用于解决多目标优化问题的算法。Python编程语言提供了丰富的库和工具,可以方便地实现NSGA-II算法。 以下是使用Python编程解决NSGA-II问题的步骤: 1. 定义目标函数和约束条件:首先需要定义具体的目标函数和约束条件。这些函数可以是任意的,根据实际问题来设计。目标函数是待优化的目标,约束条件是问题的限制条件。 2. 初始化种群:通过随机生成一定数量的个体,形成初始种群。每个个体由一组变量组成,变量的取值根据问题的要求来确定。 3. 评估适应度:对于每个个体,根据目标函数和约束条件计算其适应度值。适应度值越高表示个体越优秀。 4. 进行遗传操作:根据NSGA-II算法的基本原理,通过选择、交叉和变异操作对种群进行进化。选择操作基于非支配排序和拥挤度距离,用于选择出较优的个体。交叉和变异操作用于生成新的个体,增加种群的多样性。 5. 更新种群:根据遗传操作得到的新个体,更新原有的种群。 6. 判断终止条件:判断是否满足终止条件,如达到预设的迭代次数或满足特定的停止准则。如果满足条件,则停止优化过程,输出最终的非支配解集。 7. 输出结果:将最终得到的非支配解集进行输出,并根据实际需求进行进一步分析或应用。 通过使用Python编程语言,可以使用相关的库,如DEAP(分布式进化算法框架)等来实现NSGA-II算法。从定义目标函数和约束条件到遗传操作的实现,Python提供了丰富的函数和工具,使得解决NSGA-II问题变得更加简单和高效。 ### 回答3: NSGA-II是一种多目标优化算法,在解决复杂的多目标问题上具有较高的效率和准确性。Python编程语言提供了丰富的工具和库,可以很方便地实现NSGA-II算法。 首先,在Python中可以使用numpy库来进行矩阵和数组的操作,这是NSGA-II算法中经常使用的工具。另外,还可以使用matplotlib库进行结果的可视化展示。 接下来,需要定义适应度函数来评估每一个个体的适应度。适应度函数根据问题的具体要求而定,可以使用一些已有的评估方法,也可以根据个人需求自定义适应度计算方法。 然后,要进行种群初始化,即生成一组具有随机特征的个体。可以使用numpy库中的随机函数来生成符合特定分布的随机数。 在遗传算法的进化过程中,需要进行选择、交叉和变异操作。在Python中,可以使用遗传算法库(例如deap、pyevolve等)来实现这些操作,简化编程过程。 在使用遗传算法库进行操作时,需要定义个体的基因表示方法和相应的变异、交叉操作方法。这些操作方法可以根据问题的特点来设计,例如单点交叉、多点变异等。 最后,可以使用NSGA-II的主要步骤进行迭代优化,包括使用非支配排序获取帕累托前沿、计算拥挤度距离、选择优秀个体等。通过多次迭代,可以得到最优的解集。 总而言之,Python编程语言具有丰富的工具和库,可以很方便地实现NSGA-II算法。通过定义适应度函数、初始化种群、选择、交叉和变异操作,最终可以得到优化结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值