最大限度地减少运输时间

2024-03-02

[底部更新(包括解决方案源代码)]

我有一个具有挑战性的业务问题,计算机可以帮助解决。

沿着山区,有一条蜿蜒曲折的长河,水流湍急。沿着河流的某些部分有一些环境敏感的土地,适合种植需求量很大的特定类型的稀有水果。一旦田间劳动者收获了水果,就开始将水果运送到加工厂。尝试将水果向上游或通过陆地或空中运送的成本非常高。到目前为止,将它们运送到工厂的最具成本效益的机制是使用仅由河流恒流驱动的下游集装箱。我们有能力建造 10 个加工厂,需要将这些加工厂建在河边,以尽量减少水果在运输途中的总时间。水果可能需要很长时间才能到达最近的下游工厂,但这段时间会直接影响它们的销售价格。实际上,我们希望最小化到最近的各个下游工厂的距离总和。工厂可以位于距离水果接入点下游 0 米处。

问题是:如果找到了32个水果种植区,那么为了利润最大化,这10个加工厂应该建在河上游多远的地方,这些水果种植区到河床上游的距离是(米): 10, 40, 90, 160, 250, 360, 490, ... (n^2)*10 ... 9000, 9610, 10320?

[希望所有致力于解决这一问题以及创造类似问题和使用场景的工作都能够帮助提高人们对软件/商业方法专利的破坏性和窒息性的认识并产生普遍的抵制(无论这些专利在何种程度上可能被相信)在当地是合法的)。]

UPDATES


Update1:​​忘记补充:我相信这个问题是一个特例this one https://stackoverflow.com/questions/5167774/minimize-the-sum-of-errors-of-representative-integers/5958885#5958885.

更新2:我编写的一个算法在不到一秒的时间内给出了答案,我相信它相当好(但它在样本值上还不稳定)。我稍后会提供更多详细信息,但简短如下。将植物以相等的间距放置。循环遍历所有内部植物,在每个植物上,您通过测试其两个邻居之间的每个位置来重新计算其位置,直到问题在该空间内得到解决(贪婪算法)。因此,您可以在固定 1 和 3 的情况下优化工厂 2。然后工厂 3 保持 2 和 4 固定...当你到达终点时,你循环返回并重复,直到你进入一个完整的循环,其中每个加工厂的重新计算位置停止变化..也在每个循环结束时,你尝试移动一个个挤在一起、离果场较近的加工厂变成了一个果场距离较远的地区。有很多方法可以改变细节,从而产生准确的答案。我还有其他候选算法,但都有故障。 [我稍后会发布代码。] 正如 Mike Dunlavey 下面提到的,我们可能只想要“足够好”。

给出什么可能是“足够好”的结果的想法:

10010 total length of travel from 32 locations to plants at 
{10,490,1210,1960,2890,4000,5290,6760,8410,9610}

Update3:嗯,首先给出了正确的精确解决方案,但(尚未)发布程序或算法,所以我写了一个产生相同值的程序或算法。

/************************************************************
This program can be compiled and run (eg, on Linux):
$ gcc -std=c99 processing-plants.c -o processing-plants
$ ./processing-plants
************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//a: Data set of values. Add extra large number at the end

int a[]={
10,40,90,160,250,360,490,640,810,1000,1210,1440,1690,1960,2250,2560,2890,3240,3610,4000,4410,4840,5290,5760,6250,6760,7290,7840,8410,9000,9610,10240,99999
};

//numofa: size of data set

int numofa=sizeof(a)/sizeof(int);

//a2: will hold (pt to) unique data from a and in sorted order.

int *a2;

//max: size of a2

int max;

//num_fixed_loc: at 10 gives the solution for 10 plants

int num_fixed_loc;

//xx: holds index values of a2 from the lowest error winner of each cycle memoized. accessed via memoized offset value. Winner is based off lowest error sum from left boundary upto right ending boundary.
//FIX: to be dynamically sized.

int xx[1000000];

//xx_last: how much of xx has been used up

int xx_last=0;

//SavedBundle: data type to "hold" memoized values needed (total traval distance and plant locations) 

typedef struct _SavedBundle {
    long e;
    int xx_offset;
} SavedBundle;

//sb: (pts to) lookup table of all calculated values memoized

SavedBundle *sb;  //holds winning values being memoized

//Sort in increasing order.

int sortfunc (const void *a, const void *b) {
    return (*(int *)a - *(int *)b);
}

/****************************
Most interesting code in here
****************************/

long full_memh(int l, int n) {
    long e;
    long e_min=-1;
    int ti;

    if (sb[l*max+n].e) {
        return sb[l*max+n].e;  //convenience passing
    }
    for (int i=l+1; i<max-1; i++) {
        e=0;
        //sum first part
        for (int j=l+1; j<i; j++) {
            e+=a2[j]-a2[l];
        }
        //sum second part
        if (n!=1) //general case, recursively
            e+=full_memh(i, n-1);
        else      //base case, iteratively
            for (int j=i+1; j<max-1; j++) {
                e+=a2[j]-a2[i];
            }
        if (e_min==-1) {
            e_min=e;
            ti=i;
        }
        if (e<e_min) {
            e_min=e;
            ti=i;
        }
    }
    sb[l*max+n].e=e_min;
    sb[l*max+n].xx_offset=xx_last;
    xx[xx_last]=ti;      //later add a test or a realloc, etc, if approp
    for (int i=0; i<n-1; i++) {
        xx[xx_last+(i+1)]=xx[sb[ti*max+(n-1)].xx_offset+i];
    }
    xx_last+=n;
    return e_min;
}

/*************************************************************
Call to calculate and print results for given number of plants
*************************************************************/

int full_memoization(int num_fixed_loc) {
    char *str;
    long errorsum;  //for convenience

    //Call recursive workhorse
    errorsum=full_memh(0, num_fixed_loc-2);
    //Now print
    str=(char *) malloc(num_fixed_loc*20+100);
    sprintf (str,"\n%4d %6d {%d,",num_fixed_loc-1,errorsum,a2[0]);
    for (int i=0; i<num_fixed_loc-2; i++)
        sprintf (str+strlen(str),"%d%c",a2[ xx[ sb[0*max+(num_fixed_loc-2)].xx_offset+i ] ], (i<num_fixed_loc-3)?',':'}');
    printf ("%s",str);
    return 0;
}

/**************************************************
Initialize and call for plant numbers of many sizes
**************************************************/

int main (int x, char **y) {
    int t;
    int i2;

    qsort(a,numofa,sizeof(int),sortfunc);
    t=1;
    for (int i=1; i<numofa; i++)
        if (a[i]!=a[i-1])
            t++;
    max=t;
    i2=1;
    a2=(int *)malloc(sizeof(int)*t);
    a2[0]=a[0];
    for (int i=1; i<numofa; i++)
        if (a[i]!=a[i-1]) {
            a2[i2++]=a[i];
        }
    sb = (SavedBundle *)calloc(sizeof(SavedBundle),max*max);
    for (int i=3; i<=max; i++) {
        full_memoization(i);
    }
    free(sb);
    return 0;
}

让我给你一个简单的例子大都会-黑斯廷斯 http://en.wikipedia.org/wiki/Metropolis%E2%80%93Hastings_algorithm算法。 假设你有一个状态向量x,以及拟合优度函数P(x),它可以是您想要编写的任何函数。

假设你有一个随机分布Q您可以使用它来修改向量,例如x' = x + N(0, 1) * sigma,其中 N 是关于 0 的简单正态分布,并且sigma是您选择的标准差。

p = P(x);
for (/* a lot of iterations */){
  // add x to a sample array
  // get the next sample
  x' = x + N(0,1) * sigma;
  p' = P(x');
  // if it is better, accept it
  if (p' > p){
    x = x';
    p = p';
  }
  // if it is not better
  else {
    // maybe accept it anyway
    if (Uniform(0,1) < (p' / p)){
      x = x';
      p = p';
    }
  }
}

通常,它需要大约 1000 个周期的老化时间,然后开始收集样本。再经过大约 10,000 个周期后,样本的平均值就是您的答案。

它需要诊断和调整。通常会绘制样本,并且您正在寻找的是稳定(不会移动太多)并且具有高接受率(非常模糊)的“模糊毛毛虫”图。您可以使用的主要参数是sigma. If sigma太小了,情节会模糊反而会走神。 如果太大,绘图将不会模糊 - 它将有水平线段。 通常是起始向量x是随机选择的,并且通常会选择多个起始向量,以查看它们是否最终位于同一位置。

没有必要改变状态向量的所有分量x同时。您可以循环使用它们,一次改变一个,或者使用类似的方法。

另外,如果您不需要诊断图,则可能不需要保存样本,而只需动态计算平均值和方差即可。

在我熟悉的应用程序中,P(x) 是概率的度量,它通常位于对数空间中,因此它可以从 0 到负无穷大变化。 然后执行“也许接受”步骤(exp(logp' - logp))

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

最大限度地减少运输时间 的相关文章

  • LRU算法,实现这个算法需要多少位?

    我有一个关于 LRU 算法的小问题 如果您有一个包含四个块的高速缓存 那么需要多少位来实现该算法 假设您指的是 4 路组关联缓存 完美 LRU 本质上是按照使用顺序为每一行分配一个精确的索引 您也可以将其视为 年龄 因此 4 个元素中的每一
  • 坐标算法 - 绕中心旋转

    通过查看这张图片 我想您会很好地理解我的问题 图片已删除 网址不再有效 现在返回广告 所以基本上我想要一个函数 它接受一个对象作为参数 并根据我之前添加的对象数量为该对象提供正确的坐标 假设我将所有这些对象添加到一个数组中 objectAr
  • 为什么这个算法的Big-O复杂度是O(n^2)?

    我知道这个算法的大O复杂度是O n 2 但我不明白为什么 int sum 0 int i 1 j n n while i lt j sum 即使我们设定了j n n一开始 我们在每次迭代期间递增 i 并递减 j 因此最终的迭代次数不应该比n
  • 求先递增后递减列表的最大值和最小值

    我尝试用谷歌搜索这个问题 但没有取得太大成功 我确信这个问题或类似问题有一个技术名称 但我似乎找不到答案 给定一个列表L整数 即严格递增 然后严格递减 找到该列表的最大值和最小值 例如 L可能 1 2 3 4 5 4 3 2 or 2 4
  • 使用什么算法来确定使系统达到“零”状态所需的最小操作数?

    这是一种更通用的问题 不是特定于语言的 有关要使用的想法和算法的更多信息 系统如下 它登记朋友群体之间的小额贷款 Alice and Bill要去吃午饭 比尔的卡坏了 所以爱丽丝支付了他的餐费 10 美元 第二天Bill and Charl
  • 优化视图状态

    是否有人对优化 ASP NET 应用程序的视图状态有任何想法或参考可以向我指出 我不想把它全部关闭 优化它的主要目标是提高性能 所以我不想运行一个昂贵的函数来递归地禁用某些控件的视图状态 因为该函数会减慢速度页面的加载时间会达不到目的 有任
  • 无法理解Peterson算法的正确性

    我在这里讨论彼得森算法的一个场景 flag 0 0 flag 1 0 turn P0 flag 0 1 turn 1 while flag 1 1 turn 1 busy wait
  • 在一个区域中拟合二维多边形的算法?

    这有标准吗 算法名称 说 我有 10 个不同大小的多边形 我有一个特定大小的区域 我想知道如何填充该区域中的最多多边形 以及它们是如何拟合的 笔记 多边形可以根据限制集进行旋转 一个可能的名称是包装问题 http en wikipedia
  • 面试题:三个数组,O(N*N)

    假设我们有three长度数组N其中包含任意数量的类型long 然后我们得到一个数字M 相同类型 我们的任务是选择三个数字A B and C每个数组中的一个 换句话说A should从第一个数组中选取 B从第二个开始和C从第三个 所以总和A
  • 覆盖二维平面上给定点的最小圆

    问题 覆盖 2D 平面上给定 N 个点的圆的最小可能直径是多少 解决这个问题最有效的算法是什么 它是如何工作的 这是最小圆问题 http en wikipedia org wiki Smallest circle problem 请参阅参考
  • String.contains() 的时间复杂度

    String contains 的时间复杂度是多少 假设 n 是与另一个长度为 k 的字符串进行比较的字符串的长度 如果不知道您感兴趣的 String contains 的实际实现 就没有答案 或者你打算使用什么算法 一个完全幼稚的实现可能
  • sigmoid 的导数

    我正在使用反向传播技术创建一个神经网络进行学习 我知道我们需要找到所使用的激活函数的导数 我正在使用标准 sigmoid 函数 f x 1 1 e x 我已经看到它的导数是 dy dx f x f x 1 f x 这可能是一个愚蠢的问题 但
  • 数组所有可能的组合

    我有一个字符串数组 ted williams golden voice radio 我希望这些关键字的所有可能组合采用以下形式 ted williams golden voice radio ted williams ted golden
  • 密文窃取算法 - 哪一种是正确的?

    网络上提出了两种算法 在这两种算法中 第一部分是相同的 1 Pad the last partial plaintext block with 0 2 Encrypt the whole padded plaintext using the
  • 对 Java 中 *any* 类的所有实例进行全排序

    我不确定以下代码是否能确保 Comparator 的 Javadoc 中给出的所有条件 class TotalOrder
  • 在 Python 中从 Excel 复制 YEARFRAC() 函数

    因此 我使用 python 来自动执行一些必须在 Excel 中执行的重复任务 我需要做的计算之一需要使用yearfrac 这在Python中被复制了吗 I found this https lists oasis open org arc
  • 实时战略战争游戏人工智能算法

    我正在设计一款实时策略战争游戏 其中 AI 将负责控制大型六边形地图上的大量单位 可能超过 1000 个 一个单位有许多行动点 可以用于移动 攻击敌方单位或各种特殊行动 例如建造新单位 例如 一辆拥有 5 个行动点的坦克可以花费 3 个行动
  • 使用递归返回嵌套列表中第二小的数字

    我必须归还第二小的使用递归的 python 列表中的数字 以及no loops 我所做的是创建一个辅助函数 它返回列表中 最小 第二小的 值的元组 然后我只取tuple 1 in my second smallest func def s
  • 有向未加权图中的最长非循环路径

    什么算法可用于找到未加权有向无环图中的最长路径 动态规划 http en wikipedia org wiki Dynamic programming 它也被引用于最长路径问题 http en wikipedia org wiki Long
  • 更改计划的开始日期以优化资源

    我有很多工作需要在特定的时间间隔执行 然而 我们每天完成这项工作的资源有限 因此 我正在尝试优化开始时间日期 开始时间日期只能向前移动 不能向后移动 以便每天使用的资源与我们的预算更加不相似 这些函数在下面的示例中使用 Function t

随机推荐

  • 有没有办法在不加载rubygems的情况下调用ruby1.9?

    所以 ruby 1 9 真的很好 因为它会自动需要 ruby gems 因此当你调用require somegem 不需要首先需要 ruby gems 它就可以工作 这通常很棒 但我有大量使用 ruby 的 shell 脚本 它们通常不依赖
  • 对 static constexpr char[] 的未定义引用

    我想要一个static const char我班上的数组 GCC 抱怨并告诉我我应该使用constexpr 尽管现在它告诉我这是一个未定义的引用 如果我将数组设置为非成员 那么它就会编译 到底是怎么回事 hpp struct foo voi
  • 查找java类中所有对方法的调用

    我有一个包含很多课程的庞大项目 我有一个非常具体的课程 让我们命名它SuperFoo 我需要找到对该方法的所有调用equals 带类型参数Superfoo 希望它是清楚的 所以 再一次 在数千个java文件 或字节码 中我想找到对该方法的所
  • 如何防止 del *.txt 出现“找不到”错误消息?

    在 Windows 批处理文件中 此行 del txt 将给出错误 警告消息 Could Not Find C txt 如果没有与模式 txt 匹配的文件 有没有办法阻止该消息 if exist txt del txt
  • PHP 人类日期范围/持续时间格式

    PHP 制作得非常好 我想知道是否有一个函数可以满足我的需要 对于持续超过一天的事件 人类的格式化方式很复杂 例子 事件一 从 2015 04 20 到 2015 04 22 可以针对人类进行格式化 如下所示 2015 年 4 月 20 2
  • 一次阻塞收集进程 n 个项目 - 完成 1 个项目后立即继续

    我有以下场景 我将数据库中的 50 个作业放入阻塞集合中 每项工作都是长期运行的 可能是 所以我想在单独的线程中运行它们 我知道 最好将它们作为 Task WhenAll 运行并让 TPL 弄清楚 但我想控制同时运行的数量 假设我想同时运行
  • Spring Boot不加载静态资源,它取决于RequestMapping深度

    我在 Spring Boot 应用程序上加载静态文件夹下的文件时遇到问题 问题是 RequestMapping 深度超过 2 之类的 RequestMapping spring xyz The RequestMapping spring 单
  • 为什么结果是NaN?

    var a 10 sayHi function sayHi var a a 10 alert a return a alert a alert sayHi 10 为什么上面的结果不是20和30 我觉得第一个是20 然后是30 functio
  • 如何将 Ada.Real_TIme.Time 转换为字符串?

    我想写一个Ada Real Time Time http www adaic com standards 05rm html RM D 8 html在一个文件中 我怎样才能做到这一点 Thanks 您可以使用Ada Real Time Sp
  • 在 EPPLUS 中读取 xlsx (2007) 文件时出错

    我在尝试读取 Excel 文件时遇到错误 xlsx 保存在Excel 2007 using EPPlus图书馆 一些解决方法 带有 EPPlus v 的 ASP net mvc 5 应用程序4 0 4 0 用户可以从我的网站下载模板文件 然
  • CSS - 创建 9x9 数独网格的最佳方法是什么?

    我正在开展一些项目来改进我的 HTML 和 CSS 其中之一是简单的数独求解器 我需要创建一个网格来放置标签或文本框 我想要一个与此中的网格图像完全相同的网格布局question https stackoverflow com questi
  • Symfony2 更新 bootstrap.php.cache

    最近 我从 symfony com 上提供的 BETA 版本开始了 Symfony2 中的一个项目 过了一段时间 我需要升级到master分支 所以我从github上检索了最新的并将其切换到vendor symfony 但是 我的 boot
  • Firefox 在收到指定内容范围的 206 后不会请求进一步的数据

    为了提供一些背景信息 我有一个
  • 如何使用Java找到偏差

    我想使用以下代码找出两条绘图线之间的偏差 但由于某种原因 它感觉不对 import java awt import java awt event ActionEvent import java awt event ActionListene
  • 如何找到源代码的编译日期?

    是否可以存储并显示项目编译的日期 我想在程序启动时打印此日期 以便了解使用的是哪个版本 目前我都是手工做的 比较麻烦 我正在使用 Visual Studio 2010 C 指定有一个特殊的预处理器宏 称为 DATE 这是编译发生时间的字符串
  • 如何捕获 JDBC 中的特定异常?

    如何捕获特定异常JDBC http en wikipedia org wiki Java Database Connectivity 示例 主键异常或外键异常 最好的且独立于数据库的处理方式SQLException更具体地说 是确定SQL状
  • 在 jQuery 中使用 window.location.hash

    我想使用 jQuery 制作一个褪色导航菜单 其中与当前页面对应的 按下 按钮的行为与 未按下 按钮不同 具体来说 它在悬停时不会褪色为不同的颜色 如果我查看 www guitaracademy nl 上的示例 我会发现他们使用带有 win
  • WebDriverException:未知错误:Runtime.callFunctionOn 抛出异常:TypeError:JSON.stringify 不是使用 Selenium 和 ChromeDriver 的函数

    我使用 Selenium 和 Python 来生成网站上信用卡字段的输入 当你尝试时send keys到该字段它总是返回此错误 我使用不同的网络驱动程序 Chrome Edge Firefox 具有相同的效果 在字段中显示任何输入之前会弹出
  • 对函数进行条件参数调用,参数可能为空

    对于我提供的玩具示例来说 这个问题可能听起来很愚蠢 但在我面临的实际情况中实际上是有意义的 承担职能f例如 f lt function x if missing x something very nice happens if x is m
  • 最大限度地减少运输时间

    底部更新 包括解决方案源代码 我有一个具有挑战性的业务问题 计算机可以帮助解决 沿着山区 有一条蜿蜒曲折的长河 水流湍急 沿着河流的某些部分有一些环境敏感的土地 适合种植需求量很大的特定类型的稀有水果 一旦田间劳动者收获了水果 就开始将水果