教室调度问题

假设有如下课程表,你希望将尽可能多的课程安排在某间教室上。

你没法让这些课都在这间教室上,因为有些课的上课时间有冲突。

你希望在这间教室上尽可能多的课。如何选出尽可能多且时间不冲突的课程呢?
这个问题好像很难,不是吗?实际上,算法可能简单得让你大吃-一惊。具体做法如下。

  1. 选出结束最早的课,它就是要在这间教室上的第一-堂课。
  2. 接下来,必须选择第一-堂 课结束后才开始的课。同样,你选择结束最早的课,这将是要在这间教室上的第二堂课。
  3. 重复这样做就能找出答案!下面来试- -试。 美术课的结束时间最早,为10:00 a.m,因此它就是第一堂课。接下来的课必须在10:00 a.m.后开始,且结束得最早。英语课不行,因为它的时间与美术课冲突,但数学课满足条件。最后,计算机课与数学课的时间是冲突的,但音乐课可以。

很多人都跟我说,这个算法太容易、太显而易见,肯定不对。但这正是贪婪算法的优点一简单易行! 贪婪算法很简单:每步都采取最优的做法。在这个示例中,你每次都选择结束最早的课。用专业术语说,就是你每步都选择局部最优解,最终得到的就是;全局最优解。信不信由你,对于这个调度问题,上述简单算法找到的就是最优解!

贪心算法可能找到的不是最优解,但接近最优解啦。

集合覆盖问题

假设你办了个广播节目,要让全美50个州的听众都收听得到。为此,你需要决定在哪些广播台播出。在每个广播台播出都需要支付费用,因此你力图在尽可能少的广播台播出。现有广播台名单如下。

每个广播台都覆盖特定的区域,不同广播台的覆盖区域可能重叠。

我们用贪心算法求解

贪婪算法可化解危机!使用下面的贪婪算法可得到非常接近的解。

  1. 选出这样-一个广 播台,即它覆盖了最多的未覆盖州。即便这个广播台覆盖了一些已覆盖的州,也没有关系。
  2. 重复第-步,直到覆盖了所有的州。

代码
出于简化考虑,这里假设要覆盖的州没有那么多,广播台也没有那么多。

全部代码
语言:python

#创建一个列表,其中包含要覆盖的州
states_needed = set(["mt" ,"wa", "or", "id", "nv", "ut","ca", "az"])
#还需要有可供选择的广播台清单,我选择使用散列表来表示它
stations={}
stations['kone']=set(['id','nv','ut'])
stations['ktwo']=set(['wa','id','mt'])
stations['kthree']=set(['or','nv','ca'])
stations['kfour']=set(['nv','ut'])
stations['kfive']=set(['ca','az'])#最后,需要使用一个集合来存储最终选择的广播台。
finnal_stations=set()
#计算答案while len(states_needed)>0:#直到所有州都覆盖完,剩余列表的州为空best_stations = Nonestate_covered = set()  # states_ covered是-一个集合, 包含该广播台覆盖的所有未覆盖的州。for station, states in stations.items():#for循环迭代每个广播台,并确定它是否是最佳的广播台。covered=states_needed & states #剩余列表中的州 and 电视台覆盖的州 (取交集)if len(covered)>len(state_covered): #取交集最大的电视台best_stations=stationstate_covered=coveredstates_needed -=state_covered#剩余列表里州finnal_stations.add(best_stations)print(finnal_stations)
print('结束')

旅行商问题

旅行商问题(TravelingSalesmanProblem,TSP)一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要遍历所有城市一次且只能一次,回到出发地。应如何选择行进路线,以使总的行程最短。目前解决TSP问题的方法有许多种,比如:贪心算法、动态规划算法、分支限界法;也有智能算法。本文先介绍贪心算法:

数据 如下图,第一列城市名。第二列坐标x,第三列坐标y

语言:python
贪心算法思路:随便选择出发城市,然后每次选择要去的下一个城市时,都选择还没去的最近的城市。

第一步:读取数据

import pandas as pd
import numpy as np
import math
import timedataframe = pd.read_csv("TSP.csv", sep=",", header=None)
v = dataframe.iloc[:, 1:3]#去除第一列12345678910,只保留x,y
print(v)

第二步:计算城市之间的距离

train_v= np.array(v)
train_d=train_v
#初始化距离 为10*10的全0矩阵
dist = np.zeros((train_v.shape[0],train_d.shape[0]))
#print(dist.shape)#(10,10)#计算距离矩阵
for i in range(train_v.shape[0]):for j in range(train_d.shape[0]):dist[i,j] = math.sqrt(np.sum((train_v[i,:]-train_d[j,:])**2))
print(dist)

第三步:计算距离和路径


"""
s:已经遍历过的城市
dist:城市间距离矩阵
sumpath:目前的最小路径总长度
Dtemp:当前最小距离
flag:访问标记
"""i=1
n=train_v.shape[0]#城市个数
j=0
sumpath=0#目前的最小路径总长度
s=[]#已经遍历过的城市
s.append(0)#从城市0开始
start = time.clock()
while True:k=1#从1开始,因为人在城市0,所以我们设定先从城市1开始选择Detemp=float('inf')#当前最小距离while True:flag=0#访问标记,否0if k in s:#是否访问,如果访问过,flag设为1flag = 1if (flag==0) and (dist[k][s[i-1]] < Detemp):#如果未访问过,并且距离小于最小距离j = k;Detemp=dist[k][s[i - 1]];#当前两做城市相邻距离k+=1#遍历下一城市if k>=n:break;s.append(j)i+=1;sumpath+=Detempif i>=n:break;sumpath+=dist[0][j]#加上dist[0][j] 表示最后又回到起点
end = time.clock()
print("结果:")
print(sumpath)
for m in range(n):print("%s-> "%(s[m]),end='')
print()
print("程序的运行时间是:%s"%(end-start))

该段代码借鉴 他人

代码解析:数字k表示当前我们选择前往下一个城市时,我们需要计算所有未访问过的城市和当前城市距离。
数字i 用于控制访问过的城市,我们需要到达每一个城市。

代码中有两个while
里面那个while表示选择下一城市时,需要遍历所有未访问过的城市,然后选择距离当前城市最近的城市,赋值给j
外面while,表示我们的每一步,我们需要去每个城市。


作者:电气-余登武

贪心算法讲解(集合覆盖问题,旅行商问题求解)相关推荐

  1. 贪心算法:集合覆盖问题

    文章目录 贪心算法 教室调度问题 背包问题 集合覆盖问题 NP完全问题 总结 贪心算法 贪心算法是一种解决问题的思路:每一步选择局部最优解,最终也许不会得到最优结果,但是也会接近最优结果. 贪心算法具 ...

  2. NYOJ 6 喷水装置(一) 贪心算法 之 区间覆盖问题

    喷水装置(一) 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以它为 ...

  3. 【数据结构和算法笔记】最小生成树(贪心算法讲解 )

    一.最小生成树(MST)概念: 生成树: 一个连通图的生成树是一个极小连通子图,含图中所有顶点,和构成这棵树的n-1条边 左图的一颗生成树是右图(图的生成树不唯一) 最小生成树: 带权连通无向图有不同 ...

  4. 5种常用的四轴飞行器PID算法讲解集合

    先分享一些算法的效果 1. 三角函数直接解算欧拉角+互补滤波+单级PID版本 效果:简单暴力,但是 补滤波效果差,单级 PID响应慢,打舵跟随效应差. 2. 三角函数直接解算欧拉角+卡尔曼滤波+单级P ...

  5. 算法 - 贪心算法(集合覆盖问题求解)

    1.穷举法 2.贪心算法 遍历集合的key,用当前key的value和allAreas去取交集),然后和(maxKey和allAreas的交集)比较大小,如果当前key的结合size大就把当前key赋 ...

  6. 【算法学习】贪心算法

    参考算导第三版第16章 贪心算法 文章目录 1. 活动选择问题 1.1 活动选择问题的最优子结构 1.2 贪心选择 1.3 递归贪心算法 1.4 迭代贪心算法 2. 贪心算法原理 2.1 贪心选择性质 ...

  7. 【Java 数据结构 算法】宁可累死自己, 也要卷死别人 18 贪心算法

    [Java 数据结构 & 算法]⚠️宁可累死自己, 也要卷死别人 18⚠️ 贪心算法 概述 贪心算法 电台覆盖问题 代码实现 概述 从今天开始, 小白我将带大家开启 Java 数据结构 &am ...

  8. 数据结构与算法学习⑤(BFS和DFS 贪心算法 二分查找)

    数据结构与算法学习⑤ 数据结构与算法学习⑤ 1.BFS和DFS 1.1.深度优先搜索算法 1.2.广度优先搜索算法 面试实战 102. 二叉树的层序遍历 104. 二叉树的最大深度 515. 在每个树 ...

  9. 给我往死里贪!——24行代码AC_今年暑假不AC HDU - 2037(贪心模板讲解)

    励志用少的代码做高效表达 思路分析: 贪心算法模板题 贪心算法简单来讲即自顶向下,求解出每个子最优解,且每个子问题不会对下一个问题产生影响 该题算法模型为: 1.若每次选取开始时间最早的节目,无法求出 ...

最新文章

  1. 牛客练习赛61 D 最短路变短了(最短路,反向最短路)难度⭐⭐⭐★
  2. Windows Server AppFabric Beta 2 for For Vistual Studio 2010已经发布
  3. 猫眼娱乐2020年上半年交出最差答卷,下半年能满血复活吗?
  4. 使用register_chrdev注册字符设备
  5. libsvm java 实例_LibSVM Java API调用示例程序
  6. 格式化数字字符串输出的一个小技巧
  7. C# 设置Windows程序窗口为穿透状态
  8. HTTP协议详解(真的很经典)(转载)
  9. Java面向对象编程三大特征-多态
  10. 1023_MISRA C规范学习_Rule 2.2
  11. excel函数公式html文档,excel公式embed怎么用
  12. 非谓语动词作后置定语
  13. oracle指定访问某表或某视图
  14. 1.《如何阅读一本书》读书若谈恋爱:如何阅读一本书?
  15. 云计算中的Server Consolidation
  16. 空间大数据是什么,与云计算和大数据之间有什么关系?
  17. MATLAB机械臂建模
  18. 模拟器安装不了apk,fail to start adbCheck settings to verify your chosen adb path is valid.
  19. Qt 之 QDateEdit 和 QTimeEdit
  20. IT运维工作到底是做什么的?

热门文章

  1. Visual C++——CComboBox控件在对话框中没有下拉项目问题解决方案
  2. Windows——蓝屏[失败的操作:WdFilter.sys]解决方案
  3. Ordering Tasks
  4. Applese 的QQ群
  5. find the most comfortable road
  6. 闪灯什么意思_开车闪一下闪二下闪三下大灯是什么意思
  7. 【java读书笔记】ThreadGroup和钩子线程的使用
  8. nginx实现http服务配置
  9. HTML/CSS学习笔记02【表单标签】
  10. android Activity runOnUiThread() 方法使用