基于GA遗传算法的TSP旅行商问题求解
阅读原文时间:2023年07月08日阅读:3
import random
import math
import matplotlib.pyplot as plt
import city
class no:                       #该类表示每个点的坐标
    def __init__(self,x,y):
        self.x = x
        self.y = y

def draw(t):              #该函数用于描绘路线图
    x = [0] * (m+1)
    y = [0] * (m+1)
    for i in range(m):
        x[i] = p[t[i]].x
        y[i] = p[t[i]].y
    x[m] = p[t[0]].x
    y[m] = p[t[0]].y
    plt.plot(x,y,color='r',marker='*' )
    plt.show() 

def GA_TSP(pc_=0.9,pm_=0.2,n_=10,cross=1,epochs=10000):
    '''与禁忌搜索算法的对比'''
    global n,m,pc,pm,best,p,dna,value,way
    p = []
    pc = pc_
    pm = pm_     #pc为交配概率 pm为变异概率
    best = 1000           #best记录最优距离,初始化无限大
    n = n_           #n:样本个数
    m = 100          #m:城市个数
    dna = [[0]*(m) for i in range(n)]   #开辟n*m的数组
    value = [0.0]*n                        #value数组记录个体适应度
    way = [0]*m                          #way数组记录最优解路线
    mycol()            #数据输入
    init()                 #群体初始化
    a = []
    for i in range(epochs):      #控制进化次数
        slove(cross)
        a.append(best)
    #draw(way)                     # 画图描绘路线
    #print("The way is",way)                     # 打印路线,以序列表示
    #print("************************")
    return a

def mutation(x):   # 变异操作函数
    x1 = [0]*m
    for i in range(m):
        x1[i] = x[i]
    a = random.randint(0,m-1)    #随机选出两个点,将之间各点进行倒置
    b = random.randint(0,m-1)
    if(a > b):
        a,b = b,a
    le = b - a + 1
    for i in range(le):
        x[a+i] = x1[b-i]

def mycol():     #城市坐标输入
    '''
    p.append(no( 16 , 96 ))
    p.append(no( 16 , 94 ))
    p.append(no( 20 , 92 ))
    p.append(no( 22 , 93 ))
    p.append(no( 25 , 97 ))
    p.append(no( 22 , 96 ))
    p.append(no( 20 , 97 ))
    p.append(no( 17 , 96 ))
    p.append(no( 16 , 97 ))
    p.append(no( 14 , 98 ))
    p.append(no( 17 , 97 ))
    p.append(no( 21 , 95 ))
    p.append(no( 19 , 97 ))
    p.append(no( 20 , 94 ))
    '''
    a = dict.values(city.china)
    a = list(a)
    for i in range(30):
        p.append(no(a[i][0],a[i][1]))

def init():        #初始化函数 随机产生初始个体
    vis = [0] * m
    num = 0
    for i in range(n):
        for j in range(m):
            vis[j] = 0
        for j in range(m):
            num = random.randint(0,m-1)
            while(vis[num] == 1): # 第num个城市已被占用,需要重新选择num
                num = random.randint(0,m-1)
            vis[num] = 1 # 表示第num个城市被使用
            dna[i][j] = num # 表示第j步去第num个城市

def get_value(t):        #适应度计算,即计算当先线路的距离
    # t就是dna[i],一个列表,长度为m
    ans = 0.0
    for i in range(1,m):     #两点距离公式
        ans += math.sqrt((p[t[i]].x-p[t[i-1]].x) * (p[t[i]].x-p[t[i-1]].x) + (p[t[i]].y-p[t[i-1]].y) * (p[t[i]].y-p[t[i-1]].y))
    ans += math.sqrt((p[t[0]].x-p[t[m-1]].x) * (p[t[0]].x-p[t[m-1]].x) + (p[t[0]].y-p[t[m-1]].y) * (p[t[0]].y-p[t[m-1]].y))#计算首尾结点的距离
    return ans

def find(x,num,a=0,b=99):     #交叉算子运算时判断是否出现重复的城市id
    for i in range(a,b+1):
        if(num[i] == x):
            return i
    return -1   

def cross2(x,y): # 均匀交叉法
    x1 = [0] * m
    y1 = [0] * m
    sample = []
    for i in range(m):
        x1[i] = x[i]
        y1[i] = y[i]
        sample.append(random.randint(0,1))
        #print(sample)
    for i in range(m):      #交叉运算
        if(sample[i]==0): # 模板值为0则xy交换
            if(y[i] not in x1):
                x1[i] = y[i]
            if(x[i] not in x1):
                y1[i] = x[i]

def cross1(x,y): # 多点交叉法
    x1 = [0]*m
    y1 = [0]*m
    for i in range(m):
        x1[i] = x[i]
        y1[i] = y[i]
    a =  random.randint(0,m-1)    #随机产生两个点
    b = random.randint(0,m-1)
    if(a > b):
        a,b = b,a
    for i in range(a):      #交叉运算
        x1[i]=y[i]
        y1[i]=x[i]
    for i in range(b+1,m):
        x1[i]=y[i]
        y1[i]=x[i]
    ob = 0
    for i in range(m):       #判断交叉的合法性并进行维护,直到交叉成功
        if(i<a or i>b):
            ob = find(x1[i],x1,a,b)
            while(ob != -1):#x1[i]与x[ob]重复
                x1[i] = y1[ob]#y1[ob]即y[ob],必与x[ob](x1[ob])不同,将之赋给x1[i],出现不重复概率更高
                ob = find(x1[i],x1,a,b)#再次检测
    for i in range(m):     #操作同上,维护另一新个体的交叉合法性。
        if(i<a or i>b):
            ob = find(y1[i],y1,a,b)
            while(ob != -1):
                y1[i] = x1[ob]
                ob = find(y1[i],y1,a,b)
    for i in range(m):
        x[i] = x1[i]
        y[i] = y1[i]

def cross(x,y):  # 一点交叉法
    x1 = [0]*m
    y1 = [0]*m
    for i in range(m):
        x1[i] = x[i]
        y1[i] = y[i]
    a =  random.randint(0,m-1)    #随机产生一个点
    for i in range(a):      #交叉运算
        x1[i]=y[i]
        y1[i]=x[i]
    ob = 0
    for i in range(m):       #判断交叉的合法性并进行维护,直到交叉成功
        if(i<a):
            ob = find(x1[i],x1,a)
            while(ob != -1):#x1[i]与x[ob]重复
                x1[i] = y1[ob]#y1[ob]即y[ob],必与x[ob](x1[ob])不同,将之赋给x1[i],出现不重复概率更高
                ob = find(x1[i],x1,a)#再次检测
    for i in range(m):     #操作同上,维护另一新个体的交叉合法性。
        if(i<a):
            ob = find(y1[i],y1,a)
            while(ob != -1):
                y1[i] = x1[ob]
                ob = find(y1[i],y1,a)
    for i in range(m):
        x[i]=x1[i]
        y[i]=y1[i]

def slove(choice): # 总执行函数
    global best
    for i in range(n):               # 选择
        value[i] = get_value(dna[i]) # 计算距离
    max_id = value.index(max(value)) # 记录id
    min_id = value.index(min(value))
    if(value[min_id] < best):
        best = value[min_id]
        for i in range(m):
            way[i] = dna[min_id][i]
    value[max_id] = value[min_id]  # 最优保存策略:最优解覆盖最差解
    fa = -1
    for i in range(m):
        dna[max_id][i] = dna[min_id][i]
    for i in range(n):                # 交叉
        if(random.random()> pc or i == max_id or i == min_id):
            continue
        if(fa == -1): # fa的判断让每两个样本才能有一次交叉操作
            fa = i
        else :
            if(choice==1):
                cross1(dna[fa], dna[i])  # 均匀交叉
            if(choice==2):
                cross2(dna[fa], dna[i]) # 多点交叉
            if(choice==3):
                cross3(dna[fa], dna[i]) # 一点交叉
            fa = -1
    for i in range(n):              #变异运算
        if(random.random()> pm or i == max_id or i == min_id):
            continue
        mutation(dna[i])

def main(pc_=0.9,pm_=0.2,n_=10,cross=1,epochs=10000):
    global n,m,pc,pm,best,p,dna,value,way
    p = []
    pc = pc_
    pm = pm_     #pc为交配概率 pm为变异概率
    best = 1000           #best记录最优距离,初始化无限大
    n = n_           #n:种群样本个数
    m = 30          #m:城市个数
    dna = [[0]*(m) for i in range(n)]   #开辟n*m的数组
    value = [0.0]*n                        #value数组记录个体适应度
    way = [0]*m                          #way数组记录最优解路线
    mycol()            #数据输入
    init()                 #群体初始化
    for i in range(epochs):      #控制进化次数
        slove(cross)
    print("The distance is",round(best,2)) #打印距离

    #draw(way)                     # 画图描绘路线
    #print("The way is",way)                     # 打印路线,以序列表示
    #print("************************")
    return best

if __name__ == "__main__":
    k = 0
    #main(epochs=200)
    if(k==1):
        """不同交叉方法的性能表现"""
        way_cross = []
        distance1 = []
        distance2 = []
        distance3 = []
        for i in range(1,16):
            print(i)
            epoch = i*1000
            way_cross.append(epoch)
            print("一点交叉法",end=' ')
            distance1.append(main(cross=1,epochs=epoch)) # 一点交叉
            print("多点交叉法",end=' ')
            distance2.append(main(cross=2,epochs=epoch)) # 多点交叉
            print("均匀交叉法",end=' ')
            distance3.append(main(cross=3,epochs=epoch)) # 均匀交叉
        plt.plot(way_cross,distance1,color='green',label='One-point Crossing')
        plt.plot(way_cross,distance2,color='blue',label='Multi-point Crossing')
        plt.plot(way_cross,distance3,color='red',label='Uniform Crossing')
        plt.plot(way_cross,distance1,color='green')
        plt.plot(way_cross,distance2,color='blue')
        plt.plot(way_cross,distance3,color='red')
        plt.xlabel('way_cross')
        plt.ylabel('distance')
        plt.title('The effect of the way of cross on the distance')
        plt.legend()
    elif(k==2):
        """不同交叉概率的性能表现"""
        cross_probability = []
        distance = []
        for i in range(1,5):
            print("the probability of cross is %.1f"%(i*0.2))
            cross_probability.append(i*0.2)
            distance.append(main(pc_=i*0.2,epochs=40000))
            plt.plot(cross_probability,distance)
            plt.xlabel('cross_probability')
            plt.ylabel('distance')
            plt.title('The effect of the probability of cross on the distance')
    elif(k==3):
        """不同变异概率的性能表现"""
        mutation_probability = []
        distance = []
        for i in range(1,10):
            print("the probability of mutation is %.1f"%(i*0.1))
            mutation_probability.append(i*0.1)
            distance.append(main(pc_=i*0.1,epochs=30000))
            plt.plot(mutation_probability,distance)
            plt.xlabel('mutation_probability')
            plt.ylabel('distance')
            plt.title('The effect of the probability of mutation on the distance')
    elif(k==4):
        """不同样本个数的性能表现"""
        sample_numbers = []
        distance = []
        for i in range(2,10):
            print("the numbers of sample is %d"%(i*2))
            sample_numbers.append(i*2)
            distance.append(main(n_=i*2))
            plt.plot(sample_numbers,distance)
            plt.xlabel('sample_numbers')
            plt.ylabel('distance')
            plt.title('The effect of the number of sample on the distance')
    elif(k==5):
        """不同迭代次数的性能表现"""
        epopchs = []
        distance = []
        for i in range(1):
            print("epochs = %d"%(i*3000+1000))
            epopchs.append(i*3000+1000)
            distance.append(main(epochs=i*3000+1000))
            plt.plot(epopchs,distance)
            plt.xlabel('epochs')
            plt.ylabel('distance')
            plt.title('The effect of the number of epochs on the distance')
    elif(k==6):
        '''遗传算法与禁忌搜索算法的比较'''
        from 禁忌TSP import TSA_TSP
        way_cross = []
        distance1 = []
        distance2 = []
        i = 500
        epoch = [x for x in range(1,i+1)]
        #distance1.append(main(epochs=epoch))
        #distance2.append(comparasion(epoch))
        plt.plot(epoch,GA_TSP(epochs=i),color='blue',label='GA')
        plt.plot(epoch,TSA_TSP(i),color='red',label='TSA')
        plt.xlabel('epochs')
        plt.ylabel('distance')
        plt.title('The effect of the difference methods on the distance')

    #plt.legend()
    #plt.show()
    main()

city.py:

china = {
    "海门": [121.15, 31.89],
    "鄂尔多斯": [109.781327, 39.608266],
    "招远": [120.38, 37.35],
    "舟山": [122.207216, 29.985295],
    "齐齐哈尔": [123.97, 47.33],
    "盐城": [120.13, 33.38],
    "赤峰": [118.87, 42.28],
    "青岛": [120.33, 36.07],
    "乳山": [121.52, 36.89],
    "金昌": [102.188043, 38.520089],
    "泉州": [118.58, 24.93],
    "莱西": [120.53, 36.86],
    "日照": [119.46, 35.42],
    "胶南": [119.97, 35.88],
    "南通": [121.05, 32.08],
    "拉萨": [91.11, 29.97],
    "云浮": [112.02, 22.93],
    "梅州": [116.1, 24.55],
    "文登": [122.05, 37.2],
    "上海": [121.48, 31.22],
    "攀枝花": [101.718637, 26.582347],
    "威海": [122.1, 37.5],
    "承德": [117.93, 40.97],
    "厦门": [118.1, 24.46],
    "汕尾": [115.375279, 22.786211],
    "潮州": [116.63, 23.68],
    "丹东": [124.37, 40.13],
    "太仓": [121.1, 31.45],
    "曲靖": [103.79, 25.51],
    "烟台": [121.39, 37.52],
    "福州": [119.3, 26.08],
    "瓦房店": [121.979603, 39.627114],
    "即墨": [120.45, 36.38],
    "抚顺": [123.97, 41.97],
    "玉溪": [102.52, 24.35],
    "张家口": [114.87, 40.82],
    "阳泉": [113.57, 37.85],
    "莱州": [119.942327, 37.177017],
    "湖州": [120.1, 30.86],
    "汕头": [116.69, 23.39],
    "昆山": [120.95, 31.39],
    "宁波": [121.56, 29.86],
    "湛江": [110.359377, 21.270708],
    "揭阳": [116.35, 23.55],
    "荣成": [122.41, 37.16],
    "连云港": [119.16, 34.59],
    "葫芦岛": [120.836932, 40.711052],
    "常熟": [120.74, 31.64],
    "东莞": [113.75, 23.04],
    "河源": [114.68, 23.73],
    "淮安": [119.15, 33.5],
    "泰州": [119.9, 32.49],
    "南宁": [108.33, 22.84],
    "营口": [122.18, 40.65],
    "惠州": [114.4, 23.09],
    "江阴": [120.26, 31.91],
    "蓬莱": [120.75, 37.8],
    "韶关": [113.62, 24.84],
    "嘉峪关": [98.289152, 39.77313],
    "广州": [113.23, 23.16],
    "延安": [109.47, 36.6],
    "太原": [112.53, 37.87],
    "清远": [113.01, 23.7],
    "中山": [113.38, 22.52],
    "昆明": [102.73, 25.04],
    "寿光": [118.73, 36.86],
    "盘锦": [122.070714, 41.119997],
    "长治": [113.08, 36.18],
    "深圳": [114.07, 22.62],
    "珠海": [113.52, 22.3],
    "宿迁": [118.3, 33.96],
    "咸阳": [108.72, 34.36],
    "铜川": [109.11, 35.09],
    "平度": [119.97, 36.77],
    "佛山": [113.11, 23.05],
    "海口": [110.35, 20.02],
    "江门": [113.06, 22.61],
    "章丘": [117.53, 36.72],
    "肇庆": [112.44, 23.05],
    "大连": [121.62, 38.92],
    "临汾": [111.5, 36.08],
    "吴江": [120.63, 31.16],
    "石嘴山": [106.39, 39.04],
    "沈阳": [123.38, 41.8],
    "苏州": [120.62, 31.32],
    "茂名": [110.88, 21.68],
    "嘉兴": [120.76, 30.77],
    "长春": [125.35, 43.88],
    "胶州": [120.03336, 36.264622],
    "银川": [106.27, 38.47],
    "张家港": [120.555821, 31.875428],
    "三门峡": [111.19, 34.76],
    "锦州": [121.15, 41.13],
    "南昌": [115.89, 28.68],
    "柳州": [109.4, 24.33],
    "三亚": [109.511909, 18.252847],
    "自贡": [104.778442, 29.33903],
    "吉林": [126.57, 43.87],
    "阳江": [111.95, 21.85],
    "泸州": [105.39, 28.91],
    "西宁": [101.74, 36.56],
    "宜宾": [104.56, 29.77],
    "呼和浩特": [111.65, 40.82],
    "成都": [104.06, 30.67],
    "大同": [113.3, 40.12],
    "镇江": [119.44, 32.2],
    "桂林": [110.28, 25.29],
    "张家界": [110.479191, 29.117096],
    "宜兴": [119.82, 31.36],
    "北海": [109.12, 21.49],
    "西安": [108.95, 34.27],
    "金坛": [119.56, 31.74],
    "东营": [118.49, 37.46],
    "牡丹江": [129.58, 44.6],
    "遵义": [106.9, 27.7],
    "绍兴": [120.58, 30.01],
    "扬州": [119.42, 32.39],
    "常州": [119.95, 31.79],
    "潍坊": [119.1, 36.62],
    "重庆": [106.54, 29.59],
    "台州": [121.420757, 28.656386],
    "南京": [118.78, 32.04],
    "滨州": [118.03, 37.36],
    "贵阳": [106.71, 26.57],
    "无锡": [120.29, 31.59],
    "本溪": [123.73, 41.3],
    "克拉玛依": [84.77, 45.59],
    "渭南": [109.5, 34.52],
    "马鞍山": [118.48, 31.56],
    "宝鸡": [107.15, 34.38],
    "焦作": [113.21, 35.24],
    "句容": [119.16, 31.95],
    "北京": [116.46, 39.92],
    "徐州": [117.2, 34.26],
    "衡水": [115.72, 37.72],
    "包头": [110, 40.58],
    "绵阳": [104.73, 31.48],
    "乌鲁木齐": [87.68, 43.77],
    "枣庄": [117.57, 34.86],
    "杭州": [120.19, 30.26],
    "淄博": [118.05, 36.78],
    "鞍山": [122.85, 41.12],
    "溧阳": [119.48, 31.43],
    "库尔勒": [86.06, 41.68],
    "安阳": [114.35, 36.1],
    "开封": [114.35, 34.79],
    "济南": [117, 36.65],
    "德阳": [104.37, 31.13],
    "温州": [120.65, 28.01],
    "九江": [115.97, 29.71],
    "邯郸": [114.47, 36.6],
    "临安": [119.72, 30.23],
    "兰州": [103.73, 36.03],
    "沧州": [116.83, 38.33],
    "临沂": [118.35, 35.05],
    "南充": [106.110698, 30.837793],
    "天津": [117.2, 39.13],
    "富阳": [119.95, 30.07],
    "泰安": [117.13, 36.18],
    "诸暨": [120.23, 29.71],
    "郑州": [113.65, 34.76],
    "哈尔滨": [126.63, 45.75],
    "聊城": [115.97, 36.45],
    "芜湖": [118.38, 31.33],
    "唐山": [118.02, 39.63],
    "平顶山": [113.29, 33.75],
    "邢台": [114.48, 37.05],
    "德州": [116.29, 37.45],
    "济宁": [116.59, 35.38],
    "荆州": [112.239741, 30.335165],
    "宜昌": [111.3, 30.7],
    "义乌": [120.06, 29.32],
    "丽水": [119.92, 28.45],
    "洛阳": [112.44, 34.7],
    "秦皇岛": [119.57, 39.95],
    "株洲": [113.16, 27.83],
    "石家庄": [114.48, 38.03],
    "莱芜": [117.67, 36.19],
    "常德": [111.69, 29.05],
    "保定": [115.48, 38.85],
    "湘潭": [112.91, 27.87],
    "金华": [119.64, 29.12],
    "岳阳": [113.09, 29.37],
    "长沙": [113, 28.21],
    "衢州": [118.88, 28.97],
    "廊坊": [116.7, 39.53],
    "菏泽": [115.480656, 35.23375],
    "合肥": [117.27, 31.86],
    "武汉": [114.31, 30.52],
    "大庆": [125.03, 46.58],
    "台湾": [120.96, 23.70],
    "香港": [114.11, 22.40],
    "澳门": [113.54, 22.20]
}
#193个国内城市,198个国外城市
world = {
    "阿富汗": [67.709953, 33.93911],
    "安哥拉": [17.873887, -11.202692],
    "阿尔巴尼亚": [20.168331, 41.153332],
    "阿联酋": [53.847818, 23.424076],
    "阿根廷": [-63.61667199999999, -38.416097],
    "亚美尼亚": [45.038189, 40.069099],
    "法属南半球和南极领地": [69.348557, -49.280366],
    "澳大利亚": [133.775136, -25.274398],
    "奥地利": [14.550072, 47.516231],
    "阿塞拜疆": [47.576927, 40.143105],
    "布隆迪": [29.918886, -3.373056],
    "比利时": [4.469936, 50.503887],
    "贝宁": [2.315834, 9.30769],
    "布基纳法索": [-1.561593, 12.238333],
    "孟加拉国": [90.356331, 23.684994],
    "保加利亚": [25.48583, 42.733883],
    "巴哈马": [-77.39627999999999, 25.03428],
    "波斯尼亚和黑塞哥维那": [17.679076, 43.915886],
    "白俄罗斯": [27.953389, 53.709807],
    "伯利兹": [-88.49765, 17.189877],
    "百慕大": [-64.7505, 32.3078],
    "玻利维亚": [-63.58865299999999, -16.290154],
    "巴西": [-51.92528, -14.235004],
    "文莱": [114.727669, 4.535277],
    "不丹": [90.433601, 27.514162],
    "博茨瓦纳": [24.684866, -22.328474],
    "中非共和国": [20.939444, 6.611110999999999],
    "加拿大": [-106.346771, 56.130366],
    "瑞士": [8.227511999999999, 46.818188],
    "智利": [-71.542969, -35.675147],
    "中国": [104.195397, 35.86166],
    "象牙海岸": [-5.547079999999999, 7.539988999999999],
    "喀麦隆": [12.354722, 7.369721999999999],
    "刚果民主共和国": [21.758664, -4.038333],
    "刚果共和国": [15.827659, -0.228021],
    "哥伦比亚": [-74.297333, 4.570868],
    "哥斯达黎加": [-83.753428, 9.748916999999999],
    "古巴": [-77.781167, 21.521757],
    "北塞浦路斯": [33.429859, 35.126413],
    "塞浦路斯": [33.429859, 35.126413],
    "捷克共和国": [15.472962, 49.81749199999999],
    "德国": [10.451526, 51.165691],
    "吉布提": [42.590275, 11.825138],
    "丹麦": [9.501785, 56.26392],
    "多明尼加共和国": [-70.162651, 18.735693],
    "阿尔及利亚": [1.659626, 28.033886],
    "厄瓜多尔": [-78.18340599999999, -1.831239],
    "埃及": [30.802498, 26.820553],
    "厄立特里亚": [39.782334, 15.179384],
    "西班牙": [-3.74922, 40.46366700000001],
    "爱沙尼亚": [25.013607, 58.595272],
    "埃塞俄比亚": [40.489673, 9.145000000000001],
    "芬兰": [25.748151, 61.92410999999999],
    "斐": [178.065032, -17.713371],
    "福克兰群岛": [-59.523613, -51.796253],
    "法国": [2.213749, 46.227638],
    "加蓬": [11.609444, -0.803689],
    "英国": [-3.435973, 55.378051],
    "格鲁吉亚": [-82.9000751, 32.1656221],
    "加纳": [-1.023194, 7.946527],
    "几内亚": [-9.696645, 9.945587],
    "冈比亚": [-15.310139, 13.443182],
    "几内亚比绍": [-15.180413, 11.803749],
    "赤道几内亚": [10.267895, 1.650801],
    "希腊": [21.824312, 39.074208],
    "格陵兰": [-42.604303, 71.706936],
    "危地马拉": [-90.23075899999999, 15.783471],
    "法属圭亚那": [-53.125782, 3.933889],
    "圭亚那": [-58.93018, 4.860416],
    "洪都拉斯": [-86.241905, 15.199999],
    "克罗地亚": [15.2, 45.1],
    "海地": [-72.285215, 18.971187],
    "匈牙利": [19.503304, 47.162494],
    "印尼": [113.921327, -0.789275],
    "印度": [78.96288, 20.593684],
    "爱尔兰": [-8.24389, 53.41291],
    "伊朗": [53.688046, 32.427908],
    "伊拉克": [43.679291, 33.223191],
    "冰岛": [-19.020835, 64.963051],
    "以色列": [34.851612, 31.046051],
    "意大利": [12.56738, 41.87194],
    "牙买加": [-77.297508, 18.109581],
    "约旦": [36.238414, 30.585164],
    "日本": [138.252924, 36.204824],
    "哈萨克斯坦": [66.923684, 48.019573],
    "肯尼亚": [37.906193, -0.023559],
    "吉尔吉斯斯坦": [74.766098, 41.20438],
    "柬埔寨": [104.990963, 12.565679],
    "韩国": [127.766922, 35.907757],
    "科索沃": [20.902977, 42.6026359],
    "科威特": [47.481766, 29.31166],
    "老挝": [102.495496, 19.85627],
    "黎巴嫩": [35.862285, 33.854721],
    "利比里亚": [-9.429499000000002, 6.428055],
    "利比亚": [17.228331, 26.3351],
    "斯里兰卡": [80.77179699999999, 7.873053999999999],
    "莱索托": [28.233608, -29.609988],
    "立陶宛": [23.881275, 55.169438],
    "卢森堡": [6.129582999999999, 49.815273],
    "拉脱维亚": [24.603189, 56.879635],
    "摩洛哥": [-7.092619999999999, 31.791702],
    "摩尔多瓦": [28.369885, 47.411631],
    "马达加斯加": [46.869107, -18.766947],
    "墨西哥": [-102.552784, 23.634501],
    "马其顿": [21.745275, 41.608635],
    "马里": [-3.996166, 17.570692],
    "缅甸": [95.956223, 21.913965],
    "黑山": [19.37439, 42.708678],
    "蒙古": [103.846656, 46.862496],
    "莫桑比克": [35.529562, -18.665695],
    "毛里塔尼亚": [-10.940835, 21.00789],
    "马拉维": [34.301525, -13.254308],
    "马来西亚": [101.975766, 4.210484],
    "纳米比亚": [18.49041, -22.95764],
    "新喀里多尼亚": [165.618042, -20.904305],
    "尼日尔": [8.081666, 17.607789],
    "尼日利亚": [8.675277, 9.081999],
    "尼加拉瓜": [-85.207229, 12.865416],
    "荷兰": [5.291265999999999, 52.132633],
    "挪威": [8.468945999999999, 60.47202399999999],
    "尼泊尔": [84.12400799999999, 28.394857],
    "新西兰": [174.885971, -40.900557],
    "阿曼": [55.923255, 21.512583],
    "巴基斯坦": [69.34511599999999, 30.375321],
    "巴拿马": [-80.782127, 8.537981],
    "秘鲁": [-75.015152, -9.189967],
    "菲律宾": [121.774017, 12.879721],
    "巴布亚新几内亚": [143.95555, -6.314992999999999],
    "波兰": [19.145136, 51.919438],
    "波多黎各": [-66.590149, 18.220833],
    "北朝鲜": [127.510093, 40.339852],
    "葡萄牙": [-8.224454, 39.39987199999999],
    "巴拉圭": [-58.443832, -23.442503],
    "卡塔尔": [51.183884, 25.354826],
    "罗马尼亚": [24.96676, 45.943161],
    "俄罗斯": [105.318756, 61.52401],
    "卢旺达": [29.873888, -1.940278],
    "西撒哈拉": [-12.885834, 24.215527],
    "沙特阿拉伯": [45.079162, 23.885942],
    "苏丹": [30.217636, 12.862807],
    "南苏丹": [31.3069788, 6.876991899999999],
    "塞内加尔": [-14.452362, 14.497401],
    "所罗门群岛": [160.156194, -9.64571],
    "塞拉利昂": [-11.779889, 8.460555],
    "萨尔瓦多": [-88.89653, 13.794185],
    "索马里兰": [46.8252838, 9.411743399999999],
    "索马里": [46.199616, 5.152149],
    "塞尔维亚共和国": [21.005859, 44.016521],
    "苏里南": [-56.027783, 3.919305],
    "斯洛伐克": [19.699024, 48.669026],
    "斯洛文尼亚": [14.995463, 46.151241],
    "瑞典": [18.643501, 60.12816100000001],
    "斯威士兰": [31.465866, -26.522503],
    "叙利亚": [38.996815, 34.80207499999999],
    "乍得": [18.732207, 15.454166],
    "多哥": [0.824782, 8.619543],
    "泰国": [100.992541, 15.870032],
    "塔吉克斯坦": [71.276093, 38.861034],
    "土库曼斯坦": [59.556278, 38.969719],
    "东帝汶": [125.727539, -8.874217],
    "特里尼达和多巴哥": [-61.222503, 10.691803],
    "突尼斯": [9.537499, 33.886917],
    "土耳其": [35.243322, 38.963745],
    "坦桑尼亚联合共和国": [34.888822, -6.369028],
    "乌干达": [32.290275, 1.373333],
    "乌克兰": [31.16558, 48.379433],
    "乌拉圭": [-55.765835, -32.522779],
    "美国": [-95.712891, 37.09024],
    "乌兹别克斯坦": [64.585262, 41.377491],
    "委内瑞拉": [-66.58973, 6.42375],
    "越南": [108.277199, 14.058324],
    "瓦努阿图": [166.959158, -15.376706],
    "西岸": [35.3027226, 31.9465703],
    "也门": [48.516388, 15.552727],
    "南非": [22.937506, -30.559482],
    "赞比亚": [27.849332, -13.133897],
    "津巴布韦": [29.154857, -19.015438]
}