日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

近似装箱问题(三种联机算法实现)

發布時間:2025/4/16 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 近似装箱问题(三种联机算法实现) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【0】README

0.1) 本文總結于 數據結構與算法分析, 源代碼均為原創, 旨在 理解 “近似裝箱問題(三種聯機算法實現)” 的idea 并用源代碼加以實現;
0.2) 近似裝箱問題的三種聯機算法 分別是: 下項適合算法 + 首次適合算法 + 最佳適合算法 , 我們將依次給出源代碼實現+算法描述;
0.2)聯機問題+脫機問題

  • version1)聯機裝箱問題: 在這種問題中, 必須將每一件物品放入一個箱子后才處理下一件物品;(英語口語考試, 做完上一題,才能進入下一題作答)
  • version2)脫機裝箱問題:在一個脫機裝箱算法中, 我們做任何事情 都需要等到所有的輸入數據全被讀入后才進行;(一般的考試,你只需要在規定的時間做完題目即可,做題順序不是我們所關心的)

【1】近似裝箱問題

1.1)問題描述: 給定N 項物品, 大小為 s1, s2, ..., sN, 所有的大小都滿足 0 < si < = 1 ;問題是要把這些物品裝到最小數目的箱子中去, 已知每個箱子的容量是1個單位;下圖顯示的是 對N項物品的最優裝箱方法;

1.2)有兩種版本的裝箱問題:

  • version1)聯機裝箱問題: 在這種問題中, 必須將每一件物品放入一個箱子后才處理下一件物品;(英語口語考試, 做完上一題,才能進入下一題作答)
  • version2)脫機裝箱問題:在一個脫機裝箱算法中, 我們做任何事情 都需要等到所有的輸入數據全被讀入后才進行;(一般的考試,你只需要在規定的時間做完題目即可,做題順序不是我們所關心的)

1.3)聯機算法

  • 1.3.1)要考慮的第一個問題是: 一個聯機算法即使在允許無限計算的情況下是否實際上總能給出最優的解答;我們知道, 即使允許無限計算, 聯機算法也必須先放入一項物品然后才能處理下一件物品并且不能改變決定
  • 1.3.2)我們可以證明:聯機算法不總能夠給出最優解;

【2】下項適合算法

2.1)算法描述: 當處理任一物品時, 我們檢查看他是否還能裝進剛剛裝進物品的同一個箱子中去。 如果能夠裝進去, 那么就把它裝入該箱子中, 否則,就開辟一個新箱子;
2.2)看個荔枝:

2.3)source code + printing results

  • 2.3.1)download source code: https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter10/p271_nextFit
  • 2.3.2)source code at a glance:(for complete code , please click the given link above)
void nextfix(double key, int* index) {int i;ElementTypePtr box;ElementTypePtr temp;box = buildSingleElement();box->key = key; // build single box with key overi = *index;for(; i<size; i++){if(surplus[i] < key)continue;temp = boxes[i] ;while(temp->next) temp = temp->next;temp->next = box;surplus[i] -= key;break;}*index = i; }
  • 2.3.3)printing results:

【3】首次適合算法

3.0)出現的問題:雖然下項算法有一個合理的性能保證,但是,它的效果在實踐中是很差的,因為在不需要開辟新箱子的時候它卻開辟了新箱子;
3.1)算法描述:首次適合算法的策略是 依序掃描這些箱子但吧新的一項物品放入足夠盛下它的第一個箱子中。因此,只有當先前放置物品的結果已經沒有再容得下當前物品余地的時候, 我們才開辟一個新箱子;(一句話, 這里是從頭到尾掃描箱子)
3.2)看個荔枝:

3.3)可以斷言:首次適合算法保證其解最多包含最優裝箱數的二倍;因為在任一時刻最多有一個箱子其空出的部分大于箱子的一半,因為若有第二個這樣的箱子, 則它裝的物品就會裝到第一個這樣的箱子中了;
3.4)source code + printing results

  • 3.4.1)download source code: https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter10/p272_firstFit
  • 3.4.2)source code at a glance:(for complete code , please click the given link above)
void firstFix(double key) {int i;ElementTypePtr box;ElementTypePtr temp;box = buildSingleElement();box->key = key; // build single box with key overfor(i=0; i<size; i++){if(surplus[i] < key)continue;temp = boxes[i] ;while(temp->next) temp = temp->next;temp->next = box;surplus[i] -= key;break;} }
  • 3.4.3)printing results:

【4】最佳適合算法

4.1)算法描述:該方法不是吧一項新物品放入所發現的第一個能夠容納它的箱子, 而是放到所有箱子中能夠容納它的最滿的箱子中;
4.2)看個荔枝:

Attention)

  • A1)大小為0.3 的項不是放在B2 而是放在了B3, 此時它正好把B3填滿;
  • A2)當需要O(NlogN)的時候, 該算法對隨機的輸入表現得很好;

4.3)source code + printing results

  • 2.1)download source code: https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter10/p273_bestFit
  • 2.2)source code at a glance:(for complete code , please click the given link above)
void bestFix(double key) {int i;ElementTypePtr box;ElementTypePtr temp;double minimum;int miniIndex;box = buildSingleElement();box->key = key; // build single box with key overminiIndex = 0;minimum = 1.0;for(i=0; i<size; i++){if(surplus[i] < key)continue;if(surplus[i] - key < minimum){minimum = surplus[i] - key;miniIndex = i;}}temp = boxes[miniIndex] ;while(temp->next) temp = temp->next;temp->next = box;surplus[miniIndex] -= key; }
  • 2.3)printing results:

轉載于:https://www.cnblogs.com/pacoson/p/5005289.html

總結

以上是生活随笔為你收集整理的近似装箱问题(三种联机算法实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。