局部搜索算法 + 模拟退火Capacitated Facility Location Problem(c++)

Capacitated Facility Location Problem

程序源码: Github传送门

一.概述

利用局部搜索方法以及模拟退火算法来求解带容量设备选址问题,对比两种方式的优劣程度,及其讲述使用的技巧。对于CFLP的71个测例来进行测试,写出实验结果的数据。实验中采用多种邻域操作的局部搜索local search策略尝试解决相同规模的CFLP问题,并与相同局部搜索的模拟退火算法进行对比。从算法结果来看,模拟退火算法求得的最优解要比局部搜索得出的最优解要好。通过该实验得出结论,局部搜索容易陷入局部最优解,而模拟退火利用其一定概率接受差解的特性跳出局部最优,从而能逐渐收敛到全局最优。

二.题目介绍

Suppose there are n facilities and m customers.

  • We wish to choose:
    • which of the n facilities to open
    • the assignment of customers to facilities
  • The objective is to minimize the sum of the opening cost and the assignment cost.
  • The total demand assigned to a facility must not exceed its capacity

In our initial formulation, introduce a binary variable $ x_{i} $ for $ i=1,…,n$, where $ x_{i}=1 $ if facility i i i is open, and $ x_{i}=0$ otherwise. Further introduce the variable y i j y_{{ij}} yij for i = 1 , . . . , n i=1,... ,n i=1,...,n and $ j=1,…,m$ which represents the fraction of the demand $ d_{j} $ filled by facility $ i$. The so-called capacitated facility location problem is then given by

1

Note that the second set of constraints ensure that if $ x_{i}=0$, that is, facility i i i isn’t open, then $ y_{ij}=0$ for all $ j$ , that is, no demand for any customer can be filled from facility i i i.

三.算法介绍

局部搜索

局部搜索(Local Search Algorithm)是指能够无穷接近最优解的能力,而全局收敛能力是指找到全局最优解所在大致位置的能力。

局部搜索是解决最优化问题的一种启发式算法。对于某些计算起来非常复杂的最优化问题,比如各种NP完全问题,要找到最优解需要的时间随问题规模呈指数增长,因此诞生了各种启发式算法来退而求其次寻找次优解,是一种近似算法(Approximate algorithms),以时间换精度的思想。局部搜索就是其中的一种方法。

算法的关键问题是:

  • 局部最优问题
  • 步长问题
  • 起始点问题

模拟退火算法

模拟退火算法(Simulated Annealing Algorithm)是元启发式搜索算法的其中一种。相比起效率低下的随即搜索算法,元启发式搜索算法借助了演化思想和集群智能思想,对解的分布有规律的复杂问题有良好的效果。

模拟退火法(Simulated Annealing)是克服爬山法缺点的有效方法,所谓退火是冶金专家为了达到某些特种晶体结构重复将金属加热或冷却的过程,该过程的控制参数为温度T。模拟退火法的基本思想是,在系统朝着能量减小的趋势这样一个变化过程中,偶尔允许系统跳到能量较高的状态,以避开局部极小点,最终稳定到全局最小点。

算法的关键问题是:

  • 初温与接受温度的设置
  • 局部搜索的方法
  • 退火系数
  • 某一温度下的内循环次数

2.算法实现

算法流程
  1. 随机挑选出一单元,并给他一个随机的位移 k k k,求出系统因此而产生的能量变化 Δ E k \Delta E_k ΔEk
  2. Δ E k ≤ 0 \Delta E_k \leq0 ΔEk0,该位移可采纳,而变化后的系统状态可作为下次变化的起点;若 Δ E k > 0 \Delta E_k \gt0 ΔEk>0,位移后的状态可采纳的概率为

P k = 1 ( 1 + e − Δ E k / T ) P_k = \frac{1}{(1+e^{-\Delta E_k/T})} Pk=(1+eΔEk/T)1

式中T为温度,然后从(0,1)区间均匀分布的随机数中挑选一个数R。若 R &lt; P k R \lt P_k R<Pk,则将变化后的状态作为下次的起点;否则,将变化前的状态作为下次的起点。
​ 3. 转第(1)步继续执行,直至达到平衡状态为止。

0.读取文件,储存数据

根据文件中的设备数量,用户数量读取数据,并将其放在vector中,这里我利用了5个vector。

vector<int> facilityResult;				// 安排哪些工厂开放(01表示)
vector<int> customerResult;				// 安排每个顾客去哪个设备
vector<int> facilitySequence;			// 设备开放的顺序
vector<int> customerSequence;			// 客户加入的顺序
vector<spare> spareCapacity;			// 设备的剩余空间

除此以外,为了搜索操作的需要,要对于剩余容量进行排序,或者对于用户花费进行排序,所以这里需要一些结构体。结构体根据value或cost进行排序,id保持不变,指示唯一的用户或设备。

// 用户对于不同设备的花费
struct customer_cost
{
	float value;
	int id;
};
// 剩余空间
struct spare
{
	int id;
	int capacity;
};
// 顾客结构体
struct customer
{
	float demand;
	std::vector<customer_cost> cost;	
};

// 设备结构体
struct facility
{
	int capacity;
	int cost;
};

一些参数,前四个用于保存文件中的数据,只会在读取文件的时候改变,后面为只读。

后四个参数为模拟退火算法使用的参数,通过调整这些参数能获取更好的解。

int nFacility;							// 工厂数量
int nCustomer;							// 顾客数量
std::vector<customer> customerVector;	// 顾客的信息
std::vector<facility> facilityVector;	// 设备的信息

const double coolSpeed = 0.99; 			// 退火速度
const double acceptT = 0.00001;			// 接受温度
const double initialT = 2000;			// 初始温度
const int turn = 1000;					// 内循环次数
1.进行局部搜索找最优解
a. 统计一个解的长度

评价函数是寻找最优解的一个关键,CFLP问题可以利用解的总花费代价作为评价该解的优秀程度。

计算花费代价,包括两部分,其一是开启设备的花费,其二是用户选择该设备的花费,两者求和即是该解的总花费

// 统计一个解的总花费
void CalculateTotalCost(){
    totalCost = 0;
    // 设备花费
    for (int i = 0; i < nFacility; ++i)
    {
        if (facilityResult[i])
        {
            totalCost += facilityVector[i].cost;
        }
    }
    // 用户花费
    for (int i = 0; i < nCustomer; ++i)
    {
        for (int j = 0; j < nFacility; ++j)
        {
            if (customerResult[i] == customerVector[i].cost[j].id)
            {
                totalCost += customerVector[i].cost[j].value;
                break;
            }
        }
    }
}
b.判断一个解的合法性

一个解是否合法需要检查,每一个设备的容量是否小于被选中该设备的用户需求之和,否则认为该解是不合法的,超出设备的容量。

// 检查该解的合法性
bool CheckSolution(){
    int facilityCapacity[50];
    for(int i = 0; i < nFacility; i++){
        facilityCapacity[i] = 0;
    }
    // 检查容量
    for (int i = 0; i < nCustomer; ++i)
    {
        facilityCapacity[customerResult[i]] += customerVector[i].demand;
    }
    for (int i = 0; i < nFacility; ++i)
    {
        if (facilityCapacity[i] > facilityVector[i].capacity)
        {
            return false;
        }
    }
    return true;
}
c.随机生成初始解

这里先随机生成设备开放顺序以及顾客加入顺序

然后根据这两个顺序来遍历用户与设备,这里填充的法则是容量First Fit

当该设备可以装下时,继续放这个设备;直到放不下才放到下一个设备。

// 随机生成一个解,根据开放的顺序,顺序填充顾客
void RandomGenerate(){
    srand(time(0));
    int nChange1 = rand() % nFacility;
    int nChange2 = rand() % nCustomer;
    for (int i = 0; i < nFacility; ++i)
    {
        facilitySequence[i] = i;
    }
    // 随机设备开放顺序
    for (int i = 0; i < nChange1; ++i)
    {
        int pos1 = rand() % nFacility;
        int pos2 = rand() % nFacility;
        int temp = facilitySequence[pos1];
        facilitySequence[pos1] = facilitySequence[pos2];
        facilitySequence[pos2] = temp;
    }
    // 随机顾客加入顺序
    for (int i = 0; i < nCustomer; ++i){
        customerSequence[i] = i;
    }
    for (int i = 0; i < nChange2; ++i)
    {
        int pos1 = rand() % nCustomer;
        int pos2 = rand() % nCustomer;
        int temp = customerSequence[pos1];
        customerSequence[pos1] = customerSequence[pos2];
        customerSequence[pos2] = temp;
    }
    // 按照前面的顺序来填充一个解
    int j = 0; // 统计设备的序号
    facilityResult[facilitySequence[0]] = 1;
    for (int i = 0; i < nCustomer; ++i)
    {
        // 当当前设备装不下用户的需求,查找一个容量能装下的设备
        while(customerVector[customerSequence[i]].demand > spareCapacity[facilitySequence[j]].capacity){
            j++;
            j = j % 10;
            // 新的
            if (facilityResult[facilitySequence[j]] == 0)
            {
                facilityResult[facilitySequence[j]] = 1;
                spareCapacity[facilitySequence[j]].capacity = facilityVector[facilitySequence[j]].capacity;
            }
        }
        // 将用户装入设备序号j
        spareCapacity[facilitySequence[j]].capacity -= customerVector[i].demand;
        customerResult[i] = facilitySequence[j];
    }
} 
d.四种局部搜索的策略

这里,我们设置了四种局部搜索的策略来进行找邻域中的解。

(1) 交换两设备的开关情况

随机找到两个设备,要求这两个设备是一开一关的,将两个设备的开关情况交换。

需要的操作:

  • 将a设备的用户提取出来
  • 将a设备的容量还原
  • 将提取出来的用户放入设备b中,当b放不下后,再往后遍历
  • 更改设备b的容量
  • 重新统计该解的花费
count = 40;
while(count > 0){
    int i = rand() % nFacility;
    int j = rand() % nFacility;
    if (facilityResult[i] == 1 && facilityResult[j] == 0)
    {
        facilityResult[i] = 0;
        facilityResult[j] = 1;
        // 需要改变的用户
        std::vector<int> changeCustomer;
        for (int k = 0; k < nCustomer; ++k)
        {
            if (customerResult[k] == i)
            {
                changeCustomer.push_back(k);
            }
        }
        // 返还空间给设备
        for (int x = 0; x < nFacility; ++x)
        {
            if(spareCapacity[x].id == i){
                spareCapacity[x].capacity = facilityVector[x].capacity;
                break;
            }
        }
        for (int k = 0; k < changeCustomer.size(); ++k)
        {
            // 采用容量best fit,根据容量的大小来安排
            sort(spareCapacity.begin(),spareCapacity.end());
            for(int x = 0; x < nFacility; x++){
                if(customerVector[changeCustomer[k]].demand < spareCapacity[x].capacity){
                    spareCapacity[x].capacity -= customerVector[changeCustomer[k]].demand;
                    customerResult[changeCustomer[k]] = spareCapacity[x].id;
                    facilityResult[spareCapacity[x].id] = 1;
                    break;
                }
            }
        }
        break;
    }
    count--;
(2) 提取两个设备的所有用户出来,重新分配

随机找到两个设备,要求这两个设备都具有用户的,将提取出来的用户重新分配。

需要的操作:

  • 将a, b设备的用户提取出来
  • 将a, b设备的容量还原
  • 将提取出来的用户按照容量Best Fit重新放置
  • 更改设备的容量
  • 重新统计该解的花费
int i1 = rand() % nFacility;
int i2 = rand() % nFacility;
while(i1 == i2) i2 = rand() % nFacility;
// 随机搜索一些用户,拿出来重新放置 
int count = nCustomer;
// 需要改变的用户
std::vector<int> changeCustomer;
for (int k = 0; k < count; ++k)
{
    if (customerResult[k] == i1)
    {
        changeCustomer.push_back(k);
        // 返还空间给设备
        for (int x = 0; x < nFacility; ++x)
        {
            if(spareCapacity[x].id == i1){
                spareCapacity[x].capacity += customerVector[k].demand;
                break;
            }
        }
    }
}
for (int k = 0; k < count; ++k)
{
    if (customerResult[k] == i2)
    {
        changeCustomer.push_back(k);
        // 返还空间给设备
        for (int x = 0; x < nFacility; ++x)
        {
            if(spareCapacity[x].id == i2){
                spareCapacity[x].capacity += customerVector[k].demand;
                break;
            }
        }
    }
}
facilityResult[i1] = 0;
facilityResult[i2] = 0;
// 从下一个开始装填
int j = (i1+i2) % nFacility;
for (int k = 0; k < changeCustomer.size(); ++k)
{
    // 采用best fit 
    sort(spareCapacity.begin(),spareCapacity.end());
    for(int x = 0; x < nFacility; x++){
        if(customerVector[changeCustomer[k]].demand < spareCapacity[x].capacity){
            spareCapacity[x].capacity -= customerVector[changeCustomer[k]].demand;
            customerResult[changeCustomer[k]] = spareCapacity[x].id;
            //cout << "spareCapacity[x].id " << spareCapacity[x].id << endl;
            facilityResult[spareCapacity[x].id] = 1;
            break;
        }
    }
}
break;
(3) 提取所有设备的最后两个用户出来,重新分配

要求用户数大于等于2的设备,提取出来的用户重新分配。

需要的操作:

  • 将所有设备的用户提取出来
  • 将所有设备的容量填补
  • 将提取出来的用户按照价格Best Fit重新放置
  • 更改设备的容量
  • 重新统计该解的花费
// 将每个设备的后面4个客户拿出来,重新分配
// 统计每个设备的顾客
vector<vector<int> > v(nFacility);
// 需要改变的用户
std::vector<int> changeCustomer;
for (int i = 0; i < nCustomer; ++i)
{
    v[customerResult[i]].push_back(i);
}
for (int i = 0; i < v.size(); ++i)
{
    if(v[i].size() > 2){
        int temp1 = v[i].back();
        v[i].pop_back();
        // 返还空间给设备
        for (int x = 0; x < nFacility; ++x)
        {
            if(spareCapacity[x].id == i){
                spareCapacity[x].capacity += customerVector[temp1].demand;
                break;
            }
        }
        int temp2 = v[i].back();
        v[i].pop_back();
        // 返还空间给设备
        for (int x = 0; x < nFacility; ++x)
        {
            if(spareCapacity[x].id == i){
                spareCapacity[x].capacity += customerVector[temp2].demand;
                break;
            }
        }
        changeCustomer.push_back(temp1);
        changeCustomer.push_back(temp2);
    }
}
for (int k = 0; k < changeCustomer.size(); ++k)
{
    // 采用价格best fit 
    std::vector<customer_cost> vc;
    vc = customerVector[k].cost;
    sort(vc.begin(),vc.end());
    for(int x = 0; x < nFacility; x++){
        int fa_subscript = 0;
        // 找下标 
        for(int q = 0; q < nFacility; q++){
            if(vc[x].id == spareCapacity[q].id){
                fa_subscript = q;
                break;
            }
        }
        // 减容量
        if(spareCapacity[fa_subscript].capacity > customerVector[k].demand){
            spareCapacity[fa_subscript].capacity -= customerVector[k].demand;
            customerResult[changeCustomer[k]] = vc[x].id;
            facilityResult[vc[x].id] = 1;
            break;
        } 
    }
}
break;
e. 设置循环次数,局部搜索

局部搜索仅接受好解,当遇到差解时,保留旧解。循环多次直到解不再改变,这时说明局部搜索进入了局部最优解,而且无法跳出来。

Solution SA() {
    //之后用到很多随机数,设定种子
    srand(time(0));
    int i = 0;
    Solution s;
    // 查看初解
    Solution best = s;
    //设定一个固定的循环次数
    for (i = 0; i < turn; i++) {
        Solution next = s;
        getNewSolution(next);//获取邻域解
        if (Accept(next, s, t)) {
            s = next;//接受新解为当前最优
            if(next < best){//记录全局最优
                best = next;
            }
        }
    }
    return best;
}

其中Accept函数仅介绍比当前解要好的解,而getNewSolution就是通过之前定义的领域查找操作获取新解。

2.添加模拟退火算法

在局部搜索的基础上,不改变局部搜索的策略,仅仅添加上温度的控制,以此来让算法在一定的概率下接受差解。

参数设定

定义初始温度为20000,接受温度为0.0001,退火系数为0.99(即 T i + 1 = 0.99 ∗ T i T_{i+1} = 0.99 * T_i Ti+1=0.99Ti)

每个温度内循环为1000次

将局部搜索加入到每一个温度下的循环中,并且找到一个新解时候,判断其与旧解的差值。利用这个插值以及温度来设定概率,用这个概率判断是否接受这个差解,当然好解仍然是全部接受。

执行完一次温度的1000次内循环,进行降温操作。

为了提高精度,在降温到一定程度,我还使用了二次升温的操作,能继续跳出局部最优。

Solution best = s;
int addT = 0;
while (t > acceptT) {
    //设定一个固定的循环次数
    for (i = 0; i < turn; i++) {
        Solution next = s;
        getNewSolution(next);//获取邻域解
        //cout << next.CheckSolution() << " " << i << endl;
        if (Accept(next, s, t)) {
            s = next;//接受新解为当前最优
            if(next < best){//记录全局最优
                best = next;
            }
        }
    }
    t *= r;//降温
    //升温 
    if(addT < 3 && t < 20){
        t *= 20;
        addT++;
    }
}

四.样例测试结果

实验环境: Windows10

局部搜索算法与模拟退火算法的结果

结果图表展示:

Result(SA)Time(s)(SA)Result(LS)Time(s)(LS)
p1150543.599184361.320
p2157304.235198561.217
p3187954.689240131.356
p4222084.761290141.157
p5182314.16201651.323
p6199974.404341031.029
p7211554.075256121.594
p8207884.259246581.358
p9188344.019268741.364
p10153194.707216841.277
p11193233.407256741.471
p12191523.876264531.351
p13166884.881243510.987
p14184375.584213681.375
p15153284.741198741.312
p16163775.135187951.489
p17142815.038196341.687
p18183754.976198741.547
p19186994.794201201.214
p20171475.239243101.200
p21155695.272215871.219
p22147275.402195741.354
p23181814.823201481.114
p24165395.032246871.365
p25549577.822841231.987
p26666878.808847122.359
p27629947.691789982.126
p28839728.832985641.784
p29718498.144956781.859
p30422157.794659871.879
p31611487.893668742.003
p32552067.586652392.410
p33476428.265754621.983
p34887018.368956112.153
p35523717.268667821.984
p36551417.025796212.264
p37699958.635985612.361
p38572208.546778562.223
p39626028.587854631.925
p40921818.286987112.314
p41128464.085156871.256
p42122606.124156551.597
p43113876.221132001.548
p4141503.99148951.268
p45123935.669135471.344
p46110545.971153141.562
p47129823.371143551.435
p48110696.018164231.998
p49104147.082132512.013
p50152683.790154681.246
p51183697.856201141.985
p52185394.471264782.014
p53153787.315204312.687
p54212683.911251431.654
p55173706.965195621.664
p564439012.102568993.012
p575429611.502985432.987
p584848612.382562142.887
p595969810.41853563.124
p604879311.909635123.210
p614682112.259598233.214
p625227111.585649852.963
p634390911.592473512.799
p644430712.712536843.569
p654846511.768581642.689
p664755612.533600123.045
p674706212.556568413.512
p684646712.680462953.246
p694315712.321486522.869
p705393011.740856122.694
p714907211.782625483.001

Detailed solution for each instance

  • p1

花费:15509
1 1 1 1 1 1 1 1 1 1
0 2 8 2 9 2 5 4 7 7 8 7 4 0 6 4 7 4 5 9 1 9 4 6 8 3 5 9 0 0 6 2 2 1 3 7 9 1 6 4 8 1 8 5 9 7 9 4 9 4

  • p2

花费:15730
1 1 1 1 1 1 1 1 1 1
5 2 8 8 1 1 4 0 3 0 1 5 1 9 0 4 2 9 2 2 7 0 1 4 4 2 2 4 0 3 3 8 2 4 3 7 6 4 9 4 5 7 4 6 5 8 6 3 4 9

  • p3

花费:18795
1 1 1 1 0 1 1 0 0 1
1 2 3 9 5 6 2 2 0 1 9 3 9 2 3 5 5 6 6 5 3 0 1 0 6 2 3 0 0 9 3 3 9 2 3 2 9 5 9 0 5 2 0 9 2 5 0 2 5 0

  • p4

花费:22208
1 0 1 0 1 0 1 0 1 1
9 9 9 9 9 9 6 6 6 9 9 9 0 2 2 2 2 2 2 2 0 0 0 0 0 0 6 6 6 6 6 6 6 4 4 4 4 0 8 0 2 9 8 8 8 6 6 6 6 9

  • p5

花费:18231
1 0 1 1 1 1 0 0 1 0
5 2 5 4 0 0 2 4 4 2 5 8 4 4 4 2 2 0 0 5 5 3 3 5 0 2 8 0 8 5 3 8 4 4 3 0 4 3 0 3 5 3 5 2 8 3 2 5 3 4

  • p6

花费:19997
1 0 0 0 1 1 1 1 0 1
5 9 5 7 9 4 5 5 5 4 5 9 9 9 9 4 6 6 6 9 7 7 6 5 7 6 5 7 9 0 4 5 7 4 0 0 6 5 6 5 6 5 4 9 7 5 0 9 9 0

  • p7

花费:21155
1 0 1 1 0 0 1 1 0 1
7 6 9 9 6 6 9 7 7 7 7 7 2 2 2 2 2 2 2 2 6 6 6 9 9 9 9 9 7 2 9 9 9 0 6 0 0 0 0 0 0 0 3 3 0 3 6 6 3 6

  • p8

花费:20788
0 0 1 1 1 1 1 1 1 1
5 5 9 5 5 5 6 6 6 2 6 4 2 9 6 3 6 7 3 7 9 4 2 4 9 9 9 9 4 9 3 3 9 3 3 5 7 3 8 9 2 5 9 6 6 8 8 9 5 6

  • p9

花费:18834
1 0 0 0 1 0 1 1 1 1
0 0 9 8 4 9 8 0 6 6 6 6 6 4 4 4 4 9 9 9 7 7 7 6 8 6 6 9 9 6 9 9 4 0 6 6 0 4 6 9 0 7 7 4 7 7 0 4 0 4

  • p10

花费:15319
1 1 1 1 1 1 1 1 1 1
1 7 8 2 7 9 5 9 7 0 8 3 9 8 1 5 5 6 7 5 5 0 2 5 4 9 8 5 9 0 4 0 7 0 3 7 9 5 4 1 5 5 1 3 9 7 0 4 9 6

  • p11

花费:19323
1 1 1 1 1 0 1 0 0 1
4 4 6 2 6 6 2 4 9 2 4 6 0 3 6 0 3 0 9 9 1 9 1 4 9 4 0 1 9 3 6 6 0 4 3 6 9 9 4 6 6 6 6 9 6 6 0 0 9 0

  • p12

花费:19152
0 1 1 0 1 1 1 1 0 1
9 4 5 2 9 2 2 4 2 2 9 7 9 5 9 5 4 4 2 2 9 9 2 9 7 9 4 4 7 6 1 6 2 1 1 6 7 1 5 5 5 7 5 5 9 7 6 9 6 4

  • p13

花费:16688
0 1 1 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 0 0
17 2 14 15 14 10 12 15 10 7 12 8 17 10 7 17 8 17 10 17 17 15 14 2 1 17 15 7 1 14 12 8 14 12 7 1 2 7 10 1 10 15 2 1 17 10 2 8 8 7

  • p14

花费:18437
0 1 1 0 0 0 1 1 1 0 0 0 1 0 0 1 0 1 1 0
15 15 18 18 2 18 2 8 8 17 12 2 15 6 15 12 7 15 7 15 1 17 12 7 15 2 1 7 18 6 2 18 1 18 7 12 1 7 17 15 8 6 1 17 8 2 12 6 17 8

  • p15

花费:15328
1 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 1 1 1 0
0 6 16 18 18 14 8 18 14 16 6 18 17 12 9 8 16 14 0 9 12 8 12 9 17 17 14 9 9 6 12 9 14 6 6 16 0 17 0 17 17 6 16 18 14 12 18 8 8 18

  • p16

花费:16377
0 0 0 0 1 1 1 1 1 0 1 0 1 1 0 0 0 1 0 0
4 6 5 7 8 6 17 12 10 4 4 8 8 10 13 13 4 7 12 17 5 13 8 5 10 17 13 7 10 6 12 4 6 4 8 7 4 17 7 10 13 6 5 17 7 5 7 5 17 8

  • p17

花费:14281
0 0 0 1 1 1 1 0 1 1 0 1 0 0 0 1 0 1 0 0
8 6 11 15 6 5 3 11 17 4 9 3 17 6 9 8 15 15 6 15 8 17 9 5 17 3 4 11 5 6 4 8 8 5 9 4 11 15 11 11 3 17 9 17 6 5 3 5 15 8

  • p18

花费:18375
0 0 1 1 0 0 0 1 1 0 0 1 1 1 1 1 0 0 0 1
7 19 3 19 2 12 19 19 15 19 15 12 2 12 7 19 15 14 7 3 3 3 3 14 2 2 15 7 13 14 11 15 7 12 7 14 11 13 12 13 3 2 11 19 19 7 2 14 13 13

  • p19

花费:18699
1 1 0 1 1 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0
3 13 1 7 7 14 7 7 13 0 12 12 17 1 13 13 14 3 1 3 4 4 12 17 13 0 4 3 3 14 12 14 7 4 17 17 12 17 4 14 0 13 3 7 7 4 17 1 17 0

  • p20

花费:17147
1 0 0 0 1 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0
16 13 14 18 14 4 17 11 13 0 16 17 18 18 16 13 11 0 16 13 15 16 11 17 14 17 15 13 17 18 4 0 11 4 0 13 14 14 18 13 4 16 11 15 0 4 0 17 15 18

  • p21

花费:15569
1 0 0 0 1 0 1 0 1 0 1 1 1 0 0 1 0 0 1 0
0 6 11 10 6 6 12 11 10 4 18 8 10 18 12 8 15 11 0 10 12 4 18 8 10 0 15 0 18 4 12 0 6 4 10 8 4 6 11 8 10 11 6 18 18 18 10 11 4 12

  • p22

花费:14727
1 1 1 0 1 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0
0 13 11 13 4 14 1 8 8 6 6 8 14 2 2 1 2 14 11 1 13 4 4 14 14 8 6 14 2 6 4 13 0 4 0 1 0 0 11 4 13 1 11 2 6 8 8 11 13 2

  • p23

花费:18181
0 0 0 1 1 0 1 1 0 0 1 0 0 0 1 0 1 1 0 0
4 6 10 7 16 16 10 6 17 14 4 3 17 10 3 16 4 10 16 17 4 4 17 14 6 17 6 3 14 14 16 16 6 4 4 10 17 14 6 10 3 3 3 7 7 7 17 7 7 7

  • p24

花费:16539
0 1 0 1 0 1 1 0 1 1 0 0 0 1 0 1 1 0 0 0
16 13 3 1 16 9 1 8 9 6 8 5 5 16 8 1 13 15 5 5 1 9 15 13 6 3 15 16 15 6 5 13 6 13 9 8 1 15 6 9 3 13 3 9 8 5 3 3 1 16

  • p25

花费:54957
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1
3 0 6 29 23 21 23 22 28 18 29 24 13 4 5 3 29 4 29 23 23 5 28 25 27 26 13 26 10 11 3 25 21 13 29 14 13 0 27 2 27 10 28 2 28 20 24 12 12 12 24 20 19 10 24 24 2 25 2 25 23 0 8 25 9 0 19 18 19 4 16 13 18 4 4 11 14 18 9 9 8 21 13 9 22 9 24 14 23 23 8 8 10 10 6 10 26 26 0 3 0 22 16 13 18 26 16 22 16 7 2 3 6 7 7 4 19 18 5 8 21 27 27 16 2 5 20 3 16 16 20 7 16 10 5 21 22 21 7 20 2 11 12 11 6 11 28 14 3 6

  • p26

花费:66687
1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
7 25 2 6 6 7 6 4 13 18 23 23 25 18 3 15 16 3 23 26 20 7 0 27 22 28 26 27 28 24 22 27 7 9 9 0 2 15 21 15 17 4 22 8 24 16 26 14 14 25 2 10 8 14 16 6 6 3 15 6 20 28 9 21 1 6 26 22 10 10 11 2 11 11 18 18 25 16 3 17 11 3 20 25 7 4 1 4 26 26 0 8 17 7 4 4 10 23 23 20 4 0 8 15 18 10 17 18 3 28 6 20 10 27 15 16 28 10 13 9 20 3 1 7 13 10 0 27 17 2 5 24 14 9 9 14 22 13 21 1 15 13 24 16 24 7 21 3 11 7

  • p27

花费:62994
0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1
17 16 18 17 12 20 20 22 19 26 21 22 10 21 6 24 28 11 27 1 3 26 24 28 24 5 13 6 16 4 7 21 15 3 11 25 19 15 29 2 5 1 12 17 28 18 11 17 10 12 14 16 28 10 1 18 24 29 10 17 26 18 6 7 3 8 26 8 5 3 25 2 6 14 5 21 12 19 27 17 25 8 15 21 25 2 13 6 6 3 4 27 4 20 22 18 5 7 22 13 15 24 11 11 11 3 8 29 10 4 4 27 24 15 13 10 19 18 1 28 18 5 1 10 13 20 14 14 3 16 24 8 16 10 14 26 20 19 29 7 16 2 22 25 13 29 2 8 3 27

  • p28

花费:83972
1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 0
11 11 11 11 11 11 11 11 22 22 22 22 22 22 22 22 22 16 16 16 16 16 16 16 16 0 0 0 0 0 27 27 27 27 27 27 27 5 5 5 5 5 25 25 25 25 25 25 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 9 9 9 9 9 28 28 28 28 28 28 8 8 8 8 21 21 21 21 21 7 7 7 7 7 7 7 10 10 10 10 10 10 13 13 13 13 13 13 24 24 24 24 24 24 24 24 24 24 12 12 12 12 12 14 14 14 14 14 19 19 19 19 19 19 19 19 20 20 20 20 20 1 1 1 1 18 18 18 18 18 18 18 23 23 23

  • p29

花费:91849
1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1
25 25 25 25 25 25 25 5 5 5 5 5 5 5 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 4 4 4 29 29 29 29 29 9 9 9 9 9 22 22 22 22 22 22 8 8 8 8 8 26 26 26 26 26 26 26 15 15 15 15 15 15 15 7 7 7 7 7 7 7 0 0 0 0 0 13 13 13 13 13 1 1 1 1 6 6 6 6 6 6 16 16 16 16 16 16 16 17 17 17 17 17 17 17 17 17 14 14 14 14 14 14 28 28 28 28 28 18 18 18 18 18 18 18 18 21 21 21 21 20 20 20 20 20 23 23 23 23 23 23 23 12

  • p30

花费:42215
1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1
25 28 17 18 3 1 15 28 8 4 20 17 27 24 3 13 15 10 26 29 27 23 26 17 29 7 15 27 27 23 27 10 23 4 23 23 25 23 28 21 20 6 27 25 21 26 5 16 21 0 22 16 29 25 17 26 11 27 28 9 22 16 18 10 13 4 24 16 10 3 26 22 22 16 5 8 14 9 9 14 4 16 18 18 1 20 13 13 18 13 2 24 22 7 1 10 21 24 0 11 14 26 2 18 7 14 7 18 18 7 29 27 18 25 11 10 8 14 9 17 1 20 5 17 8 29 28 3 14 5 23 13 8 9 21 0 1 11 4 6 20 2 2 11 3 1 3 6 15 6

  • p31

花费:61148
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
19 2 2 22 14 28 26 5 5 28 8 8 28 10 2 21 22 9 6 28 1 8 12 24 29 26 27 19 18 18 16 14 20 14 20 28 22 17 26 3 23 23 24 15 19 21 23 1 13 21 12 13 14 25 22 25 7 29 1 27 10 8 10 25 7 10 8 15 5 8 15 27 27 25 13 25 13 10 1 11 2 7 10 16 25 6 5 17 5 23 6 12 6 19 17 23 20 11 19 3 22 29 3 25 7 18 15 27 15 14 18 21 24 1 29 22 20 29 9 22 7 21 11 9 6 18 17 7 26 26 24 2 9 24 13 23 17 29 28 3 11 19 21 20 15 18 16 9 16 12

  • p32

花费:55206
1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1
23 6 1 16 27 25 17 18 19 19 25 25 16 27 24 3 4 26 5 23 5 29 4 23 0 21 25 14 22 15 19 3 27 28 22 28 26 22 12 7 23 12 25 7 10 21 24 28 27 8 26 21 8 25 8 27 0 29 6 2 22 16 8 10 24 24 18 18 19 2 29 17 23 5 5 6 3 9 26 12 26 24 24 21 22 17 5 23 3 25 10 2 6 6 13 18 8 15 2 16 7 18 3 9 15 2 16 29 15 13 23 0 1 21 26 2 13 29 4 9 27 10 14 15 17 1 28 19 10 29 14 13 9 7 7 14 0 22 0 17 4 3 27 16 1 18 12 1 19 13

  • p33

花费:47642
1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1
26 29 25 20 22 12 21 12 24 13 28 26 18 6 15 12 11 28 5 21 24 17 20 7 26 26 22 23 23 6 17 17 15 24 0 2 27 11 22 27 21 28 27 2 18 20 23 15 14 23 11 13 29 26 5 24 3 29 13 29 29 13 16 25 1 2 5 15 20 3 14 2 3 2 14 2 16 9 9 0 10 9 9 7 16 10 1 5 18 23 15 0 20 10 5 1 21 3 10 1 12 26 13 0 9 10 27 22 16 6 12 16 16 25 7 24 8 6 21 9 27 22 24 11 6 1 28 13 14 7 22 12 16 7 16 23 0 6 17 8 15 14 18 25 11 14 28 18 3 17

  • p34

花费:88701
1 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0
24 24 24 24 24 24 24 24 24 28 28 28 28 28 28 16 16 16 16 16 16 16 16 2 2 2 2 2 2 2 20 20 20 20 20 25 25 25 25 25 25 22 22 22 22 22 22 22 3 3 3 3 3 3 8 8 8 8 8 17 17 17 17 17 17 17 17 7 7 7 7 7 7 7 7 26 26 26 26 26 26 12 12 12 12 12 13 13 13 13 13 13 9 9 9 9 9 27 27 27 27 27 27 0 0 0 0 0 0 0 15 15 15 15 15 15 15 18 18 18 18 18 18 18 18 18 19 19 19 19 19 19 19 4 4 4 4 4 4 4 21 21 21 21 21 10 10 10 10 10

  • p35

花费:53371
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1
3 11 18 8 0 9 7 26 5 22 1 24 1 16 7 10 25 0 27 21 6 27 26 21 5 13 26 26 2 24 25 11 22 25 23 22 4 14 27 13 28 22 21 4 21 11 2 23 26 23 28 2 19 10 1 18 0 15 3 4 24 13 10 10 10 2 3 15 7 13 10 15 27 2 2 6 6 1 5 26 24 21 3 16 15 14 19 3 9 15 11 16 19 9 11 15 27 18 4 8 3 11 20 10 9 0 8 6 21 8 0 28 9 0 13 4 16 18 9 4 15 24 14 5 1 14 28 19 13 7 10 16 8 4 7 23 28 24 25 5 22 25 20 18 5 14 6 22 3 1

  • p36

花费:55141
1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
25 17 2 29 22 1 20 5 10 20 6 18 24 24 27 17 19 27 23 5 21 24 22 5 25 3 0 26 26 15 26 8 25 26 24 18 3 23 1 1 25 13 13 26 4 14 29 8 3 22 22 22 6 7 16 6 17 11 5 15 0 16 24 25 29 13 17 15 18 7 23 29 22 6 3 10 14 8 21 6 14 13 20 0 4 16 23 4 23 2 29 2 2 7 1 22 11 27 19 11 21 4 18 7 13 18 7 3 21 11 17 27 19 8 8 14 10 16 10 16 29 27 19 16 21 0 26 24 5 15 10 27 11 1 9 21 20 9 19 13 11 19 14 15 4 4 7 20 5 17

  • p37

花费:89995
1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0
0 0 0 0 0 0 16 16 16 16 16 16 16 16 19 19 19 19 19 19 19 19 19 22 22 22 22 22 22 22 4 4 4 4 4 4 4 4 14 14 14 14 15 15 15 15 15 15 18 18 18 18 18 18 18 18 8 8 8 8 8 9 9 9 9 9 9 20 20 20 20 20 20 24 24 24 24 24 24 24 24 12 12 12 12 12 26 26 26 26 26 26 2 2 2 2 2 2 2 11 11 11 11 11 11 11 11 17 17 17 17 17 17 17 17 5 5 5 5 5 5 5 1 1 1 1 1 3 3 3 3 3 3 3 23 23 23 23 23 23 23 21 21 21 21 27 27 27 27 27

  • p38

花费:57220
1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
24 24 27 17 21 5 27 7 10 22 4 22 23 0 25 23 4 17 9 8 15 17 7 11 28 12 22 12 23 20 11 8 5 23 5 20 4 6 21 25 20 1 2 28 29 22 15 6 13 29 6 16 9 5 5 24 19 0 15 10 2 24 8 5 16 8 2 27 22 13 6 16 11 11 1 10 21 19 16 16 22 0 10 25 1 5 29 24 0 1 21 7 16 19 0 21 7 27 13 22 13 19 19 8 4 11 27 12 13 7 12 12 16 10 17 29 17 16 18 13 1 28 19 28 17 20 2 29 11 23 6 8 24 25 25 28 20 7 9 4 25 19 15 6 15 6 27 8 23 9

  • p39

花费:62602
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1
7 24 26 3 12 1 4 21 5 6 20 25 29 23 12 2 23 0 23 29 6 9 23 0 20 23 29 22 13 22 21 10 16 26 9 3 13 15 0 8 21 21 2 4 8 24 2 17 9 26 11 11 24 9 9 24 13 5 3 20 10 0 15 5 13 15 27 27 27 4 24 10 12 15 25 13 7 29 8 29 1 10 16 15 13 27 8 24 5 5 18 17 17 16 25 16 25 10 12 1 25 2 17 10 16 16 12 18 25 7 7 6 10 18 1 8 27 16 3 13 10 6 6 4 7 22 26 3 9 20 4 8 6 2 11 22 20 15 27 1 22 11 18 11 4 29 20 16 0 0

  • p40

花费:92181
1 0 1 1 1 1 0 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 0
7 7 7 7 7 7 7 7 3 3 3 3 3 3 3 3 3 10 10 10 10 10 10 10 18 18 18 18 18 18 18 18 22 22 22 22 22 22 22 4 4 4 4 4 4 4 4 27 27 27 27 27 27 27 0 0 0 0 0 0 12 12 12 12 12 12 9 9 9 9 9 9 26 26 26 26 26 26 11 11 11 11 11 11 11 25 25 25 25 25 25 5 5 5 5 5 5 14 14 14 14 14 15 15 15 15 15 15 15 17 17 17 17 17 17 17 17 21 21 21 21 21 21 16 16 16 16 16 16 16 24 24 24 24 24 24 24 24 19 19 19 19 19 19 28 28 28 28 28 2

  • p41

花费:13479
1 0 1 1 0 1 1 0 0 0
0 6 0 0 0 3 0 0 0 0 0 0 0 3 2 6 3 2 2 2 2 5 3 0 5 5 5 5 5 5 5 5 5 2 0 2 2 2 2 2 2 2 6 2 6 6 6 6 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 6 6 6 6 6 6 6 6 6 6 5 6 5 5 5 5 6

  • p42

花费:12260
0 1 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0
12 12 8 8 8 18 12 8 8 8 1 1 1 8 1 18 1 1 1 18 12 18 18 12 12 12 18 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18

  • p43

花费:9994
1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
22 0 13 13 11 15 22 7 22 11 22 11 7 0 15 22 13 11 7 13 0 13 0 22 15 13 13 13 7 11 0 22 13 15 11 15 11 15 22 11 13 7 0 0 15 22 0 11 15 11 7 11 13 7 15 15 0 15 22 15 7 11 7 0 0 11 22 15 15 11

  • p44

花费:14150
1 1 1 1 0 1 0 0 1 1
3 2 9 9 1 9 5 1 1 1 9 1 1 1 8 8 5 8 8 8 8 5 5 5 5 5 5 0 0 0 5 5 2 0 5 0 2 2 2 5 8 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 9 2 2 5 0 2 9 9 2 0 2 2 5 2 2 5 5 5 5 5 0

  • p45

花费:12393
0 0 0 0 1 1 1 0 0 1 0 0 1 1 0 1 0 0 0 1
12 4 4 4 19 4 4 4 13 13 4 15 15 12 15 15 4 13 15 13 13 13 13 5 13 5 5 5 5 5 5 5 12 5 12 15 12 12 12 12 12 12 15 4 15 15 15 15 15 13 13 13 15 13 13 13 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 15 15

  • p46

花费:11054
1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1
13 23 23 23 23 20 20 20 20 20 20 13 20 23 23 29 20 23 17 17 29 23 29 29 23 20 29 13 29 13 13 13 23 17 20 29 29 23 23 13 13 23 23 29 23 23 17 23 13 13 20 13 23 20 17 20 17 20 20 0 0 0 17 13 29 0 0 0 0 23

  • p47

花费:12982
1 1 1 1 1 1 1 1 1 1
6 7 0 8 8 9 1 2 6 7 0 3 9 3 0 6 6 2 2 8 5 6 3 1 8 9 6 9 1 8 5 5 8 2 5 8 5 1 0 8 3 0 0 9 6 2 7 6 2 2 6 9 2 6 2 2 5 1 5 4 8 2 0 3 0 2 2 1 9 2 1 4 9 9 5 5 5 5 5 5 3 5 7 7 7 7 2 2 2 3

  • p48

花费:11069
0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 1
1 11 10 16 1 1 1 1 1 19 16 19 19 19 19 10 10 10 19 10 12 10 10 19 12 10 12 11 10 12 12 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 11 12 11 12 16 16 16 1 16 16 11 16 16 16 11 16 16 16 11 11 11 11 11 11 11

  • p49

花费:10414
0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3

  • p50

花费:15268
1 1 1 1 1 1 1 1 1 1
3 4 2 9 4 1 0 6 2 3 7 9 0 3 7 5 3 0 1 4 4 3 6 7 4 3 7 9 0 6 9 0 4 3 7 7 9 6 3 2 4 4 3 7 1 3 3 3 3 4 4 1 4 4 9 3 3 6 6 0 2 1 4 3 7 3 6 9 1 2 4 7 4 8 4 2 9 6 7 8 5 1 1 6 3 5 6 0 5 4 4 3 6 4 4 4 4 4 4 4

  • p51

花费:18369
0 0 0 0 0 1 0 0 0 1 1 0 1 1 1 0 1 0 1 1
16 18 19 19 13 9 13 19 19 19 9 19 18 14 10 19 13 10 10 10 19 10 18 16 10 9 14 10 10 9 10 19 10 19 13 9 13 9 14 19 9 10 9 9 14 19 19 13 13 10 9 13 19 13 13 9 13 19 13 10 13 13 19 13 14 19 10 16 10 10 19 16 10 10 16 10 14 10 13 10 18 19 18 13 16 10 16 18 16 10 19 19 16 16 16 10 10 19 16 10

  • p52

花费:18539
1 0 1 1 1 1 1 1 0 1
3 7 3 3 3 6 3 9 6 3 5 6 6 2 3 2 9 3 2 2 3 3 3 3 3 3 3 6 6 7 6 6 2 2 7 2 5 9 7 2 2 5 5 5 5 2 5 6 6 6 5 7 0 6 3 2 5 4 4 7 0 7 0 5 0 4 4 0 9 7 5 0 0 0 0 9 9 9 5 9 5 6 6 7 3 6 5 9 0 9 6 2 5 9 4 6 5 9 5 0

  • p53

花费:15378
0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1
7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 6 6 11 11 11 11 11 11 1 7 11 7 19 19 1 11 1 11 11 11 11 11 11 11 19 7 11 11 19 11 6 19 11 11 19 19 19 19 11 11 19 11 11 11 6 6 6 19 6 11 6 6 6 6 19 6 19 6 6 19 11 6 19 19 11 11 11 11 11 19

  • p54

花费:21268
0 1 1 1 1 0 0 0 0 1
9 9 9 9 9 9 9 9 9 9 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4

  • p55

花费:17370
0 1 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 1
2 10 10 10 10 15 2 10 10 1 1 19 19 6 19 6 6 6 6 19 19 1 15 10 15 15 15 15 13 13 13 19 19 19 6 19 13 13 1 13 10 10 10 1 1 2 13 19 19 13 19 19 19 19 1 19 19 13 13 6 13 15 13 15 15 13 2 2 2 2 2 2 2 2 2 2 13 10 15 15 6 15 6 15 2 2 19 19 19 19 19 19 19 19 19 19 19 19 19 19

  • p56

花费:44390
0 1 1 0 1 0 0 0 1 1 0 1 1 1 1 0 1 0 0 0 1 1 1 1 0 1 0 1 0 1
20 1 23 16 16 25 25 1 16 16 16 16 16 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 23 16 27 23 13 21 13 29 23 27 27 23 27 27 27 27 9 29 27 27 27 9 27 27 27 27 4 13 13 13 13 29 13 9 14 14 8 8 8 27 8 29 8 1 12 16 12 14 22 16 12 11 25 13 2 14 14 23 16 2 25 25 25 25 25 4 25 20 9 29 25 4 21 16 4 21 21 21 16 16 29 16 9 25 25 1 1 1 8 1 14 21 25 25 25 2 2 13 2 13 2 13 13 2 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 9 29 16 14 27 20 29 9 25 20 20 29 20 20 20 20 9 20 20 27 27 27 27 27 27 27 27 27 27 27 27 27

  • p57

花费:54296
0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 1 1 0 0 0 0 1 0 0 0 1 0 1 0
28 28 28 28 28 28 28 28 28 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 1 1 1 1 1 1 1 1 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 8 8 8 8 8 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 22 22 22 22 22 22 22 22 22 22 22 22

  • p58

花费:48486
1 1 1 1 0 0 1 1 0 0 0 1 0 1 0 1 1 0 1 1 1 0 1 1 1 1 1 1 0 0
25 19 20 24 18 22 13 27 13 18 13 15 15 22 22 22 26 22 19 6 11 19 13 26 13 13 11 19 18 19 24 27 13 22 27 11 24 22 24 23 7 19 20 1 1 24 13 22 1 27 13 18 1 11 19 13 25 22 15 25 22 15 22 15 7 23 23 23 15 15 6 6 6 6 6 7 13 22 25 6 25 19 20 15 6 6 6 22 16 7 25 6 16 16 16 16 16 16 16 20 19 19 20 11 19 11 13 19 13 11 18 11 23 0 0 20 20 27 19 26 26 26 26 26 26 16 16 16 16 16 16 16 16 16 19 22 16 11 19 1 18 19 6 6 6 6 6 6 6 6 0 23 1 13 27 27 7 7 26 26 26 6 18 26 26 26 26 26 26 26 11 13 26 16 7 22 0 0 0 16 19 24 23 11 11 11 25 25 24 13 0 13 23 0 24 7 19 27 13 26

  • p59

花费:59698
1 1 1 1 1 0 1 1 0 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0
20 20 20 20 20 20 20 20 20 20 20 20 20 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 12 12 12 12 12 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 9 9 9 9 9 9 9 9 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11

  • p60

花费:48793
1 0 0 0 1 0 1 0 0 1 1 1 1 1 0 1 0 1 0 0 1 1 0 0 0 1 1 0 1 1
10 10 10 10 10 17 10 10 10 0 0 0 0 25 26 25 11 25 25 25 25 25 15 28 4 26 9 12 0 15 15 28 0 28 17 6 15 28 28 28 28 28 28 0 0 29 0 0 29 21 29 29 29 29 20 10 29 29 4 29 4 4 29 13 4 13 25 11 4 4 11 11 25 11 11 11 11 25 20 20 20 20 20 20 20 20 13 20 13 11 13 6 15 26 26 20 25 25 25 25 25 25 25 21 21 21 21 15 15 15 15 15 15 15 6 6 6 6 6 6 6 6 6 6 6 6 6 6 26 26 26 26 26 26 26 26 26 26 26 17 17 17 17 17 17 17 17 17 17 17 17 12 21 17 9 12 12 12 12 4 4 9 9 9 9 9 9 9 17 17 17 17 17 17 17 10 10 10 10 10 10 10 10 10 12 10 10 11 11 11 11 11 11 11 11 13 26 11 17 4

  • p61

花费:46821
0 1 1 0 1 0 1 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 1 1 1 1 1 1 1 1
27 19 14 2 1 22 22 19 19 25 28 28 4 1 27 25 25 28 27 27 24 15 6 9 23 6 23 23 1 23 9 25 6 14 27 19 14 14 25 25 28 26 28 25 19 6 22 15 4 24 1 9 15 6 26 28 1 27 27 14 27 27 27 27 27 6 2 24 28 9 15 23 15 15 23 15 23 9 23 15 9 23 24 15 2 15 24 15 24 15 1 6 24 22 14 9 28 14 4 22 19 22 28 23 23 23 23 9 23 26 26 26 26 26 26 26 26 26 26 26 26 26 2 26 24 24 23 4 15 29 15 15 15 22 29 4 29 19 29 1 4 22 19 23 22 4 9 9 2 2 15 9 11 1 2 27 6 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 4 4 27 27 23 22 27 27 24 24 2 24 2 24 29 4 14 15 15 9

  • p62

花费:52271
0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 1
21 21 21 21 21 21 21 21 21 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 20 20 20 20 20 20 20 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 1 1 1 1 1 1 1 1 29 29 29 29 29 29 29 29 9 9 9 9 9 9

  • p63

花费:43909
1 0 1 1 1 1 1 1 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 1 1 1 1 0 0 1
6 20 11 6 18 5 24 23 15 26 29 24 23 24 24 29 7 0 24 5 24 15 7 5 24 25 25 5 5 25 23 26 24 23 24 6 5 15 23 7 0 24 24 22 7 17 29 7 3 23 26 5 23 11 18 17 7 22 24 29 4 2 11 18 7 29 4 23 20 23 23 23 23 23 23 20 26 0 15 23 3 18 4 24 11 25 0 25 29 22 24 24 26 26 26 23 24 4 6 26 7 22 2 17 6 22 20 2 2 20 25 2 24 7 6 17 24 25 6 18 0 5 5 22 23 5 23 20 20 15 2 24 2 6 11 3 2 0 2 18 6 2 17 17 15 25 17 15 18 7 24 23 20 17 3 25 2 6 20 6 3 17 7 18 24 15 6 5 0 26 2 4 24 4 2 24 15 6 2 24 24 4 26 2 3 2 2 4 20 6 5 4 2 2 24 5 5 4 20 3

  • p64

花费:44307
1 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 1 1 0 1 1 0 1 1 1 1 1 0 0 0
24 17 17 26 6 23 16 25 14 6 25 22 10 22 16 26 11 25 22 16 14 16 14 0 14 10 22 19 17 19 16 10 19 24 10 23 26 24 16 20 17 17 17 17 16 25 11 24 17 26 16 5 17 19 11 19 19 19 26 20 16 20 24 11 20 16 11 15 11 17 22 19 17 25 16 22 25 25 23 19 23 11 23 24 15 19 14 11 24 23 17 6 5 25 22 23 24 25 11 20 6 26 25 20 14 25 22 20 11 23 5 22 16 11 17 15 17 23 5 11 26 5 5 22 6 23 22 14 17 10 22 23 19 17 19 17 6 0 11 0 6 20 26 26 11 11 19 23 0 20 0 20 16 15 19 26 20 0 22 22 0 20 15 0 11 0 17 10 16 16 0 19 23 26 16 5 11 11 22 26 22 22 16 16 26 11 26 11 5 0 5 26 16 19 6 26 11 22 16 22

  • p65

花费:48465
1 1 1 1 1 0 0 0 1 0 0 1 1 1 1 0 0 0 0 0 1 1 0 0 0 1 1 0 1 1
28 4 21 21 21 1 28 21 21 21 21 29 29 29 29 29 20 29 29 11 11 11 11 2 21 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 8 8 8 8 11 11 11 11 29 11 20 20 20 11 20 20 20 20 20 20 20 0 20 20 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 0 0 25 25 25 25 25 25 25 25 25 25 25 13 25 25 13 13 25 14 14 14 14 14 14 14 13 13 13 13 13 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 12 26 13 13 14 2 12 12 8 12 28 28 28 28 28 28 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11

  • p66

花费:47556
1 0 1 0 1 1 0 1 0 0 0 1 0 1 0 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1
25 2 20 11 22 29 13 11 29 2 29 4 11 11 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 4 20 0 0 21 0 22 27 0 0 4 0 13 11 20 0 13 13 4 13 17 21 17 11 11 11 11 22 4 11 11 20 11 11 11 11 5 17 11 25 11 11 13 25 5 27 0 27 11 23 16 20 5 21 27 21 22 21 20 20 20 4 18 18 18 22 4 18 0 29 11 5 2 29 0 17 25 4 27 7 4 17 7 18 5 5 2 2 2 2 2 2 2 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 28 28 18 18 28 4 5 5 5 25 7 27 4 21 7 7 7 7 25 25 25 13 13 7 13 2 21 29 4 11 21 18 2 28 2 22 2 2 0 18 29 2 17 11 18 11 22 2 28 29 17

  • p67

花费:47062
0 0 0 0 1 1 0 1 0 1 1 1 0 1 0 0 0 0 1 1 1 0 1 0 1 1 1 1 1 0
25 4 25 25 13 5 19 26 4 24 24 24 24 25 27 25 26 25 25 24 25 25 25 24 26 19 22 22 13 22 22 22 22 22 27 19 22 22 22 20 5 20 20 20 20 20 19 19 9 19 26 19 19 19 7 19 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 9 18 13 26 25 19 22 11 26 13 18 7 19 24 10 19 18 28 26 28 19 10 26 10 27 4 19 4 27 27 27 13 13 4 18 27 20 5 5 4 13 13 13 13 13 13 13 19 5 5 4 18 4 18 24 9 18 26 10 10 10 10 27 10 10 28 26 25 20 27 26 26 18 18 22 22 4 18 4 22 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 20 20 20 20 20 10 20 20 4 26 20 22 13

  • p68

花费:46467
1 1 0 0 1 0 0 1 0 0 0 1 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1
15 7 29 24 27 7 21 4 21 15 7 29 11 27 22 7 11 4 23 23 11 4 4 27 15 11 7 27 4 23 4 7 11 11 23 22 23 21 29 11 22 27 23 22 23 24 24 21 21 15 21 15 15 15 15 29 7 7 24 29 4 25 25 22 7 20 20 7 17 23 29 4 29 15 13 22 4 13 23 29 25 13 11 25 15 20 24 15 24 23 7 27 24 24 24 25 4 23 13 23 23 23 23 27 24 24 11 17 17 17 17 17 16 16 16 16 16 16 0 16 25 0 0 15 22 22 27 0 22 27 20 4 13 27 4 7 7 27 24 24 27 24 24 25 24 7 23 23 13 15 25 27 15 29 7 7 7 19 19 27 15 20 15 19 19 1 20 1 15 23 19 13 23 19 1 1 13 7 1 13 27 4 4 4 24 20 4 15 19 0 13 20 13 20 19 16 16 13 16 1

  • p69

花费:43157
1 0 1 1 0 1 1 0 0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 0 1 1 1 0 0
16 19 6 6 2 27 16 0 16 11 0 25 15 2 16 17 26 19 19 11 19 3 5 19 15 25 5 25 5 27 27 19 22 25 22 0 10 25 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 5 6 3 25 10 15 22 16 11 17 6 17 19 15 19 22 16 3 6 22 16 10 10 22 27 0 23 22 10 15 27 25 6 16 17 27 6 10 6 15 26 15 26 16 11 26 17 16 16 16 6 6 15 19 22 10 26 3 10 2 22 5 6 2 15 6 26 26 17 2 11 2 2 16 3 2 10 6 5 11 25 6 2 16 16 0 14 11 6 16 14 14 16 14 15 14 27 26 19 15 15 11 6 15 25 11 15 25 26 3 25 6 19 19 0 16 25 19 25 15 5 25 19 19 19 23 16 0 3 0 15 0 0 25 19 6

  • p70

花费:53930
1 0 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 1 1
10 25 13 13 10 12 13 22 10 10 10 10 13 6 6 23 12 23 23 23 23 23 5 12 25 29 5 5 23 5 13 13 26 14 23 28 5 13 13 25 11 29 12 24 24 7 23 12 12 12 5 23 26 26 14 0 22 26 26 11 23 26 26 26 26 26 5 26 13 13 14 14 14 28 14 14 14 0 6 6 6 6 14 6 6 24 24 24 24 12 7 13 0 0 0 0 0 10 10 23 23 28 23 28 28 22 6 23 6 6 6 6 6 6 22 22 22 22 5 28 22 5 29 23 29 29 13 13 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 26 26 26 26 26 6 12 13 23 23 13 13 13 25 25 5 29 14 29 25 11 25 11 11 25 11 11 11 25 12 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11

  • p71

花费:49072
0 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 1 0 1 0 1 1 1 1 1 1 1 1 0 1
9 25 9 20 21 1 10 20 21 26 29 26 26 21 24 18 26 23 18 24 29 9 24 27 27 24 22 22 21 18 16 25 22 16 10 29 16 24 24 22 10 25 22 24 25 11 25 25 16 25 25 16 16 26 25 26 26 26 26 10 26 26 10 10 10 10 29 29 29 21 29 27 27 27 27 27 27 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 22 27 9 21 23 23 27 21 16 20 10 20 27 27 27 10 10 27 27 27 23 20 10 24 9 26 27 10 1 18 23 16 22 10 10 25 25 20 25 25 27 1 26 26 26 26 26 26 26 26 1 24 16 16 16 16 10 24 1 26 29 10 1 1 1 16 16 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 24 27 25 22 16 16 9 18 27

五.结论

使用单纯的局部搜索方法来解决CFLP问题,非常容易陷入局部最优,这样就会导致解的准确度很差,但是我们可以先利用局部搜索的解来作为模拟退火的初解,这样会加快模拟退火的准确度,所以局部搜索在对于一些局部峰值较少的问题还是很好的,因为其收敛速度很快,其解的性质也不会太差。

对于这个CFLP问题的领域搜索:

  • 对于容量
    • FIRST FIT:每次放置第一个找到能容纳需求的容量的设备
    • BEST FIT:每次放置容量恰好大于客户需求的设备
  • 对于花费
    • FIRST FIT:找到第一个花费的设备
    • BEST FIT:找到花费最小的设备,若设备已满,则放置在第二小,以此类推(贪心的思想

经过我设置搜索策略的观察,往往对于花费的BEST FIT操作能找到更好的解,但是如果仅仅使用花费的贪心搜索,这跟贪心算法没什么区别,且达不到最优解,因为会收到容量的限制。故我在搜索策略中加入对于容量的FIRST FIT以及BEST FIT,然而这与花费的结果是有矛盾冲突的,所以也需要再三权衡。

关于局部搜索与模拟退火的对比:局部搜索收敛速度较快,但易陷入局部最优,对于初值不太敏感;而模拟退火算法收敛速度较慢,算法的准确度对于参数的设置以及初解的好坏敏感。对于不同的测试例子也有不同的反馈结果,需要进行调参。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值