Optaplanner 将客户从有效的 VRP 解决方案中删除

2024-02-13

基于此question https://stackoverflow.com/questions/47913276/optaplanner-vrp-remove-customer-from-working-solution我尝试了以下方法:

public void doFactChange() {
    Location toBeRemovedLocation = customerToBeRemoved.getLocation();
    Location lookUpWorkingObject = (Location) scoreDirector.lookUpWorkingObject(toBeRemovedLocation);
    scoreDirector.beforeProblemFactRemoved(lookUpWorkingObject);
    routingSolution.getLocationList().remove(lookUpWorkingObject);
    scoreDirector.afterProblemFactRemoved(lookUpWorkingObject);
    Customer workingCustomer = (Customer) scoreDirector.lookUpWorkingObject(customerToBeRemoved);

    for (Customer customer : routingSolution.getCustomerList()) {
        while (customer != null) {
            if (customer == workingCustomer) {
                if (customer.getPreviousStandstill() != null) {
                    scoreDirector.beforeVariableChanged(customer, "previousStandstill");
                    customer.getPreviousStandstill().setNextCustomer(customer.getNextCustomer());

                    scoreDirector.afterVariableChanged(customer, "previousStandstill");
                }

                scoreDirector.beforeVariableChanged(customer, "nextCustomer");
                customer.getNextCustomer().setPreviousStandstill(customer.getPreviousStandstill());
                scoreDirector.afterVariableChanged(customer, "nextCustomer");
            }
            customer = customer.getNextCustomer();
        }
    }

    scoreDirector.beforeEntityRemoved(workingCustomer);
    routingSolution.getCustomerList().remove(workingCustomer);
    scoreDirector.afterEntityRemoved(workingCustomer);
    scoreDirector.triggerVariableListeners();
}

Note: customerToBeRemoved是调用之前创建的实例对象doFactChange()

但我什至在调用之前就收到了以下异常scoreDirector.triggerVariableListeners

java.lang.IllegalStateException:实体(Customer--9048381398840634905)有一个变量(previousStandstill),其值(Customer--9070671076516032025)有一个sourceVariableName变量(nextCustomer),其值(Customer-8518512081385427431)不是该实体。 验证该 sourceVariableName 变量的输入问题的一致性。

另一个问题:

我尝试直接删除实体,如下所示:

public void doFactChange() {
    Location toBeRemovedLocation = customerToBeRemoved.getLocation();
    Location lookUpWorkingObject = (Location) scoreDirector.lookUpWorkingObject(toBeRemovedLocation);
    scoreDirector.beforeProblemFactRemoved(lookUpWorkingObject);
    routingSolution.getLocationList().remove(lookUpWorkingObject);
    scoreDirector.afterProblemFactRemoved(lookUpWorkingObject);
    Customer workingCustomer = (Customer) scoreDirector.lookUpWorkingObject(customerToBeRemoved);

    scoreDirector.beforeEntityRemoved(workingCustomer);
    routingSolution.getCustomerList().remove(workingCustomer);
    scoreDirector.afterEntityRemoved(workingCustomer);
    scoreDirector.triggerVariableListeners();
}

这有效吗?


此方法与使用简单、增量和 drl 分数计算器的 optaplanner VRP 示例配合良好:

public void removeRandomCustomer()
{
    doProblemFactChange(scoreDirector -> {
        VehicleRoutingSolution solution = scoreDirector.getWorkingSolution();
        int rnd = 4; //select a random customer
        if (solution.getCustomerList().size() > rnd)
        {
            Customer customer = solution.getCustomerList().get(rnd);
            scoreDirector.beforeEntityRemoved(customer);
            removeCustomer(solution, customer);
            scoreDirector.afterEntityRemoved(customer);
            scoreDirector.triggerVariableListeners();
        }
    });
}

private void removeCustomer(VehicleRoutingSolution solution, Customer customer)
{
    Standstill anchor = customer.getPreviousStandstill();
    Customer nextCustomer = customer.getNextCustomer();
    //anchor shouldn't be null in an initialized solution
    if (anchor != null)
        anchor.setNextCustomer(nextCustomer);
    if (nextCustomer != null)
        nextCustomer.setPreviousStandstill(anchor);
    solution.getCustomerList().remove(customer);
}

Edit:

具有简单/增量评分的影子变量的替代方法:

private void removeCustomer(ScoreDirector<VehicleRoutingSolution> scoreDirector, VehicleRoutingSolution solution, Customer removeCustomer)
{
    final Customer customer = scoreDirector.lookUpWorkingObject(removeCustomer);
    Standstill anchor = customer.getPreviousStandstill();
    Customer nextCustomer = customer.getNextCustomer();

    //scoreDirector.beforeVariableChanged(anchor, "nextCustomer");
    scoreDirector.beforeVariableChanged(customer, "previousStandstill");    //sets anchor.nextCustomer=null
    customer.setPreviousStandstill(null);
    scoreDirector.afterVariableChanged(customer, "previousStandstill");
    //scoreDirector.afterVariableChanged(anchor, "nextCustomer");
    if(nextCustomer!=null)
    {
        //scoreDirector.beforeVariableChanged(customer, "nextCustomer");
        scoreDirector.beforeVariableChanged(nextCustomer, "previousStandstill");  //sets customer.nextCustomer=null
        nextCustomer.setPreviousStandstill(anchor);
        scoreDirector.afterVariableChanged(nextCustomer, "previousStandstill");
        //scoreDirector.afterVariableChanged(customer, "nextCustomer");
    }

    scoreDirector.beforeEntityRemoved(customer);
    //clone customer list
    ArrayList<Customer> changedList = new ArrayList<>(solution.getCustomerList());
    solution.setCustomerList(changedList);
    solution.getCustomerList().remove(customer);
    scoreDirector.afterEntityRemoved(customer);
    scoreDirector.triggerVariableListeners();  //sets customer.vehicle=null, sets all nextCustomer.vehicle=null

}

该解决方案现在应该处于有效状态,但您可能必须修复增量评分(简单的分数很好,因为doProblemFactChange()自动重新计算),也许通过删除中的撤回VehicleRoutingIncrementalScoreCalculator.beforeEntityRemoved()。如果其他一切都失败了,您可以首先将客户移至链的末端并将其从那里删除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Optaplanner 将客户从有效的 VRP 解决方案中删除 的相关文章

  • Java中ArrayList的交集和并集

    有什么方法可以做到这一点吗 我正在寻找 但没有找到 另一个问题 我需要这些方法 以便我可以过滤文件 有些是AND过滤器 有些是OR过滤器 就像集合论中的那样 所以我需要根据所有文件和保存这些文件的联合 相交 ArrayList 进行过滤 我
  • 按键时关闭 ModalWindow

    我希望能够在用户按下某个键 在我的例子中是 ESC 时关闭 ModalWindow 我有一个用于按键的 Javascript 侦听器 它调用取消按钮 ID 的单击事件 jQuery modalWindowInfo closeButtonId
  • 如何将本机库链接到 IntelliJ 中的 jar?

    我正在尝试在 IntelliJ 中设置 OpenCV 但是我一直在弄清楚如何告诉 IntelliJ 在哪里可以找到本机库位置 在 Eclipse 中 添加 jar 后 您可以在 Build Config 屏幕中设置 Native 库的位置
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • Java ResultSet 如何检查是否有结果

    结果集 http java sun com j2se 1 4 2 docs api java sql ResultSet html没有 hasNext 方法 我想检查 resultSet 是否有任何值 这是正确的方法吗 if resultS
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其

随机推荐

  • 系统.data.sqlite.net 4

    System Data SQLite 是否有 Net 4 版本 目前我收到此错误 混合模式程序集是针对运行时版本 v2 0 50727 构建的 如果没有附加配置信息 则无法在 4 0 运行时中加载 需要什么 附加配置信息 或者是否有我可以使
  • 如何在Chrome扩展中获取剪贴板数据?

    我很难找到有关如何在 Chrome 扩展程序中添加 Ctrl C 监听器 获取剪贴板数据 然后写回剪贴板的最新信息 我发现的所有旧代码都是针对现已弃用的旧版本 基本上你可以使用操作剪贴板document execCommand paste
  • Spring中@Configuration和@Component有什么区别?

    ComponentScan使用两者创建bean Configuration and Component 交换时这两个注释都可以正常工作 那有什么区别呢 Configuration 表示一个类声明一个或多个 Bean 方法并且可以被Sprin
  • 启动作业中的“启动进程-NoNewWindow”?

    我在启动作业中使用启动进程时遇到问题 特别是在使用时 NoNewWindow 例如这个测试代码 Start Job scriptblock Start Process cmd NoNewWindow Wait ArgumentList c
  • 扫描代码注释并转换为标准格式的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在开发一个 C 项目 该项目有许多不同的作者和许多不同的文档风格 我是以下的忠实粉丝doxygen
  • 通过 Nginx、Django 提供 206 字节范围服务

    我让 Nginx 为我的静态 Django 文件提供服务 该文件在 Gunicorn 上运行 我正在尝试提供 MP3 文件并让它们具有头部 206 以便 Apple 接受它们用于播客 目前 音频文件位于我的静态目录中 并直接通过 Nginx
  • 受保护的构造函数有哪些实际用途?

    为什么有人会声明构造函数受保护 我知道构造函数被声明为私有 目的是不允许它们在堆栈上创建 当一个类是 旨在作为 抽象类时 受保护的构造函数是完全正确的 在这种情况下 您不希望从类实例化对象 而只想使用它来继承 还有其他用例 例如某些构造参数
  • 使用没有表单的视图创建 django 对象

    我想知道如何能够根据用户将要访问的 URL 在数据库中创建对象 例如 他们将转到 schedule addbid 1 这将在表中创建一个对象 其中包含投标的所有者 他们投标的时间表以及投标是否已完成 这是迄今为止我的投标模型的内容 clas
  • 列表中的枚举值

    我有一个枚举类 例如 public enum USERTYPE Permanant 1 Temporary 2 在我的业务对象中 我只是将这个枚举声明为 private List
  • 如何根据模型类上返回布尔值的方法的结果来过滤查询集?

    作为我的模型类之一的成员函数 我有一个is visible self user 返回布尔值的方法 根据定义 它需要请求用户 DjangoUser模型 作为输入 我希望能够根据对此方法的响应来过滤查询集 如何使用此函数作为查询集过滤器 对于上
  • keySet().toArray(new Double[0]) 的作用是什么?

    下面的返回有什么作用 我该如何使用该值 private Map
  • 提交表单时如何从 mgt-people-picker 获取输入值

    我在用着mgt people picker从 ASP Net Razor 应用程序中 使用ProxyController从 Graph API 获取所有数据 一切正常 现在我想从我创建的表单中获取信息 其中包含人员列表mgt people
  • ColdFusion 通过 Java 执行 OWASP esapi

    我有一些旧的 ColdFusion 代码 它最初是为 CF9 编写的 但现在运行在 CF 2016 上 应用程序 cfc local esapi createObject java org owasp esapi ESAPI applica
  • Postgresql 使用外键约束截断表

    目前我正在尝试截断在 Postgresql 11 3 上具有外键约束的表 我尝试这样做 BEGIN SET CONSTRAINTS ALL DEFERRED TRUNCATE tableA COMMIT 但收到错误 ERROR cannot
  • UIPageViewController 的大小很奇怪

    我正在使用一个UIPageViewController在我的应用程序中 它工作得很好 但是当我翻页时 下一页似乎在比屏幕大的框架中初始化 翻页时 只有下一页视图的一部分viewController适合屏幕 我正在初始化UIPageViewC
  • 识别 NHibernate 代理类

    我不是 NHibernate 用户 我编写了一个序列化实用程序库 用户记录了一个功能请求 要求我处理 NHibernate 代理类 将它们视为与实际类型相同 目前我的代码将它们视为意外继承 并引发异常 代码不会提前了解 NHibernate
  • 将 BytesMessage 转换为字符串?

    最好的转换方式是什么ByteMessage to String 我有以下代码 我们有更干净的方法吗 BytesMessage byteMessage set byteMessage byte byteArr new byte int byt
  • jsTree 禁用某些复选框

    将 jsTree 3 1 0 与复选框插件一起使用是否可以允许并非所有复选框都进行检查 禁用其中一些 我在这里找到了旧版本 jsTree 的解决方案jstree 禁用复选框 https stackoverflow com questions
  • 比较日期时间函数 cypress

    我有一个表单 允许用户输入日期范围 并且输出将仅包含该特定日期的结果 我可以使用 type 函数将日期输入到表单中 但是 我不确定如何检查结果是否在指定的范围内 例如 如果输入的日期是 17 03 2019 我应该能够使用这样的代码检查表中
  • Optaplanner 将客户从有效的 VRP 解决方案中删除

    基于此question https stackoverflow com questions 47913276 optaplanner vrp remove customer from working solution我尝试了以下方法 pub