MILP 최소 세트 Vertex Cover Coding by Python 또는 MATLAB?
Nov 01 2020
다음에 표시되는 최소 세트 정점 커버 문제의 단순 모드 모델링에 대한 내 질문에 대한 후속 조치입니다. Python 또는 MATLAB을 사용하여이 문제를 모델링하는 데 도움을 받고 싶습니다. 원점 정점과 대상 정점을 이진 변수로 사용하는 각 모서리가 문제를 해결할 것이라고 생각합니다. 이 변수가 두 정점을 어떻게 표현하는지에 대해 약간 혼란 스럽습니다.
문제는 그래프로 표시 될 수 있습니다.$G=(V,E)$ 우리가 원하는 곳 : $$ \min \quad \sum_{v\in V} x_v $$ 대상 \begin{align} x_u + x_v &\ge 1 \quad &\forall (u,v) \in E \\ \sum_{(u,v)\in E} z_{uv} &\ge k \\ z_{uv} &\le x_v \quad &\forall (u,v) \in E\\ z_{uv} &\le 1-x_u \quad &\forall (u,v) \in E\\ x_v&\in \{0,1\} \quad &\forall v \in V\\ z_{uv} &\in \{0,1\}\quad &\forall (u,v) \in E \end{align}
답변
6 Kuifje Nov 01 2020 at 03:14
Python에서 pulp 및 networkx 사용 :
import pulp
import networkx as nx
G = nx.Graph()
# define your graph here
#...
# define the problem
prob = pulp.LpProblem("MinimumSetVertexCover", pulp.LpMinimize)
# define the variables
x = pulp.LpVariable.dicts("x", G.nodes(), cat=pulp.LpBinary)
z = pulp.LpVariable.dicts("z", G.edges(), cat=pulp.LpBinary)
# define the objective function
prob += pulp.lpSum(x)
# define the constraints
for (u,v) in G.edges():
prob += x[u] + x[v] >= 1
prob += z[(u,v)] <= x[v]
prob += z[(u,v)] <= 1-x[u]
prob += pulp.lpSum(z) >= k
# solve
prob.solve()
# display objective function value
print("number of vertices in solution : %s"%pulp.prob.objective.value())
# display solution
for v in G.nodes():
if pulp.value(x[v]) > 0.9:
print("node %s selected"%v)
하는거 어때
- 구문을 이해하려면 pulp의 예 를 확인하세요.
- 무언가를 배우고 싶다면 위의 답변을 복사하지 마십시오.