You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Optapy中@planning_entity类继承可行性及链式规划变量实现问题

问题描述

我正在使用Optapy开发调度优化解决方案,试图创建一个链式规划变量,使其链中包含多种实际实体,代码示例如下:

@planning_entity
class Slot:
  """ Schedule slot """

  def __init__(self):
      self.prev_slot = None

@planning_variable(Slot, value_range_provider_refs=['slot_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

@planning_entity
class Task(Slot):
    """ Allocation to task """
    ...

@planning_entity
class LunchBreak(Slot):
    """ Lunch break """
    ...

该实现因多种原因无法运行:若不为派生类添加规划变量会触发报错,添加后则出现类似‘赋值错误’的Java异常。请问在Optapy中是否允许继承@planning_entity修饰的类?

解答

Optapy允许继承被@planning_entity修饰的类,但你的实现存在写法错误,导致报错,修正要点如下:

  • 修正规划变量的定义位置
    你错误地将@planning_variable装饰器挂在类外部的独立函数上,规划变量必须定义在@planning_entity修饰的类内部,作为类的方法。正确写法如下:

    @planning_entity
    class Slot:
        """ Schedule slot """
    
        def __init__(self):
            self.prev_slot = None
    
        @planning_variable(Slot, value_range_provider_refs=['slot_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
    
  • 派生类无需重复定义规划变量
    继承带有规划变量的父实体类后,派生类会自动继承父类的规划变量配置,无需重复添加,否则会引发变量冲突,导致赋值异常。

  • 确保值范围覆盖所有实体类型
    配置的slot_range值范围提供者必须包含Slot的所有子类实例(即Task和LunchBreak实例),这样链式规划变量才能在不同实体类型间正常构建链条。

内容的提问来源于stack exchange,提问作者kol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:18:27