我正在尝试使用OptaPy来优化检查人员的进度。
我尝试添加一个阴影变量,它必须与另一个变量一起更新。文档建议用自定义的VariableListener注释一个影子变量,并让其他人参考它。
我就是这样做的(实际代码的一部分):
@planning_entity
class Task(Slot):
inspector: Inspector
prev_slot: Slot
from_time: datetime
def __init__(self, inspector: Inspector = None, from_time: datetime = None):
self.inspector = inspector
self.from_time = from_time
self.prev_slot = None
@custom_shadow_variable(Inspector,
variable_listener_class = TaskUpdatingVariableListener,
sources = [planning_variable_reference(variable_name = 'previous_slot')])
def get_inspector(self):
return self.inspector
@custom_shadow_variable(datetime,
variable_listener_ref = planning_variable_reference(variable_name = 'inspector'))
def get_from_time(self):
return self.from_time
@planning_variable(Slot,
value_range_provider_refs=['day_start_range', 'task_range'],
graph_type=PlanningVariableGraphType.CHAINED)
def get_previous_slot(self):
return self.prev_slot
def set_previous_slot(self, previous_slot: Slot):
self.prev_slot = previous_slot在这里,TaskUpdatingVariableListener是@variable_listener,Slot是@problem_fact。
问题是,当我运行这段代码时,它会给出Java类型的强制转换错误:
Traceback (most recent call last):
File "model_v4.py", line 324, in <module>
class Task(Slot):
File ".../python3.9/site-packages/optapy/annotations.py", line 546, in planning_entity
return planning_entity_wrapper(entity_class)
File ".../python3.9/site-packages/optapy/annotations.py", line 540, in planning_entity_wrapper
out.__optapy_java_class = _generate_planning_entity_class(entity_class_argument, annotation_data)
File ".../python3.9/site-packages/optapy/optaplanner_java_interop.py", line 1030, in _generate_planning_entity_class
optaplanner_annotations = _get_optaplanner_annotations(python_class)
File ".../python3.9/site-packages/optapy/optaplanner_java_interop.py", line 955, in _get_optaplanner_annotations
_to_java_list(list(map(lambda annotation: getattr(getattr(python_class, method),
File ".../python3.9/site-packages/optapy/optaplanner_java_interop.py", line 936, in _to_java_list
out.add(_to_java_map(item))
File ".../python3.9/site-packages/optapy/optaplanner_java_interop.py", line 925, in _to_java_map
out.put(JObject(key, java.lang.Object), JObject(value, java.lang.Object))
File ".../python3.9/site-packages/jpype/_jobject.py", line 59, in __new__
return _JObjectFactory(*args, **kwargs)
File ".../python3.9/site-packages/jpype/_jobject.py", line 111, in _JObjectFactory
return tp._cast(v)
TypeError: Unable to cast 'dict' to java type 'java.lang.Object'如果删除第二个阴影变量(get_from_time),它编译得相当好!
将变量类型从datetime更改为任何其他类型都没有帮助。
这里有什么问题吗?
发布于 2022-09-02 15:42:25
这是optapy中的一个bug (详见https://github.com/optapy/optapy/pull/99 ),并将在下一个版本中修复。
https://stackoverflow.com/questions/73559441
复制相似问题