前提・実現したいこと
最近プログラミングを始めた超初心者です。
Python3(Anaconda Jupyter Notebook) で数理最適化問題を解いています。
エクセルから座標データを入力し,それをP-median問題を用いて拠点の導出を行い,そこからWeber問題用いて中継となる地点を導出したいと考えています。
現段階としてP-median問題のコードはできているんですが,それ以降のWeber問題が分かりません。また,拠点となった地点に対して色を変えたりしたいのですがどうやればいいのでしょうか?
よろしくお願いします。
該当のソースコード
Python
1import numpy as np 2import pandas as pd 3import matplotlib.pyplot as plt 4import networkx as nx 5import pulp 6import xlrd 7import math 8import random 9 10 11#=====Parameter===== 12h_omomi = 1 13s_omomi = 1 14p_omomi = 1 15#=================== 16 17#エクセルからデータ取得 18book = xlrd.open_workbook("***.xlsx") 19sheet = book.sheet_by_name("Sheet") 20 21def get_data(sheet,rowx,colx): 22 data = [] 23 for row in range(rowx, sheet.nrows): #データ起点から 24 value = sheet.cell(row, colx).value 25 data.append(value) 26 return data 27 28x = get_data(sheet, 1, 1) #データの起点はB1 29y = get_data(sheet, 1, 2) #データの起点はC1 30H = get_data(sheet, 1, 3) #データの起点はD1 31S = get_data(sheet, 1, 4) #データの起点はE1 32P = get_data(sheet, 1, 5) #データの起点はF1 33 34#リスト化 35x_1 = [int(h) for h in x] 36y_1 = [int(i) for i in y] 37H_1 = [int(j) for j in Hospital] 38S_1 = [int(k) for k in School] 39P_1 = [int(l) for l in Population] 40 41print(x_1) 42print(y_1) 43print(H_1) 44print(S_1) 45print(P_1) 46 47pos = list(zip(x_1,y_1)) 48print(pos) 49 50 51# 各駅における需要量の計算 52w = [] 53for i in range(len(H_1)): 54 T_W = h_omomi * H_1[i] + s_omomi * S_1[i] + p_omomi * P_1[i] 55 w.append(T_W) 56print(w) 57 58G = nx.Graph() 59for i in range(len(x_1)): 60 G.add_node(i, w=w[i], pos=pos[i]) 61 62def draw_facilities(G): 63 pos = nx.get_node_attributes(G,'pos') 64 nx.draw_networkx(G, pos=pos, with_labels=False) 65 w = nx.get_node_attributes(G, 'w') 66 _ = nx.draw_networkx_labels(G, pos=pos, labels=w, font_color='w') 67 return 68 69plt.figure(figsize=(10,10)) 70draw_facilities(G) 71plt.xlabel("x") 72plt.ylabel("y") 73plt.savefig('plot_1.png') 74 75def solve_p_median_by_pulp(G, p): 76 pmedian = pulp.LpProblem(name='5-median', sense=pulp.LpMinimize) 77 w = nx.get_node_attributes(G, 'w') 78 pos = nx.get_node_attributes(G, 'pos') 79 x = {} 80 y = {} 81 c = {} 82 for v in G.nodes(): 83 x[v] = pulp.LpVariable(name='x{0}'.format(v), cat='Binary') 84 for u in G.nodes(): 85 y[(u, v)] = pulp.LpVariable(name='y{0}_{1}'.format(u, v), cat='Binary') 86 c[(u, v)] = math.sqrt(sum([(pos[u][i] - pos[v][i])**2 for i in range(2)])) 87 pmedian += pulp.LpAffineExpression([(y[(u, v)], w[u] * c[(u, v)]) for u, v in y]) 88 pmedian += pulp.LpAffineExpression([(x[v], 1) for v in G.nodes()]) == p 89 for u in G.nodes(): 90 pmedian += pulp.LpAffineExpression([(y[(u, v)], 1) for v in G.nodes()]) == 1 91 for u, v in y: 92 pmedian += y[(u, v)] - x[v] <= 0 93 pmedian.solve() 94 for v in x: 95 G.node[v]['x'] = x[v].value() 96 for u, v in y: 97 if y[(u, v)].value() == 1: 98 G.add_edge(u, v) 99 return G 100 101G = solve_p_median_by_pulp(G,5) 102plt.figure(figsize=(10,10)) 103draw_facilities(G) 104 105 106plt.xlabel("x") 107plt.ylabel("y") 108plt.savefig('***.png')
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。