2016-10-25 11 views
1

pyomo.environ을 사용하여 LP 모델을 만들려고했습니다. 그러나 세트를 만드는 데 어려움을 겪고 있습니다. 내 문제는 두 세트를 만들어야합니다. 하나의 집합은 여러 노드의 집합이고 다른 집합은 노드 사이의 여러 개의 호에서 온 집합입니다. Networkx를 사용하여 노드와 호를 저장하여 네트워크를 만듭니다. 노드 데이터는 (경도, 위도)처럼 튜플 형식으로 저장됩니다. 호는 (nodeA, nodeB)로 저장됩니다. 여기서 nodeA와 nodeB는 둘 다 튜플의 좌표입니다.pyomo.environ 모듈에서 2 차원 집합 객체를 만드는 방법

그래서, 노드가 같은 것입니다 : 호이며,

(-97.97516252657978, 30.342243012086083)

가 뭔가 같은 :

((-97.97516252657978, 30.342243012086083), (-97.976196300350608

# import pyomo.envrion as pe 
# create a model m 
m = pe.ConcreteModel() 
# network is an object I created by Networkx module 
m.node_set = pe.Set(initialize= self.network.nodes()) 
m.arc_set = pe.Set(initialize= self.network.edges()) 
을 : 30.34247219922803))

나는 세트를 만들려고하는 방법은 다음과 같습니다

그러나 arc_set에 오류 메시지가 계속 나타납니다.

ValueError: The value=(-97.97516252657978, 30.342243012086083, 
-97.976196300350608, 30.34247219922803) does not have dimension=2, 
which is needed for set=arc_set 

필자의 arc_set이 두 개가 아닌 하나의 튜플로 바뀌었다. 그런 다음 노드와 호를 문자열로 변환하려고했지만 여전히 오류가 발생했습니다. 누군가 나에게 힌트를 보여줄 수 있습니까? 또는이 버그를 어떻게 삭제합니까? 감사합니다.

답변

4

Pyomo는 모든 색인 생성 집합을 "평평하게"합니다. 즉, 중첩 된 튜플을 제거하여 각 멤버가 스칼라 값의 단일 튜플이되도록합니다. 이것은 일반적으로 다른 대수 모델링 언어와 일치하며 사용자가 쿼리를 시도한 방법에 관계없이 구성 요소 멤버를 일관되게 (그리고 올바르게) 검색 할 수 있도록 도와줍니다.

Pyomo는 원호 세트의 각 멤버를 단일 4 멤버 튜플로 설정하려고합니다. 모든 가장자리가 시작 알려진 노드에 종료 있는지 확인이 경우,

from pyutilib.misc import flatten 
m.arc_set = pe.Set(initialize=(tuple(flatten(x)) for x in self.network.edges()) 

당신은 또한 일부 오류 검사를 수행 할 수 있습니다 : 당신이 세트를 구성 할 때 당신의 튜플을 평평하게하는 데 사용할 수있는 PyUtilib의 유틸리티가 있습니다 :

from pyutilib.misc import flatten 
m.node_set = pe.Set(initialize=self.network.nodes()) 
m.arc_set = pe.Set(
    within=m.node_set*m.node_set, 
    initialize=(tuple(flatten(x)) for x in self.network.edges()) 

당신이 인덱스로 부동 소수점 숫자를 사용하고 미묘한 반올림 오류가 거의 동일하지만, 수학적으로 동일하지 않은 인덱스를 생성 할 수있는 곳이 같은 모델에 특히 중요하다.

구조적 인덱스와 병합 인덱스를 모두 지원하는 개발자 간의 토론이 있었지만 이전 버전과의 호환성을 위해 최상의 지원 방법에 대한 합의에 도달하지 못했습니다.