数据结构 数据结构与算法大作业二

发布 2021-05-02 16:58:28 阅读 6383

电子工程系无23班邓创 021372

算法分析。首先把本问题抽象为一个带权图的问题。如图,由6个地点组成的销售网络。

其中的路径上的权值已标注。题目要求在每一个点设置一种主销产品,两种辅销产品。对下图来说,不妨设节点n主销第n种产品。

这样确定主销产品后,对辅销产品的确定也很方便。即对节点n(1≤n≤6)主销第n种产品后,辅销第in 和 jn 种产品。且满足条件:

in ≠jn,且各个i,各个j互不相等。

例如如下是一个满足条件的销售方案。

并且可以验证,这是一个满足条件的最优解。

从以上分析可以发现,该问题已经抽象为一个全排列问题。即n的两个不同全排列,并满足对应项不相等的条件。在所有的这些全排列中计算 ∑d(n,in)+d(n,jn) ,并选取结果最小的那个方案即可。

由以上分析可以得到本问题的算法。即利用枚举法或者回溯法搜索出所有的n的全排列,再将其符合条件的2个排列组合起来,最后利用求和公式计算。但这样的算法效率实在太低,在实际问题的解决中毫无意义。

因此我们退一步求其次,利用较小的时空代价获得一个较优解。我们改进算法如下:

首先只考虑第一辅销。在这种情况下,由于是求n的一个全排列,因此比同时考虑两个全排列要简单得多。我们也可以在利用回溯搜索排列时加入一些限制条件来优化算法,尽量获得最高的效率。

因此,在仅仅考虑第一辅销的时候,最优解是可以求出来的。

在考虑第二辅销。这时候,由于第一辅销已经确定,第二辅销的搜索会增加一些限制条件。因此在搜索过程中有可能找不到最优解。

然而根据理论计算,在这样的限制条件下再次回溯搜索出的局部最优解在整个问题来说,也应该是较优的。这样便符合了题目寻找较优解的条件,并且搜索次数,时空代价都大大减少。是一个可行的算法。

下面给出算法的具体步骤:

1. 利用floyd算法求出图中任意两点间的最短距离。

2. 利用回溯法求解第一辅销的分布方案。

3. 在第一辅销分布方案确定的条件下再次利用回溯法寻找第二辅销方案。

具体算法:数据类型:

map[i,j] —原始数据,用邻接表结构记录带权图,即原始网络。

path[i,j] —利用floyd算法求出的记录任意两点最短路径的邻接表。

solution[1..n,1..2] —存放解,第二下标的1,2分别存放第一辅销和第二辅销的方案。

shortestpath_floyd利用floyd算法求两点间最短路经。

输入:map

输出:path

for (u 0;u for (v 0;v for (w 0;w if map[u][v]+map[u][w]

map[v][w] map[v][u]+map[u][w];

path map;

return;

search(k搜索第一辅销方案最优解

输入:path

输出:solution[1..n,1]

if k=n+1 then

return;

search2(k第二辅销方案的搜索。

其算法思想和search几乎相同,仅仅增加了一些条件判断。

输入:path, solution[1..n,1]

输出:solution[1..n,1..2]

if k=n+1 then

if pd=true then

dist[k] i;

total total+path[i,k];

if total>min then exit;

else search2(k+1);

return;

output(solution[1..n,1..2输出最终结果。

输出:solution.

此结果还可以更进一步优化。

即最后的调整算法:

先不管冲突与否,写出离每个节点距离最近的两个点,再和已经得到的结果比较。

如图,上表是一个符合条件的解。下表是每个节点的最优解。例如,比较节点2,上表与下表的不同在3和6的选取。

将上表中的6更改为3,即对整个方案增加了一个3,减少了一个6;于是需要在其他地方补回这个损失:这样的补回损失有两种方案:(1)将节点1的调整为6 (图3)(2)将节点4的3调整为6(图4)。

分别将这两种方案的路径和求出,和原始方案比较,如果和减小了,则采用新方案。对这样的调整一直进行下去,可以得到一个逐步调整后的较优解。需要说明的是,这样的算法仍然不足以找到最优解。

因此,对最优解的寻找还是一个复杂困难的问题,在不用搜索的条件下解决难度较大。

原始方案。最短方案。

第一修改方案。

第二修改方案。

3、张小娴说:当时间过去,我们忘记了我们曾经义无反顾地爱过一个人,忘记了他的温柔,忘记了他为我做的一切。我对他再没有感觉,我不再爱他了。

为甚么会这样?原来我们的爱情败给了岁月。首先是爱情使你忘记时间,然后是时间使你忘记爱情。

4、张小娴说:思念一个人,不必天天见,不必互相拥有或相互毁灭,不是朝思暮想,而是一天总想起他几次。听不到他的声音时,会担心他。一个人在外地时,会想念和他一起的时光。

5、张小娴说:爱情,原来是含笑饮毒酒。

6、张小娴说:不被人珍视的爱情,就只是个羞耻的笑话。

7、张小娴说:寂寞的人,感冒会拖得特别的久,因为她自己也不想痊愈。

8、张小娴:女人放弃一个跟不上她的男人,是有志气。男人放弃一个跟不上他的女人,则是无义。

9、张小娴说:清醒一点吧,世上没有未完的事,只有未死的心。

10、张小娴说:遗憾,也是一种幸福。因为还有令你遗憾的事情。

11、张小娴说:失望,有时候也是一种幸福。因为有所期待,所以才会失望。因为有爱,才会有期待。所以纵使失望也是一种幸福,虽然这种幸福有点痛。

12、张小娴说:突然觉得很委屈。我对你微笑,转身的刹那,终于难过成你不知道的样子。

13、张小娴说:做一个诚实的孩子。喜欢一个人,不到一定程度,不要轻易去说喜欢。因为你的一句轻浮的话,很可能悲伤另一个人一段时光。也有的,将会是,一生。

14、张小娴说:如果没有很大把握,又或者没有坚定地信念,请不要说太长久的承诺。相爱时叫承诺,不爱的时候呢?

也不是谎言吧。毕竟爱着的时候就算说了地久天长,相信也是出自真心。只不过后来的离开,不是自己能把握的。

15、张小娴说:如果爱的足够深,又或者是用情深的人,那个曾经伤害过ta的人有天肯回头了,ta还是会很没骨气很没出息地接受。因为爱,因为忘不了。

16、张小娴说:爱情结束后,请选择“沉默”.你可以喊三两最好的朋友去k歌,使劲吼,就唱那首“其实不想走,其实我想留”,然后在某个时间点突然嚎啕大哭。

就算你是男生,也没什么丢人的,不难过只能说你没有真心爱过。

17、张小娴说:不要在爱情结束后,把那个你曾经爱过的人到处指责,将ta说的一无是处。没必要的,既然留不住心,不如留下那份感情的纯洁度,蒙了尘,也就减损了回忆的价值。

18、张小娴说:你以为不可失去的人,原来并非不可失去,你流干了眼泪,自有另一个人逗你欢笑,你伤心欲绝,然后发现不爱你的人,根本不值得你为之伤心,今天回首,何尝不是一个喜剧?情尽时,自有另一番新境界,所有的悲哀也不过是历史。

数据结构常用算法数据结构算法

void union list la,list lb union void mergelist list la,list lb,list lc else while i la len while j lb len mergelist status initlist sq sqlist l elemt...

数据结构与算法

本章知识要点 算法的基本概念 数据结构的定义 线性表的定义和存储 树 二叉树的定义和存储 查找与排序算法。算法 algorithm 是一组有穷的规则,规定了解决某一特定类型问题的一系列运算,是对解题方 与完整的描述。算法是解题的步骤,可以把算法定义成解一确定类问题的任意一种特殊的方法。在计算机科学中...

算法与数据结构

学院专业姓名学号。实验1 线性表的操作 12学时 问题描述 假设一个班级内有n个学生,定义一个学生类和一个班级类。学生类中包括学号 姓名 性别 年龄 专业等属性 班级类包括一个学生对象链表。定义如下 class student class myclass student stu head 链表表头指...