精华内容
下载资源
问答
  • 如何能够快速、准确地寻找到你的目标客户群体,恐怕这是每一个职业都要面临的问题。编辑需要寻找他的读者,销售需要寻找他的买主,生产商需要寻找他的用户,深圳市铭创光电有限公司(以下简称铭创光电)需要寻找他的...
  • 【Python应用】寻找社交网络中的目标用户 这是我们学校的软件工程课程设计的题目,要求自行编写爬虫或者利用开放的API获取新浪微博、知乎等社交网站的用户信息,利用数据挖掘的相关算法进行分析, 从大规模的用户群体...

    【Python应用】寻找社交网络中的目标用户

    日后的更新:由于是很久以前的课程设计项目,完整的源码已经不见了,关键的网页数据获取和解析的部分代码我在文章中已经贴出来了,但写的也不够好,如果想参考爬取知乎的同学,推荐去看慕课网的《python分布式爬虫打造搜索引擎》,其中有对编写知乎爬虫的视频讲解,虽然已经过去了不短的时间,知乎的反爬策略可能有变,但还是有参考价值的。

    对于爬虫动态代理池的构建,推荐qiyeboy/IPProxyPool这个开源项目,安装的时候可能有点麻烦,见到错误提示缺少哪个包手动pip install就好了。

    以下是正文:

    这是我们学校的软件工程课程设计的题目,要求自行编写爬虫或者利用开放的API获取新浪微博、知乎等社交网站的用户信息,利用数据挖掘的相关算法进行分析, 从大规模的用户群体中, 分别找出其中具有海淘或母婴购物意向的用户。

    在具体实现方面我选择了知乎作为目标的社交网站,通过Python编写数据爬虫与进行数据的分析,通过数据建立用户特征向量,将已知具有母婴购物倾向的用户与未知购物倾向的用户的特征向量进行对比,进而寻找出具有母婴购物倾向的用户。

    ###目录

    编程前简单的分析

    ###选择知乎的原因

    知乎的个人详情页与问题详情页不需要登陆也能访问,免除了模拟登陆的步骤。

    在知乎无论是问题描述还是个人信息内,标签的使用频繁,能给后续的文本处理与分析带来极大地方便。

    不足之处:知乎专业化程度较高,其在生活化气息不如新浪微博等社交网站。

    选定需要获取的信息

    从个人信息页面与问题详情页面分析我们的爬虫应该爬取的信息:

    用户详情界面的基本分析

    问题详情界面的基本分析

    来逐项考虑每项信息对我们项目的意义:

    • 用户的基本信息——昵称、居住地、教育程度等,一般考虑并不会对是否具有母婴购物倾向具有决定性的影响。

    • 用户关注的话题、问题、专栏——关注的话题能最直观的展现用户的喜好、关注点所在,专栏与话题有重叠,关注的问题数量不同用户间可能会差距较大。

    • 用户的回答,专栏——可以反映用户的特长,不能反映用户的兴趣点。

    • 用户的提问——可能能反映用户的某种需求。问题tag能对问题进行有效概括。

    综上,我决定对每个用户提取其关注的话题与所提的问题、问题的tag来建立用户特征向量。

    ##爬虫的编写

    爬虫选择了使用Python编写,主要使用了其中的requests, beautifulsoup等库。

    ###一些难点与解决方法

    爬虫实现过程中遇到的一些阻碍与大体解决方法如下

    • 直接爬虫访问知乎遇到了500错误,结合chrome的开发者工具与fiddle网络分析工具,分析对知乎进行访问的网络请求,在爬虫头部加入了伪造的请求头。

    • 前端知识较为缺乏,对HTML的DOM树结构了解不够深入,对beautifulsoup库不能很好的利用,对一些内容的爬取还需结合正则表达式来操作。

    • 在获取母婴用品话题的关注用户的时候无法绕过登陆过程,而且需要对动态的网页内容进行爬取,此时只能通过selenium+chrome的组合自动填入登陆表单信息与下拉滚动条获取用户id,手动点击验证码的方式完成(现在知乎的登陆验证是点击图中的倒立文字,完全自动化的爬虫想必很难处理)。

    • 对于知乎会限制固定ip访问频率的问题,通过在网上批量购买ip代理地址、建立ip代理池解决,但ip代理池的更新还没能做到自动化。

    • 对于单个爬虫爬取效率太低的问题,由于爬虫完整运行一次的时间主要由网络延迟决定,所以使用python的多线程编程爬虫提高爬取效率。

    • 爬取的数据同步存储到mysql数据库中,使用python的pymysql库对数据库进行操作。

    爬虫的大致结构

    爬虫工作分为三个阶段:第一阶段为随机获取一定数量的用户id,第二阶段为获取一定数量已知具有母婴购物倾向的用户id,第三阶段为根据已经获取的用户id去获取用户的个人信息与提问详情。

    • 第一阶段的工作中,以随机的一位用户作为种子用户,获取其关注的20位用户id,对这20位用户再获取其每个人关注的20位用户,如此循环,预计获取8000位用户作为未知购物倾向的用户组,将用户id写入数据库中。

    • 第二阶段的工作中,前往知乎“母婴用品”话题关注者页面,获取页面下1500名关注者,作为已知具有母婴购物倾向的用户的用户组,同样将用户id写入数据库中。

    • 第三阶段的工作中,通过数据库中的用户id,获取其关注的话题列表与已经提问的问题的标签列表。

    其中第三阶段,也是爬虫主要阶段的主要代码如下:

    # -*- coding:utf-8 -*-
    from bs4 import BeautifulSoup
    import requests
    import re
    import pymysql
    import threading
    import queue
    import time
    
    #用于保存用户uid在数据库中序号的队列
    q = queue.Queue(maxsize=3000)
    
    conn_0 = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root',
                                   db='zhihu', charset='utf8')
    
    cursor_0 = conn_0.cursor()
    #将未读取过的用户入列
    sql_0 = 'SELECT order_number from infant_userid where is_read = 0'
    cursor_0.execute(sql_0)
    conn_0.commit()
    for r in cursor_0:
        r = re.sub("\D", "", str(r))
        print(r)
        q.put(r)
    
    class zhihu():
        def __init__(self):
            # 连接数据库
            self.conn = pymysql.connect(host='127.0.0.1', port=3306, user='', passwd='',
                                   db='zhihu', charset='utf8')
            self.main_url = 'https://www.zhihu.com/people/'
            self.answers_url = '/answers'
            self.topics_url = '/following/topics?page='
            self.asks_url = '/asks?page='
            self.question_url = 'https://www.zhihu.com/question/'
            self.headers = {
                "Host": "www.zhihu.com",
                "Referer": "https://www.zhihu.com/",
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
            }
    
        def get_userinfo(self, user_token, proxies):
            # 获取用户名字
            url1 = self.main_url + user_token
            content = requests.get(url1, headers=self.headers, proxies=proxies).content
            #print(content.text)
            pattern = re.compile(r'<span class="ProfileHeader-name">(.+?)</span>')
            try:
                name_temp = pattern.findall(content.text)
            except:
                #除去僵尸用户,即未登陆无法查看信息的用户
                sql1 = "delete from infant_userid where token_id = '"+user_token+"'"
                self.cursor.execute(sql1)
                self.conn.commit()
                print(user_token+" is a ghost!!")
                pass
            else:
                print(name_temp)
                name = name_temp[0]
                print(name)
                # 获取用户关注的话题
                url2 = self.main_url + user_token + self.topics_url
                # print("fetching userinfo...")
                n = 1  # 话题的页数
                count = 21
                all_topics = []  # 用于存放话题的列表
                while count > 20:
                    content = requests.get(url2 + str(n), headers=self.headers, proxies=proxies)
                    pattern = re.compile(r'&quot;name&quot;:&quot;(.+?)&quot;')
                    topics = pattern.findall(content.text)
                    all_topics = all_topics + topics
                    n = n + 1
                    count = len(topics)
                all_topics = list(set(all_topics))  # 去重
                topics_str = ";".join(all_topics)  # 转字符串
                print(topics_str)
    
                # 链接数据库
                sql2 = "INSERT INTO infant_users (tokenID,username,topics) VALUES ('" + user_token + "','" + name + "','" + topics_str + "')"
                self.cursor.execute(sql2)
                # print(sql)
                self.get_question(user_token, proxies)
    
        def get_question(self, user_token, proxies):
                # 获取用户的提问
                url = self.main_url + user_token + self.asks_url
                #print(url)
                #print("fetching questions...")
                n = 1  # page
                question_count = 20
                while question_count > 19:
                    content = requests.get(url + str(n), headers=self.headers, proxies=proxies)
                    pattern = re.compile(r'&quot;http://www.zhihu.com/api/v4/questions/(.+?)&quot;')
                    question_tokens = pattern.findall(content.text)
                    # print(question_tokens)
                    for question_token in question_tokens:
                        #print(question_token)
                        url2 = self.question_url + question_token
                        content2 = requests.get(url2, headers=self.headers, proxies=proxies).content
                        soup = BeautifulSoup(content2, 'lxml')
                        try:
                            title = soup.find('h1', attrs={'class', 'QuestionHeader-title'})
                        except:
                            #问题未登陆无法访问的情况
                            print('question is empty')
                            pass
                        else:
                            title = title.get_text()
                            print(title)
                            sql_tags = []
                            tags = soup.find_all('span', attrs={'class', 'Tag-content'})
                            for tag in tags:
                                tag = tag.get_text()
                                sql_tags.append(tag)
                            # print(sql_tags)
                            tags_str = ";".join(sql_tags)  # 转字符串
    
                            # 操作mysql
                            sql1 = "INSERT INTO infant_questions (questionsID,question,tags,askerID) VALUES ('" + question_token + "','" + title + "','" + tags_str + "','" + user_token + "')"
                            # print(sql1)
                            self.cursor.execute(sql1)
                            # time.sleep(0.5)
    
                    # 页面计数加一
                    n = n + 1
                    question_count = len(question_tokens)
                    # print(count)
                #print("fetch questions done")
    
        def run(self):
            count = 0
            while count < 100:
                if not (q.empty()):
                    user_num = q.get()
                    print(user_num)
                    self.cursor = self.conn.cursor()
                    sql = "SELECT token_id FROM infant_userid WHERE order_number='" + str(user_num) + "'"
                    self.cursor.execute(sql)
                    self.conn.commit()
                    try:
                        user_token = self.cursor.fetchone()[0]
                    except:
                        print("获取用户名出错,重试中...")
                        pass
                    else:
                        print("feching the no." + str(user_num) + " user: " + user_token + "...")
                        # 代理,还需手动填入
                        proxies_pool = [{'https': 'https://210.43.38.251:8998'}, {'https': 'https://111.155.116.247:8123'}]
                        proxies_num = 1
                        proxies = []
                        #try:
                        self.get_userinfo(user_token, proxies)
                        #except:
                            #print("发生错误,重试中...")
                            #q.put(user_num)
                            #pass
                        #else:
                        sql2 = "UPDATE infant_userid SET is_read=1 where token_id='" + str(user_token) + "'"
                        self.cursor.execute(sql2)
                        self.conn.commit()
                        count += 1
                        print(count)
                    print("fetch done")
    
            self.cursor.close()
    
    if __name__ == "__main__":
        #定时重启的主线程
        for i in range(1, 10):
            #线程列表
            thread = []
            for i in range(0, 1):
                z = zhihu()
                t = threading.Thread(target=z.run, args=())
                #设为守护进程
                t.setDaemon(True)
                thread.append(t)
            for i in range(0, 1):
                thread[i].start()
            for i in range(0, 1):
                thread[i].join()
            time.sleep(1200)
    

    程序运行时间过长爬取的效率会下降,将主线程设置为定时重启也不行,不知道是哪里出了问题。…

    最终爬取的数据在数据库中预览的效果如下:

    问题详情

    用户信息

    数据库与表的结构就不贴出来了,并不是什么复杂的结构。

    ##数据的处理

    ###初步处理

    • 筛选:剔除无法访问的用户后,得到7792位未知购物倾向用户信息,1209位已知具有母婴购物倾向用户信息。母婴用户下有1141条问题记录,未知倾向用户下有16924条问题记录。

    • 分词:对每个用户关注的话题、问题使用结巴分词进行分词处理。分词过程中整合网络上的停用词表,构建更为全面的停用词表。

    • 生成待分析文本:将每个用户分词后信息导出到一个txt文件,以用户的id作为文件名。未知与已知用户分别置于两个不同文件夹内。

    这样每个用户就有了一个描述该用户的txt文件,下一步将基于这个txt文件的内容计算用户的特征向量。

    ###进一步处理

    • 首先计算已知母婴购物倾向用户的特征向量:计算每个词的卡方统计量,挑选出其中CHI>0.1的词语作为特征向量,然后计算每个词语的TF-IDF值作为特征向量的权重,其乘积便为带权重的特征向量。
      CHI值的计算公式:
      CHI值的计算公式
      TF-IDF值的计算公式:
      TF-IDF值的计算公式

    • 建立未知购物倾向用户词表,计算每个词的特征向量值后写入数据库,对每个未知购物倾向用户的分词后文档进行处理,从数据库中查询每个词的特征向量值构成该用户的特征向量。

    • 计算已知具有母婴购物倾向的用户与未知用户的特征向量夹角余弦值,若计算结果大于0.5则认为该未知用户同样具有母婴购物倾向。
      夹角余弦值计算公式

    ##结果

    ###程序运行的结果

    程序运行情况如图:
    程序运行结果

    此时程序运行了25分钟,处理了500+位用户的数据,约占总数的6%,从搜索结果栏可以发现,程序已经寻找出了三位潜在的具有母婴购物倾向的用户。

    如果运行的时间足够长的话,可以从7792位用户中把所有具有母婴购物倾向的用户寻找出来(懒啊…)。

    ###小小的总结
    当然,从运行结果就能看出缺点:程序太慢,效率太低了…建立未知购物倾向用户的特征向量与余弦夹角的计算都需要很多时间。实际上以上分析的方法都只是简单的对包含用户信息的文本进行相似度的比较,其中“计算结果大于0.5则认为该未知用户同样具有母婴购物倾向”也没有任何根据,完全只是为了方便而私人划定的标准,对于获得的“潜在用户”也没有任何校验准确性的方法,整套分析的方法可以说是漏洞百出(这点在课程设计答辩的时候已经被老师指出了),所以这篇文章并不具备任何作为实际参考的意义,仅仅是作为个人python程序练手项目的一次总结与记录。

    这里写图片描述
    期间也想要放弃,虽然掉入了一个又一个的坑,但还是勉勉强强爬了出来…

    在实际编程的工作中遇到的困难比文中提及的要多,例如数据库操作上的困难(去重)、代理设置上的疑问(http与https只差)、手贱删掉已经爬好的用户数据等…虽然其中大多数是低级错误,但一脚一个坑也算是能让我长点记性吧…

    ###参考资料

    展开全文
  • 关于客户(销售员该如何找客户才好) 1、旧时指以租佃为生的人家。2、旧时指外地迁来的住户。(以上两条详见下文)。3、工厂企业或经纪人称...教你怎样寻找客户源(销售员该如何找客户才好) 刚入行的销售员,首先要

    关于客户(销售员该如何找客户才好)

    1、旧时指以租佃为生的人家。2、旧时指外地迁来的住户。(以上两条详见下文)。3、工厂企业或经纪人称来往的主顾;客商。4、在网络的通信方式中,指服务的请求方。5、在客户关系管理中,客户是对企业产品和服务有特定需求的群体,它是企业经营活动得以维持的根本保证。6、客户是服务请求方。

    教你怎样寻找客户源(销售员该如何找客户才好)

    刚入行的销售员,首先要面对客户在哪里的问题?就是干了多年的销售员遇到新的产品,特别是新出现的产品,有时连行业都分不清楚。比如:我做了十多年的销售,当开始做品牌的客户关系管理系统这个项目时,就拿不准是要去哪里找代理商渠道,后来通过向同行的学习,探讨慢慢的摸索出了方向。还有就是随着科技的发展,一些跨行业,综合性能的产品会越来越多,渠道方向就涉及到好多路径,同时还要考虑到哪方面的渠道更适合等方面因素,这就为销售员提出了新的问题。那么,我们在寻找客户的过程中应注意些什么呢?

    一、普遍寻找法

    这种方法也称逐户寻找法或者地毯式寻找法。其方法的要点是,在业务员特定的市场区域范围内,针对特定的群体,用上门、邮件或者电话、电子邮件等方式对该范围内的组织、家庭或者个人无遗漏地进行寻找与确认的方法。比如,将某市某个居民新村的所有家庭作为普遍寻找对象,将上海地区所有的宾馆、饭店作为地毯式寻找对象等。

    普遍寻找法有以下的优势:

    1、地毯式的铺开不会遗漏任何有价值的客户;

    2、寻找过程中接触面广、信息量大、各种意见和需求、客户反应都可能收集到,是分析市场的一种方法;

    3、让更多的人了解到自己的企业。

    当然其缺点也是很明显的:

    1、成本高、费时费力;

    2、容易导致客户的抵触情绪。

    因此,如果活动可能会对客户的工作、生活造成不良的干扰,一定要谨慎进行。

    普遍寻找法可以采用业务员亲自上门、邮件发送、电话、与其他促销活动结合进行的方式展开。

    二、广告寻找法

    这种方法的基本步骤是:(1)向目标顾客群发送广告;(2)吸引顾客上门展开业务活动或者接受反馈。例如,通过媒体发送某个减肥器具的广告,介绍其功能、购买方式、地点、代理和经销办法等,然后在目标区域展开活动。

    广告寻找法的优点是:

    1、传播信息速度快、覆盖面广、重复性好;

    2、相对普遍寻找法更加省时省力;

    其缺点是需要支付广告费用、针对性和及时反馈性不强。

    三、介绍寻找法

    这种方法是业务员通过他人的直接介绍或者提供的信息进行顾客寻找,可以通过业务员的熟人、朋友等社会关系,也可以通过企业的合作伙伴、客户等由他们进行介绍,主要方式有电话介绍、口头介绍、信函介绍、名片介绍、口碑效应等。

    利用这个方法的关键是业务员必须注意培养和积累各种关系,为现有客户提供的满意的服务和可能的帮助,并且要虚心地请求他人的帮助。口碑好、业务印象好、乐于助人、与客户关系好、被人信任的业务员一般都能取得有效的突破。

    介绍寻找客户法由于有他人的介绍或者成功案例和依据,成功的可能性非常大,同时也可以降低销售费用,减小成交障碍,因此业务员要重视和珍惜。

    四、资料查阅寻找法

    我们一直认为,业务员要有强的信息处理能力,通过资料查阅寻找客户既能保证一定的可靠性,也减小工作量、提高工作效率,同时也可以最大限度减少业务工作的盲目性和客户的抵触情绪,更重要的是,可以展开先期的客户研究,了解客户的特点、状况,提出适当的客户活动针对性策略等。

    需要注意的是资料的时效性和可靠性,此外,注意对资料(行业的或者客户的)日积月累往往更能有效地展开工作。

    业务员经常利用的资料有:有关政府部门提供的资料、有关行业和协会的资料、国家和地区的统计资料、企业黄页、工商企业目录和产品目录、电视、报纸、杂志、互联网等大众媒体、客户发布的消息、产品介绍、企业内刊等等,而互联网信息虽广而多,但是还是要到一些可信专业的网站上进行相关的资料搜集,比如有关政府部门的资料就是去一些当地的政府部门网站,有关行业和协会的资料就去自己行业协会的网站上去,其他的资料以此类推,找最权威的网站,相关性高,找到的资料才会准确。

    一些有经验的业务员,在出发和客户接触之前,往往会通过大量的资料研究对客户做出非常充分的了解和判断。

    五、委托助手寻找法

    这种方法在国外用得比较多,一般是业务员在自己的业务地区或者客户群中,通过有偿的方式委托特定的人为自己收集信息,了解有关客户和市场、地区的情报资料等等,这优点象香港**使用“线民”,在国内的企业,笔者也见过,就是业务员在企业的中间商中间,委托相关人员定期或者不定期提供一些关于产品、销售的信息。

    另一种方式是,老业务员有时可以委托新业务员从事这方面的工作,对新业务员也是一个有效的锻炼。

    六、客户资料整理法

    这种方法本质上属于“资料查阅寻找法”,但是,也有其特殊性,我们强调客户资料管理,因为其重要性十分突出,现有的客户、与企业联系过的单位、企业举办活动(如公关、市场调查)的参与者等等,他们的信息资料都应该得到良好的处理和保存,这些资料积累到一定的程度,就是一笔财富,在市场营销精耕细作的今天,这尤为重要,这同时也要得力于CRM客户关系管理系统,处理、管理繁杂的客户资料为企业,为个人带来了多大的帮助。现在难以想象如果一个企业没有用到CRM客户关系管理系统或者是OA会变得多么糟糕,如果面对你繁多的客户需要管理还没用到类似工具的话,那你是out了。

    举个最简单的例子,某个家庭,第一代洗衣机购买的是“小天鹅双桶洗衣机”、第二代洗衣机是“小天鹅全自动洗衣机”、第三代洗衣机是“小天鹅滚筒式洗衣机”,你如果要做到真正让客户的三代洗衣机都用“小天鹅”,客户的资料和客户的精细服务就是必不可少的。开个玩笑的话,小天鹅可以提出一个营销内部口号:“让小天鹅在顾客家里代代相传”。

    七、交易会寻找法

    国际国内每年都有不少交易会,如广交会、高交会、中小企业博览会等等,这是一个绝好的商机,要充分利用,交易会不仅实现交易,更重要的是寻找客户、联络感情、沟通了解。奥联的一个客户的老总,参加了今年的广交会回来,向全体员工宣布一个惊人的好消息:“我有足够的信心向大家保证:今年我们的销售收入可以增加2个亿!”,其成效明显主要原因之一是因为其产品的特殊性,但是更重要的是企业已经全面学会和掌握了这个有效的途径。

    八、咨询寻找法

    一些组织,特别是行业组织、技术服务组织、咨询单位等,他们手中往往集中了大量的客户资料和资源以及相关行业和市场信息,通过咨询的方式寻找客户不仅是一个有效的途径,有时还能够获得这些组织的服务、帮助和支持,比如在客户联系、介绍、市场进入方案建议等方面。我们就曾经为一个国外企业进入中国市场提出合作建议方案,寻找合作者甚至参与项目论证等方面提供过一揽子服务。

    九、企业各类活动寻找法

    企业通过公共关系活动、市场调研活动、促销活动、技术支持和售后服务活动等,一般都会直接接触客户,这个过程中对客户的观察、了解、深入的沟通都非常有力,也是一个寻找客户的好方法。

    有效地寻找客户方法远远不止这些,应该说,是一个随时随地的过程。一般信息处理过程是:“所有目标对象-接触和信息处理-初选―精选―重点潜在客户―客户活动计划”。

    展开全文
  •  已知每个顾客的位置与需求量, 每台车的容量一定, 将货物送顾客手中需要满足一定的时间约束, 要求合理安排行车路线使目标函数得到优化。 对该问题的研究引起了广大学者的关注。 它是有容量约束车辆路径...

    蚁群算法求解有时间窗约束的车辆路径问题matlab程序

    1 简介

    带时间窗的车辆路径问题(VRPTW)一般描述为从某一物流配送中心出发用多台车辆向多个顾客送货车辆完成配送任务后返回配送中心 已知每个顾客的位置与需求量 每台车的容量一定 将货物送到顾客手中需要满足一定的时间约束 要求合理安排行车路线使目标函数得到优化 对该问题的研究引起了广大学者的关注 它是有容量约束车辆路径问题的扩展 NP难题 求解算法可分为精确算法与启发式算法当顾客点数目较多时 使用精确算法很难在可接受的时间内求得全局最优解 因此 用启发式算法在可接受的时间内求得问题的满意解成为研究的重要方向

    蚁群算法是由Dorigo等首先提出来的 它的基本思想是利用一群人工蚂蚁的协作来寻找优化问题的较优解 每只蚂蚁根据问题所给的准则 从被选中的初始状态出发建立一个可行解或部分解 各个蚂蚁间通过信息素交换信息 从而达到相互协作的目的蚁群算法的思想已被应用到各个研究领域 并取得了大量的研究成果 而在VRPTW方面的研究则较少

    2 有时间窗的车辆路径问题

    为简化问题的描述,需要在构建模型前做一些基本的假设和约束:

        (1) 假设物流运输车辆状况相同;

        (2) 单车运载力要大于单个客户需求量,且每条路线上的客户需求总量不大于单车最大运载力;

        (3) 配送中心能够满足所有客户需求,无缺货;

        (4) 车辆完成配送后直接返回配送中心;

    (5) 每条路径长度不超过单车最大行程;

    (6) 车辆要在时间窗内到达相应客户点,否则会产生惩罚成本;

     

    向客户配送货物有时间限制,在此采用软时间窗的限制方法进行处理, 即对客户需求的货物在一定的时间范围内到达,若未能按时到达,则将对物流配送企业给予一定的罚金。则因不在时间窗内将产品送到客户点而产生的处罚成本用C5表示,公式如下所示:

        

    其中:分别表示车辆早于和晚于时间窗将货物卸下而带来的损失成本。为车辆到达客户 j 的时刻,为车辆在客户 j 处等待的时间。

    3 问题求解

    蚁群算法(Ant Colony Algorithm)可以很好地解决 VRP,因为该算法在满足各需求点的时间窗约束的前提下采用动态信息策略, 以保证在每次搜索中每只蚂蚁都对搜索做出贡献, 

    最快地找到最优解或满意解。简单来说,此算法是一种源于自然界中生物世界新的仿生类随机型、智能多主体搜索算法,它吸收了昆虫王国中蚂蚁的行为特性,通过其内在的搜索机制,在一系列困难的路径优化问题求解中取得了成效。所以本文打算通过 MATLAB 强大的计算功能编写蚁群算法程序来深入研究冷链物流路径优化问题。

    基本蚁群算法的思路如下:

    Begin

    初始化:

    Nc    0;Nc为迭代次数)

    对各边弧(i,j;

            常数c;(较小的正数)    0;

         Ca    L;ca为车辆的剩余载重量)

         Cb    N;Cb为车辆的剩余行驶距离)

     读入其他输入参数;

     Loop:

         将初始点放入当前的解集中;

         While(不满足停机准则)do

         begin

         对每只蚂蚁k;

             按照剩余载重量,剩余行驶路径长和转移概率选择顶点j;

             将蚂蚁k从顶点i转移到顶点j;

             将顶点i放在当前的解集中;

         end

         当所有的城市都放在解集中,就记录蚂蚁的个数M    k;

         利用局部搜索机制来优化路径;

         然后计算每只蚂蚁的目标函数值;

         并计算当前的最好解;

         For k   1toM do

         begin

             对各边(i,j,计算:;(增加的信息素)

         end

             对各边(i,j,计算:;(轨迹更新)

             对各边(i,j,;

             ;

             Nc<预定的迭代次数,则go to Loop;

         End 

    部分程序
    %     Author:    怡宝2号			博士猿工作室
    %     Use:       用蚁群算法求解有容量限制、时间窗限制的车辆路径问题;
    %                坐标视自己的具体情况而定。
    %     Illustrate:输入变量(must):     
    %                              coordinate:要求的相应点的坐标,第一行是点的横坐标,第二行是点的纵坐标
    %                                demand(1*n),n表示工厂的个数;t表示各个工厂要求运送的货物的重量
    %                                LimitW:每辆车限制的载重量
    %       Can—changed parameter: m:蚁群的规模
    %                                MAXGEN:蚁群的最大迭代代数
    %                               
    %                  输出:        bestpop:最短路程对应的路径
    %                                trace :最短路程
    %				  remark:    如有疑问请咨询qq:778961303
    clc
    clear all
    close all
    format compact
    
    %蚁群参数初始化
    Alpha = 1;        %求解选择下一个城市的概率
    Beta = 5;         %求解选择下一个城市的概率
    Rho = 0.75;       %信息素的全局更新
    Q = 200;          %信息素增加强度系数
    Elite = 1;        %精英蚂蚁数量
    
    m = 40;           %每一代有40只蚂蚁
    MAXGEN = 100;     %最大迭代代数
    Prab = 0.05;      %伪随机选择概率
    
    %读取初始数据,初始化成本函数的参数
    [F,C,P,ZETA1,ZETA2,THETA,R,S,ELTAT,COSTP,V,BETA,OMEGA1,OMEGA2,coordinate,demand,ET,LT,ST,speed, LimitW] = initial();          
    
    %求各个客户点之间的距离
    [Distance n] = CalculateD(coordinate);      %n为客户数量,包括配送中心
    
    Eta=1./Distance;        %Eta为启发因子,离散模型设为距离的倒数
    Tau=ones(n,n);          %Tau为信息素矩阵,行:前一个城市的标号;列:后一个城市的标号。
    Tabu=zeros(m,n+20);     %存储并记录路径的生成
    
    bestpop = zeros(MAXGEN,n+20);       %每代最优的蚂蚁
    trace = zeros(MAXGEN,1);            %每代最小的成本
    
    %迭代寻优开始开始
    load = 0;               %初始化载重
    NC=1;                   %迭代计数器 
    while NC<=MAXGEN
        
        Tabu(:,1)=1;        %每只蚂蚁都是从仓库(及节点1)开始出发
        
        %精英保留策略
        start = 1;
        if 2<=NC
            start = Elite + 1;
        end
        
        for i=start:m
            visited=Tabu(i,:);
            visited=visited(visited>0);
            to_visit=setdiff(1:n,visited);         %在集合论中,to_visit = (1:n) - visited
            
            actualST = zeros(n,1);                 %实际服务时间,初始化,一只蚂蚁初始化一次
            actualST(1) = ET(1);                   %对初始点的服务时间,初始化
            j=1;
            while j<=n
                if ~isempty(to_visit)              %判断所有客户点是否送完
                    %计算接下来要参观的其他城市的概率
                    for k=1:length(to_visit)
                        [Tij actualST] = CalculateT( visited(end) , to_visit(k) ,actualST,Distance,ST,speed);            %计算从客户i到达客户j的时间
                        VC = CalculateVC( visited(end) , to_visit , actualST , Distance , ST, speed, LT);                 %计算从客户i到下一个客户的潜在客户
                        x(k)=(Tau(visited(end),to_visit(k))^Alpha)*(Eta(visited(end),to_visit(k))^Beta)*...
                             1/( abs(Tij-ET(to_visit(k))) + abs(Tij-LT(to_visit(k))) )*VC;
                    end
                    
                    %伪随机选择,选择下一个城市
                    temp_pra=rand;
                    if temp_pra<Prab                %如果满足伪随机选择概率,直接选择概率最大的,这样收敛更快
                        Select=find(max(x));
                    else
                        x=x/(sum(x));               %用轮盘赌法选择下一个城市
                        xcum=cumsum(x); 
                        Select=find(xcum>=rand);
                    end                
                    
                    %计算车的载重
                    if isempty(Select)              %如果选不了下一个城市了,就回到1点
                        Select=1;
                        load=load+demand(Select);   %select=1;t(select)=0
                    else
                        load=load+demand(to_visit(Select(1)));       %select表示城市标号,to_visit(select)才表示城市
                    end
                    
                    %判断载重是否超限,并对路径表修改
                    if load>W                  %判断车是否超载,超载就回到原地
                        Select=1;
                        j=j-1;                      %j表示参观了的城市,参观的城市-1
                        load=0;                     %车辆的载重归零
                        Tabu(i,length(visited)+1)=Select(1);      %给车辆的路径信息赋值,及回到原点,要参观的客户赋值为1.
                    else
                        Tabu(i,length(visited)+1)=to_visit(Select(1));
                    end
                    
                end
                
                %对访问过的客户,和待访问的客户初始化
                visited=Tabu(i,:);
                visited=visited(visited>0);                  %已经拜访过的客户
                to_visit=setdiff(1:n,visited);
                x=[];
                if visited(end)~=1
                    Tabu(i,1:(length(visited)+1))=[visited,1];
                end
                j = j+1;
                j;
            end
            %1只蚂蚁配送路线完成
            load = 0;
        end
        %m只蚂蚁路线安排完成
        
        %计算m只蚂蚁的个体适应度
        L=zeros(m,1);               %共有m只蚂蚁
        for i=1:m 
            temp=Tabu(i,:); 
            route=temp(temp>0);     %每只蚂蚁的路径
        end
        
        %精英保留策略
        [ex index] = sort(L,'ascend');
        index = index(1:Elite);
        temp = Tabu(index,:);
        tempL = L(index);
        Tabu(1:Elite,:) = temp;
        L(1:Elite) = tempL;
        
        [mintrace index] = min(L);  %最小的成本
        temp = Tabu(index(1),:);    %最小成本对应的蚂蚁
        trace(NC) = mintrace;       %保存每代的最小成本和最小蚂蚁
        bestpop(NC,:) = temp;
        
        %更新信息素
        Delta_Tau=zeros(n,n);
        for i=1:m
            temp=Tabu(i,:); 
            route=temp(temp>0);
            for j=1:(length(route)-1) 
                Delta_Tau(route(j),route(j+1))=Delta_Tau(route(j),route(j+1))+Q/L(i);
            end
            Delta_Tau(route(n),route(1))=Delta_Tau(route(n),route(1))+Q/L(i);
        end
    %     %信息素更新
    %     Delta_Tau=zeros(n,n); 
    %     for i=1:m 
    %         temp=Tabu(i,:); 
    %         route=temp(temp>0);
    %         for j=1:(length(route)-1) 
    %             Delta_Tau(route(j),route(j+1))=Delta_Tau(route(j),route(j+1))+Q/L(i);
    %         end
    %     end
    %     Tau=(1-Rho).*Tau+Delta_Tau;
        
        %路径清零,载荷清零
        temp=zeros(m-Elite,n+20); 
        Tabu(Elite+1:m,:) = temp;
        load=0;    
        
        disp(['共迭代',num2str(MAXGEN),'次,现在为:',num2str(NC)]);
    %     NC
        NC = NC + 1;
    end
    
    %绘制寻优迭代图
    figure()
    plot(trace)
    plot(trace,'--b',...
        'LineWidth',2);
    grid off
    xlabel('迭代次数数')
    ylabel('成本')
    title('成本变化','fontsize',16)
    
    %显示路径
    [mintrace index] = min(trace);              %最小成本
    route = bestpop(index,:);                   %最小成本的路径
    route = route( route>0 );
    p=num2str(route(1));
    for i=2:length(route)
        p=[p,'->',num2str(route(i))];
    end
    display(['求解的最优路径为:',num2str(p)]);
    display(['1代表物流中心']);
    disp(['最小的成本代价为:',num2str(min(trace))]);
    
    %绘制最小成本的路径
    figure();
    DrawRoute(coordinate,route)
    
    %				  remark:    如有疑问请咨询qq:778961303

    结果





    展开全文
  • 2020前端学习路线收集整理

    千次阅读 多人点赞 2019-12-08 15:05:24
    本人18年毕业,刚毕业自学Java,第一份工作因部门解散,时效半年,其实那时我一直在想往前端发展,恰巧拿下家offer,第二份工作确实是前端,不过是客户是银行,样式全部统一,与我想象的色彩缤纷的前端完全不符,...

            本人18年毕业,刚毕业自学Java,第一份工作因部门解散,时效半年,其实那时我一直在想往前端发展,恰巧拿到下家offer,第二份工作确实是前端,不过是客户是银行,样式全部统一,与我想象的色彩缤纷的前端完全不符,时效3个半月。

            为了更好的规划自己的学习路线,我上过中国大学mooc,百度前端学院,github上搜集前端学习路线,报了北大青鸟的培训班,买了慕课网的前端就业班课程,也跟着陈皓大佬的程序员练级攻略进行学习,目前已经把基础HTML\CSS\Js学完了,培训机构中项目做的太浅,讲课太快,不专业,这里不多做赘述,下面是2020年最新的前端学习路线,希望大家不要因为英语而发怵,都是纸老虎,多搜索,勤动手。

    先上一个github上拿的前端学习路线图 

    通用技能

         英语好的同学看起来应该没什么问题,不懂的可以使用有道词典查一查。

    下面介绍百度前端学院的学习路线,百度前端学院的路线是从中国大学mooc看的。

    1、入门

    目标1:培养兴趣
    知识:HTML CSS JavaScript
    实践:个人主页 小时钟 计算器 小动画
    多去看看一些酷炫的前端效果,去尝试模仿

    目标2:系统地学习,打好基础
    知识:HTML CSS JavaScript
    实践:针对知识点的大强度练习
    方法:总结 重构 多问为什么

    2、尝试

    目标:能够完成小型复杂度网站
    实践:
    个人任务管理、 日期时间组件、 图片管理、 拖拽、 进度管理工具 、甘特图
    方法:复用 积累问题
    从百度前端学院中寻找合适的练习题目来进行练习

    3、主流

    目标:学习主流方案解决问题的思路
    知识:MVVM、 React、 Vue、 Redux、 SASS、 LESS、 PostCSS、 WebPack、 Rollup
    实践:不断重构
    方法:发展历史 场景问题 设计思想

    4、视野

    目标:广度认知
    知识:Node.js、WebAssembly、Mobile、Hybird、GO、Dust、 Flutter、WebGL、Canvas、SVG、Electron、TypeScript 、PWA
    方法:学会提炼核心思想

    5、进阶

    目标:具备中型复杂度开发经验
    实践:重构+新轮子
    方法:学会提炼核心思想

    6、专攻

    目标:对一个领域进行深度掌握、打磨自己的技术学习方法  

    极客时间-H5技能图谱&前端工程师必备技能

    接下来介绍慕课网的学习路线,个人觉得我的前端知识大都是从慕课网上学的,学习路线大家可以去官网查看,基础的知识总体学下来确实需要一定的耐心,知识点很多,要多加练习,在学到jQuery的时候就已经开始对线性渐变和径向渐变有点记不清了,要多加练习,死记硬背是无法驾驭前端的。

    当然还有比如说网络协议、浏览器工作原理、数据结构与算法也都是比较重要的、如果你对高等数学、线性代数、概率统计比较感兴趣的话也可以去学习学习,谢谢查阅 :)

    20200421添加: 在学到一个知识点的时候如果还是不求甚解一定要去MDN上看看。

    20210102  这里关于学习路线的收集就不更了,相信想学前端的同志们在入门这件事情应该是挺简单的,接下来本人要进入下一阶段了,大前端,不好意思又是慕课网的,嘻嘻,下一步增强技术能力的同时,也会分出来一些给自己的身体健康,家人的身体健康,以及更重要的是关于配偶的各项事宜,2021年又将是忙碌的一年,国家有五年计划,我们个人也应该有5年计划,比如工资变成双倍这样明确的目标,加油吧,干饭人永不言饱。

    展开全文
  •   软件的生命周期是指从软件产品的设想开始软件不在使用而结束的时间。   软件的生命周期分为6个阶段,即需求分析、计划、设计、编码、测试、运行维护。 1. 瀑布模型   瀑布模型是最早出现的软件开发模型,...
  • 1.4客户需求 二、快速原型模型 2.1什么是快速原型模型 2.2优缺点 2.3快速原型模型的思想产生、原理及运用方式 2.4类型 2.5开发步骤 三、增量模型 3.1什么是增量模型 3.2特点 3.3优缺点 3.4作用 四、螺旋...
  • 航空公司客户流失分析

    千次阅读 2019-07-27 09:47:01
    背景与分析方法 本文是接着航空公司客户价值分析,这是拓展思考的部分,这里简单的将它做了一下。...客户流失分析针对老客户进行分析预测,这里的老客户定义为飞行次数大于6次的客户。用航空公司客户信息数据来进行...
  • 任正非《以客户为中心》

    千次阅读 2020-02-09 16:01:50
    第1.1节:为客户服务 企业活下去的根本来看,企业要有利润,但利润只能从客户那里来。华为的生存本身就是靠满足客户需求,提供客户所需的产品和服务并获得合理的回报来支撑。 任何一家企业成功的不二法门就是最大...
  • 一个产品一种产业的出现意味着有客户的需求,从概念部分产品落地,智能家居如今的发展可谓风起云涌,然而你知道智能家居的潜在“客户”都有哪些人吗?  一、喜欢智能单品的年轻人。此潜在用户群是最能接受新奇...
  • 如何找到精准优质的股民客户

    千次阅读 2020-03-17 15:11:53
    第六、如果你既没有财力也没有人脉,那么你很渴望寻找到一些比较优质的股民客户。怎么办呢?那么笔者建议你多关注一些专业网站,比如财经网、又比如人才网。或者一些大型金融论坛。一是去积累一些粉丝,而是有直接...
  • 也就是说,如果您正在寻找关于数据中关系的描述,那建议首选其他方法。  适用范围:  随机森林算法可被用于很多不同的领域,如银行,股票市场,医药和电子商务。在银行领域,它通常被用来检测那些比普通人更高频率...
  • 软件实施工程师职业规划

    万次阅读 多人点赞 2018-06-27 10:12:59
    身为软件实施顾问,你不能不了解你的产品,当然你可以了解得粗略,不必象技术工程师那样精通,你要能够回答客户提出的大部分问题,需要你掌握的知识非常综合、全面——强调的是广度而不是深度,当然,如果你的深度够好,...
  • YBB保险电话销售公司已经做完了针对20万用户发放赠险产品的工作,想从接受赠险的客户中,找出会在将来购买付费型保险的客户,从而进行电话营销。为此,YYB公司从20万人中随机选取了5万人向其电话推销付费型保险,...
  • Python 银行信用卡客户流失预测(kaggle)

    千次阅读 多人点赞 2020-12-08 08:08:00
    1.背景越来越多的客户不再使用信用卡服务,银行的经理对此感到不安。如果有人能为他们预测哪些客户即将流失,他们将不胜感激,因为这样他们可以主动向客户提供更好的服务,并挽回这些即将流失的客户...
  • 基于WEB的客户关系管理系统

    千次阅读 2017-11-20 14:29:26
    第一章 客户关系管理绪论 客户关系管理CRM(Customer Relationship Management)最早由美国artner Group提出,自1997年开始,经过几年的发展,全球的CRM市场一直处于爆炸性的快速增长之中。1999年全球的CRM市场...
  • 本篇文章将会介绍用Python分析银行定期存款产品目标客户的确定详细建模细节,业务框架分析以及模型的选择与评估分析参见上一篇文章: 银行定期存款产品目标客户的确定——基于逻辑回归(建模前分析) 1.导入各种...
  • 但以上只是一个企业客户开发工作中的冰山一角,要成功做好企业的客户开发工作,企业需要从自身资源情况出发,了解竞争对手在客户方面的一些策略性打法,制定适合自身企业的客户开发战略,再落实销售一...
  • 航空公司客户价值分析(正版/超详细/附数据)

    千次阅读 多人点赞 2020-09-10 17:57:23
    通过客户分类,对客户群体进行细分,区别出低价值客户、高价值客户,对不同的客户群体开展不同的个性化服务,将有限的资源合理地分配给不同价值的客户,实现效益最大化。 本章将使用航空公司客户数据,结合RFM模型,...
  • 基于java的客户关系管理系统

    万次阅读 多人点赞 2018-04-26 23:07:18
    基于java的客户关系管理系统emmmm本系统带程序说明书 有需要的可以去我上传的资源里面找,找不的话,评论我,或者站内私信留下邮箱,我看到机会给你发,也可以主动联系我博客名。因为最近太忙一直没有上传完。我会...
  • 拓展客户的方法介绍

    千次阅读 2020-06-24 11:04:29
    门店怎么寻找客户,一直是一个老生常谈的话题。客户,是一个门店最重要的收入来源,有客户,才有收益。如何找到客户,并不断拓展客户呢? 第一种、老客户带新客户法 众所周知,老客户带新客户,是用的比较多的...
  • java项目——CRM客户管理系统(SpringBoot+MyBatis)

    千次阅读 多人点赞 2021-06-01 20:23:31
    目录CRM客户管理系统一.对CRM的项目的简单描述1.什么是CRM2.CRM开发环境和技术<1> 项目业务介绍<2>开发环境<3>开发技术二.项目准备及模块分析1.模块分析总览2.项目前期环境的搭建三.项目的正式...
  • 聚类分析——客户分群分析

    千次阅读 2020-05-27 14:06:37
    聚类分析练习——客户分群
  • 《全球商业经典》2月刊...几年前,陕西省某市的市委书记给她介绍了一个客户,市委书记也是她的老客户。  风水:一门学问?一门一生意!  2013年1月9日,为了见澳门赌王何鸿燊的风水师林元群,我被带了广东中山和
  • Excel数据分析--客户对象分析

    千次阅读 2018-12-06 14:26:50
    最近一直也在学习Excel相关的知识,在学的过程中,觉得Excel在少量数据分析这块功能还是很强大的,尤其是在清理数据方向...1、拿相关的统计数据 2、根据问题思考什么样的客户意向最大,提出问题 3、根据问题,清...
  • 哪里能找到海量的客户信息?

    千次阅读 2015-04-17 08:43:30
    要获得满意的销售业绩,除了产品质量要过硬、新颖,有吸引力外,加大产品销售的覆盖面,提高营销的精准度,才能“抢”更多的客户。 事实上,做产品营销,也如同生产产品一样,首先需要原材料,而营销的原材料...
  • 根据美国工业协会统计,产品失败的原因核心有6个,如下图,其中不适当的市场分析排名第一,独占产品失败原因的32%,客户需求分析又是市场分析中非常重要的内容,可以这样说,能否有效洞察客户需求是产品成败的关键...
  • 应用数据挖掘进行客户关系管理

    千次阅读 2018-05-18 21:16:05
    客户关系管理的目标是缩减销售周期和销售成本、增加收人、寻找扩展业务所需的新的市场和渠道、以及提高客户的价值、满意度、赢利性和忠实度。企业实施客户关系管理,可以更低成本、更高效率地满足客户的需求,从而...
  • (转)大数据证券行业客户360度画像

    千次阅读 2016-12-23 13:17:46
    获取客户、了解客户、然后寻找客户、再进行服务,并找到触达客户的方式,在正确的时间、使用正确的产品、用正确定的方式送达客户,是移动互联网时代客户全息画像的目的。进入移动互联网后,浏览手机已经成为
  • 项目总结(1)-客户管理系统

    千次阅读 2014-09-08 13:32:38
    1.客户管理系统的总结 (1).总体采用mvc的设计模式,以jsp为view层,用servlet做控制层,service做业务层,dao数据层,上层对下层的调用关系. (2).除了welcome.jsp页面用户可以 直接访问,其他的页面用户不能访问,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 151,180
精华内容 60,472
关键字:

怎么寻找到客户