簡體   English   中英

如何按價格和速度在二維中對100個汽車圖像的10 x 10網格進行排序?

[英]How can I sort a 10 x 10 grid of 100 car images in two dimensions, by price and speed?

這是場景。

我有一百個汽車物體。 每輛車都有速度屬性和價格屬性。 我想將汽車的圖像排列在網格中,以便最快和最昂貴的汽車在右上角,最慢和最便宜的汽車在左下角,所有其他汽車都在網格中的適當位置。

我需要使用哪種排序算法,您有什么建議嗎?

編輯:結果並不需要是精確的-實際上,我正在處理更大的網格,因此,如果汽車大致聚集在正確的位置就足夠了。

只是一個受Cantor先生啟發的想法:

  • 計算最大速度和最大價格
  • 將所有速度和價格數據標准化為范圍0..1
  • 為每輛車計算“距離”到最大可能值

根據a²+b²=c²,距離可能是

sqrt( (speed(car[i])/maxspeed)^2 + (price(car[i])/maxprice)^2 )

根據需要(視覺上)應用加權

  • 按距離對汽車分類
  • 將“最佳”汽車放置在“最佳”正方形中(在您的情況下,右上方)
  • 在鋸齒形中行走網格,並在已排序的列表中填充下一輛車

結果(鏡像,左上方最佳):

1 - 2   6 - 7
  /   /   /
3   5   8
| /
4

將此視為兩個問題:

1:生成排序列表2:將排序列表的成員放入網格

排序只是您更精確地定義規則的問題。 “最快和最昂貴的第一”無效。 首先是我的100,000英鎊的勞斯萊斯,最高時速120,還是我的強化迷你車,價格50,000英鎊,最高時速180?

得到您的清單后,您將如何填寫它? 首先和最后很容易,但是第二個去哪兒呢? 沿着頂部還是向下? 那么接下來沿着行,沿着列,之字形的位置是什么? 您必須決定。 之后,編碼應該很容易。

我想您想要的是將具有“相似”特征的汽車聚集在附近,此外,成本通常會向右增加,而速度通常會向上增加。

我會嘗試以下方法。 假設您有N輛汽車,並且想要將它們放在X * Y網格中。 假設N == X *Y。

  1. 將所有N輛汽車放在隨機位置的網格中。
  2. 定義一個度量來計算網格中的總錯序; 例如,計算汽車對C1 =(x,y)和C2 =(x',y')的數量,以使C1.speed> C2.speed但y <y'加上汽車對C1 =(x,y)並且C2 =(x',y')使得C1.price> C2.price但x <x'。
  3. 運行以下算法:
    1. 計算當前的失序指標M
    2. 枚舉網格中所有成對的汽車,並計算出交換汽車后獲得的誤序度量M'
    3. 交換對度量值降低最大的那對汽車(如果發現)
    4. 如果交換了兩輛車,請從步驟1開始重復

這是解決優化問題的標准“本地搜索”方法。 您這里擁有的基本上是一個簡單的組合優化問題。 另一種嘗試的方法可能是使用自組織映射(SOM),該矩陣具有預先設置的速度和成本梯度。

基本上,您必須采用速度或價格中的一種作為主要值,然后獲得具有與該主要值相同的值的汽車,並按升/降序對這些值進行排序,並且根據需要,還按升/降序來選擇主值。

例:

c1(20,1000)c2(30,5000)c3(20,500)c4(10,3000)c5(35,1000)

讓我們假設汽車(速度,價格)為上面列表中的度量,而主要是速度。

1以最小速度開車

2然后獲得所有具有相同速度值的汽車

3按照車價升序排列這些值

4以下一個最小速度值獲得下一輛汽車,並重復上述過程

c4(10,3000)
c3(20,500)
c1(20,1000)
c2(30,5000)
c5(35,1000)

如果您發布使用的語言,這將對我們有所幫助,因為某些語言結構使此操作更容易實現。 例如,LINQ使您在這種情況下的生活變得非常輕松。

cars.OrderBy(x => x.Speed).ThenBy(p => p.Price);

編輯:

現在,您已經獲得了列表,按照將這些汽車項目放入網格的方式進行,除非您知道會有如此多的預定汽車具有這些值,否則您將無法像預期的那樣使用固定的網格大小進行任何操作現在。

一種選擇是使用不均勻的網格,如果願意,每行都有特定速度的汽車項目,但這僅在您知道會有相當數量的汽車具有相同速度值時才適用。

因此,每一行將具有網格中顯示的相同速度的汽車。

謝謝

10x10約束是否必要? 如果是這樣,則您必須具有十種速度和十種價格,否則該圖將沒有太大意義。 例如,如果最快的汽車不是最昂貴的汽車會發生什么?

我寧願建議您使網格大小等於

  (number of distinct speeds) x (number of distinct prices), 

那么這將是一個(相當)簡單的通過兩個軸進行排序的情況。

如果數據源自數據庫,則應在從數據庫中獲取數據時對其進行排序。 這僅意味着在查詢末尾但在LIMIT部分之前添加ORDER BY speed, price (其中“ speed”和“ price”是相應字段的名稱)。

正如其他人所說,“最快和最昂貴”是一件很難的事情,您應該只選擇一個首先進行排序。 但是,可以使用以下算法進行近似:

  1. 找到最高的價格和最快的速度。
  2. 將所有價格和速度標准化為例如1的分數。您可以通過將價格除以在步驟1中找到的最高價格來實現。
  3. 將標准化的價格和速度相乘在一起,以創建一個“價格和速度”數字。
  4. 按此數字排序。

這確保了汽車A比汽車B更快,更昂貴,並且在清單上名列前茅。 一個值較高而另一個值較低的汽車將被粗略排序。 我建議將這些值存儲在數據庫中,並根據您的選擇進行排序。

將它們放在10x10的網格中很容易。 開始輸出項目,當達到10的倍數時,開始新的一行。

另一種選擇是對每輛汽車應用0 .. 200%的分數,並按該分數排序。

例:

score_i = speed_percent(min_speed, max_speed, speed_i) + price_percent(min_price, max_price, price_i)

嗯...這里的氣泡排序可能是簡單的算法。

  1. 制作一個10x10的隨機數組。
  2. 找到兩個“順序錯誤”的鄰居(水平或垂直),並交換它們。
  3. 重復(2),直到找不到此類鄰居。

當以下兩個元素處於“錯誤順序”時:a)它們是水平鄰居,左一個元素比右元素慢,b)它們是垂直鄰居,而上一個元素比下一個元素便宜。

但是我實際上不確定該算法是否對每個數據都停止。 我幾乎可以肯定它非常慢:-)。 它應該易於實現,並且經過有限次數的迭代后,部分結果可能足以滿足您的目的。 您也可以使用此處提到的其他方法之一開始生成數組。 而且,它將保持您在陣列形狀上的條件。

編輯:現在證明任何東西為時已晚,但是我在python中做了一些實驗。 看起來可以在幾秒鍾內以這種方式對100x100的隨機數組進行排序,而我總是設法獲得完整的2d排序(也就是說:最后,我得到了錯誤排序的鄰居)。 假設OP可以預先計算該數組,那么他可以將任意數量的汽車放入數組中並得出明智的結果。 實驗代碼: http ://pastebin.com/f2bae9a79(您需要matplotlib,我也建議使用ipython)。 iterchange是那里的排序方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM